This shows you the differences between two versions of the page.
|
pm:prj2026:florin.stancu:ianis.opritescu [2026/05/09 17:00] ianis.opritescu [1.3 Ideea de la care am pornit] |
pm:prj2026:florin.stancu:ianis.opritescu [2026/05/24 14:32] (current) ianis.opritescu [Jurnal] |
||
|---|---|---|---|
| Line 24: | Line 24: | ||
| ^ Componentă ^ Specificații Tehnice ^ Cantitate ^ Rol în Proiect ^ | ^ Componentă ^ Specificații Tehnice ^ Cantitate ^ Rol în Proiect ^ | ||
| | **Microcontroler** | ATmega328P | 1 | Creierul sistemului, sinteză DDS | | | **Microcontroler** | ATmega328P | 1 | Creierul sistemului, sinteză DDS | | ||
| - | | **Display** | OLED 0.96" I2C (SSD1306) | 1 | Feedback vizual parametri ADSR/Wave | | + | | **Display**((https://sigmanortec.ro/Display-OLED-1-3-Alb-128x64-p136081872)) | OLED 0.96" I2C (SSD1306) | 1 | Feedback vizual parametri ADSR/Wave | |
| - | | **Amplificator** | PAM8403 Stereo 2x3W | 1 | Amplificare semnal audio la nivel de boxe | | + | | **Amplificator**((https://sigmanortec.ro/modul-amplificator-miniatura-pam8403-22-5v)) | PAM8403 Stereo 2x3W | 1 | Amplificare semnal audio la nivel de boxe | |
| - | | **Potențiometre** | 10kΩ Liniare (B10K) | 5 | Control Attack, Decay, Sustain, Release, Pitch | | + | | **Potențiometre**((https://sigmanortec.ro/Potentiometru-1K-5K-10K-20K-50K-100K-p136286400)) | 10kΩ Liniare (B10K) | 5 | Control Attack, Decay, Sustain, Release, Pitch | |
| - | | **Buton** | Momentary Push-Button 16mm | 1 | Selectare formă de undă (Cycle waveforms) | | + | | **Difuzoare**((https://sigmanortec.ro/Speaker-40mm-3W-p134573662)) | 4Ω, 3W, 40mm | 2 | Redare audio stereo | |
| - | | **Difuzoare** | 4Ω, 3W, 40mm | 2 | Redare audio stereo | | + | |
| | **Rezistență** | 1kΩ | 1 | Parte a filtrului Low-Pass (RC) | | | **Rezistență** | 1kΩ | 1 | Parte a filtrului Low-Pass (RC) | | ||
| | **Condensator** | 100nF (Ceramic 104) | 1 | Filtrare zgomot PWM (Filtru RC) | | | **Condensator** | 100nF (Ceramic 104) | 1 | Filtrare zgomot PWM (Filtru RC) | | ||
| | **Condensator** | 10μF (Electrolitic) | 1 | Cuplaj audio (DC Blocking) | | | **Condensator** | 10μF (Electrolitic) | 1 | Cuplaj audio (DC Blocking) | | ||
| | **Condensator** | 1000μF (Electrolitic) | 1 | Stabilizare alimentare amplificator | | | **Condensator** | 1000μF (Electrolitic) | 1 | Stabilizare alimentare amplificator | | ||
| - | | **Switch** | MTS-102 Toggle (Metal) | 1 | Pornire/Oprire generală | | + | | **Switch**((https://sigmanortec.ro/Intrerupator-3A-250V-Switch-MTS-102-p140901357)) | MTS-102 Toggle (Metal) | 1 | Pornire/Oprire generală | |
| - | | **PCB** | Prototipare FR4 4x6cm | 2 | Suport mecanic și electric componente | | + | | **PCB**((https://sigmanortec.ro/Placa-PCB-prototipare-fata-dubla-4x6cm-p211619088)) | Prototipare FR4 4x6cm | 2 | Suport electric componente | |
| + | | **Modul convertor USB la TTL**((https://sigmanortec.ro/modul-convertor-usb-la-ttl-ch340-msop10-type-c-33-5v)) | CH340 | 1 | Adaptor la alimentare circuit | | ||
| + | | **Modul USB 2.0 la TTL UART**((https://sigmanortec.ro/Modul-Convertor-serial-USB-2-0-la-TTL-UART-CP2104-STC-PRGMR-p136248993)) | CP2104 | 1 | Convertor serial | | ||
| - | ===== 2.2 Schema Electrică ===== | + | ===== 2.2 Schema Bloc ===== |
| - | + | ||
| - | Designul electric se bazează pe distribuția paralelă a tensiunii de 5V către modulele digitale și analogice. | + | |
| - | + | ||
| - | **Configurația pinilor ATpega328P:** | + | |
| - | * **Pini Analogici (A0 - A3, A6):** Conectați la pinii centrali (Wiper) ai celor 5 potențiometre pentru citirea ADC. | + | |
| - | * **Pini I2C (A4 - SDA, A5 - SCL):** Conectați la display-ul OLED. | + | |
| - | * **Pin Digital D2:** Intrare pentru buton (folosește întreruperea externă INT0). | + | |
| - | * **Pin Digital D9 (PWM):** Ieșirea audio principală către lanțul de filtrare. | + | |
| - | + | ||
| - | {{ :pm:prj2026:florin.stancu:schema_bloc_sintetizator_ianis.jpg?nolink&800 |}} | + | |
| - | + | ||
| - | ===== 2.3 Lanțul de Semnal și Diagrame ===== | + | |
| Sunetul este generat digital prin PWM (Pulse Width Modulation) la o frecvență purtătoare înaltă. Pentru a obține un semnal audio analogic curat, semnalul parcurge următorul traseu: | Sunetul este generat digital prin PWM (Pulse Width Modulation) la o frecvență purtătoare înaltă. Pentru a obține un semnal audio analogic curat, semnalul parcurge următorul traseu: | ||
| - | * **Generare:** Pinul D9 scoate un semnal PWM cu duty cycle variabil. | + | * **Generare:** Pinul PB1 scoate un semnal PWM cu duty cycle variabil. |
| * **Filtrare Low-Pass (RC):** Rezistența de 1kΩ împreună cu condensatorul de 100nF formează un filtru care elimină frecvența purtătoare a PWM-ului. | * **Filtrare Low-Pass (RC):** Rezistența de 1kΩ împreună cu condensatorul de 100nF formează un filtru care elimină frecvența purtătoare a PWM-ului. | ||
| * **DC Blocking:** Condensatorul de 10μF elimină componenta de curent continuu (offset de 2.5V), lăsând să treacă doar unda audio (AC). | * **DC Blocking:** Condensatorul de 10μF elimină componenta de curent continuu (offset de 2.5V), lăsând să treacă doar unda audio (AC). | ||
| * **Amplificare:** Semnalul filtrat intră în pinii L-IN și R-IN ai PAM8403. | * **Amplificare:** Semnalul filtrat intră în pinii L-IN și R-IN ai PAM8403. | ||
| + | |||
| + | **Configurația pinilor ATmega328P:** | ||
| + | * **Pini Analogici (PC0 - PC3, ADC6):** Conectați la pinii centrali ai celor 5 potențiometre pentru citirea ADC. | ||
| + | * **Pini I2C (PC4 - SDA, PC5 - SCL):** Conectați la display-ul OLED. | ||
| + | * **Pin PD2:** Intrare pentru buton (folosește întreruperea externă INT0). | ||
| + | * **Pin PB1 (PWM):** Ieșirea audio principală către lanțul de filtrare. | ||
| + | |||
| + | {{ :pm:prj2026:florin.stancu:schema_bloc_sintetizator_ianis1.jpg?800 |}} | ||
| + | |||
| + | ===== 2.3 Schema Electrică ===== | ||
| + | |||
| + | {{ :pm:prj2026:florin.stancu:schematic-pm-ianis.png?800 |}} | ||
| + | |||
| ===== 2.4 Rezultatele simulării și Calcule ===== | ===== 2.4 Rezultatele simulării și Calcule ===== | ||
| Line 73: | Line 75: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| + | ==== Motorul de Sinteza (synth.c / synth.h) ==== | ||
| + | Nucleul audio foloseste **Direct Digital Synthesis (DDS)** cu un tabel sinus de 256 esantioane stocat in **PROGMEM** (Flash), economisind cei 2 KB de SRAM disponibili. Fiecare din cele 4 voci polifonice utilizeaza un acumulator de faza pe 16 biti, al carui byte superior indexeaza direct tabelul — eliminand orice calcul trigonometric la runtime. | ||
| + | Generarea esantioanelor se face in **ISR(TIMER1_OVF_vect)** la 31250 Hz (Fast PWM 9-bit), avand un buget strict de ~512 cicluri CPU. Toata aritmetica foloseste **fixed-point Q8.8** si operatii pe intregi — fara virgula mobila. Mixarea vocilor, aplicarea envelope-ului ADSR si scalarea volumului se reduc la inmultiri si shift-uri pe 16/32 biti, mentinand ISR-ul sub 200 cicluri (~39% din buget). | ||
| + | Envelope-ul ADSR este avansat separat la 1 kHz prin **ISR(TIMER2_COMPA_vect)** via ''adsr_tick_voice()'', decupland rata lenta a modulatiei de amplitudine de rata rapida de esantionare. | ||
| + | Alocarea vocilor foloseste o strategie in trei pasi: re-trigger daca nota este deja activa, alocare voce libera (IDLE), sau **voice stealing** bazat pe varsta relativa (scadere modulara ''uint8_t''). | ||
| + | Semnalul PWM porneste centrat la 50% duty (''PWM_CENTER=255''), generand 0V DC prin condensatorul de cuplaj si eliminand pocniturile la pornire. | ||
| + | ==== Comunicatia USART (usart.c / usart.h) ==== | ||
| + | Receptia este **polling non-blocant** (''USART0_available()'' + ''USART0_read()''), evitand overhead-ul unui ISR suplimentar care ar concura cu ISR-urile audio. Transmisia este blocanta per-caracter. | ||
| + | ==== ADC si Parametri (adc.c / main.c) ==== | ||
| + | Citirea celor 5 potentiometre (Attack, Decay, Sustain, Release, Volume) se face prin polling la intervale rare, folosind un contor uint8_t cu overflow natural la 256 iteratii — evitand un timer dedicat. Valorile ADC sunt convertite in rate Q8.8 prin ''calc_rate()'' si aplicate atomic (cu ''cli()/sei()''). | ||
| + | ==== Interfata Python (piano.py) ==== | ||
| + | Scriptul ''PianoController'' ruleaza pe Linux fara dependinte grafice, folosind **termios raw mode** pentru detectia tastelor cu latenta minima. Un mecanism de **auto-release cu timere per-nota** (''_schedule_release()'') simuleaza key-up din terminal, care nu ofera nativ acest eveniment. Comunicatia seriala este protejata de un ''threading.Lock'', iar un thread daemon dedicat (''serial_reader_thread()'') citeste asincron raspunsurile de la ATmega. | ||
| - | <note tip> | + | <html><a href="https://github.com/ianisopritescu/PM_Soft_Synth">Repo Github cod</a></html> |
| - | Descrierea codului aplicaţiei (firmware): | + | |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | |
| - | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
| - | * (etapa 3) surse şi funcţii implementate | + | |
| - | </note> | + | |
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| Line 98: | Line 105: | ||
| </note> | </note> | ||
| - | ===== Jurnal ===== | ||
| - | |||
| - | <note tip> | ||
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
| - | </note> | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| Line 111: | Line 113: | ||
| <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||
| + | |||
| + | <html><a href="https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf">Datasheet Atmega328P</a></html> | ||