Generator semnal 15kHz (SIN, SAW, RAMP, SQUARE, PWM)

 

STM8L-DISCOVERY

Acesta este un generator de semnal cu 1 canal cu frecventa maxima de 15kHz (limitat de viteza DAC-ul intern al microcontrollerului), care se poate construi cu costuri relativ reduse.

Acest proiect are ca baza hardware placa de dezvoltare de la ST STM8L-DISCOVERY si cateva componente externe.

Aceasta placa de dezvoltare vine cu programator/debugger si cu un ecran LCD si se poate achizitiona la un pret relativ mic (50RON cu tot cu TVA la momentul scrierii acestui articol) de la Farnell.
Mai multe despre aceasta placa de dezvoltare se poate vedea aici: STM8L-DISCOVERY Inceputul proiectului a fost application note-ul ST AN3252: "Building a wave generator using STM8L-DISCOVERY" care a fost adaptat si modificat pentru a fi mai practic.
Ca si mediu de dezvoltare am folosit STVD (mediu de dezvoltare si debug gratuit de la ST) si compilatorul de la Cosmic pentru STM8 32K (licenta gratuita pe un an de zile).

Componente externe placii de dezvoltare

  • 4 butoane externe (alegere forma de unda si modificare frecventa)
  • 1 potentiometru pentru controlul amplitudinii semnalului de iesire
  • 1 LED care semnalizeaza distorsiunea semnalului de iesire
  • 1 buc LM358 si cateva rezistente (folosit la amplificarea semnalului generat de DAC care este de maxim 3V)
  • alimentare externa 5-12V pentru alimentare placa STM8L-DISCOVERY si amplificator operational LM358 (la alegerea tensiunii de alimentare aveti grija sa nu depasiti valoarea maxima a tensiunii admisa de regulatorul de 3,3V de pe placa de dezvoltare si de LM358)

Functionalitate butoane

  • Buton 1: Creste frecventa
  • Buton 2: Scade frecventa
  • Buton 3: Schimbare forma de unda (SIN, RAMP, SAW, SQUARE, PWM)
  • Buton 4: Schimbare Duty Cycle/Frequency cand ne aflam in modul de generare PWM

Potentiometru extern

Regleaza amplitudinea semnalului de iesire (incepand cu 3V) prin amplificarea semnalului generat de DAC (domeniu de amplificare: 1X-6X setat din rezistentele din jurul LM358). Daca amplitudinea ceruta este prea mare comparativ cu tensiunea de alimentare, semnalul generat va fi distorsionat si acest lucru este semnalizat prin aprinderea LED-ului de distorsiune. Folosind au amplificator operational LM358 si o tensiune externa de 12V am obtinut un semnal de iesire de 10,5V fara distorsiuni.

LED distorsiune

Acest LED se aprinde cand amplitudinea ceruta a semnalului de iesire este prea mare comparativ cu tensiunea externa de alimentare caz in care semnalul de iesire va fi distorsionat.

Ecran LCD

(este ecranul cu care vine echipata placa de dezvoltare)

Pe ecranul LCD este afisata informatie legata de semnalul generat: forma de unda, frecventa si amplitudune in modul urmator: Cand se apasa butonul de schimbare forma de unda, pe ecran este afisata forma de unda curenta (SIN, SAW, RAMP, SQUARE, PWM). Cand se apasa butonul de crestere/desrestere frecventa pe ecran se afiseaza frecventa curenta a semnalului generat. Cand se actioneaza asupra potentiometrului de setare a amplitudinii pe ecran se afiseaza amplitudinea curenta a semnalului.

Generare semnal

Toate semnalele sunt generate cu ajutorul DAC-ului din microcontroller folosindu-ma de mecanismul DMA. Din cauza ca DAC-ul este de maxim 1Msps am folosit cate doua tabele de valori pentru semnale. Pentru frecventa mai mica generez semnalul folosindu-ma de 130 sample-uri pe perioada, iar la frecventa mai mare folosesc un tabel cu 65 de sample-uri pe perioada. La 15kHz si 65 de sample-uri pe perioada se trimit spre DAC de catre DMA 975000 de sample-uri in fiecare secunda.

Schema electrica

schema generator de semnal 15 KHz

Schema descrie modul de conectare si valorile componentelor exterioare la placa de dezvoltare. JP2 este mufa unde vine legata alimentarea exterioara. Aceasta tensiune am trecut-o printr-o dioda shottky si am legat-o direct la iesirea stabilizatorului de 3.3V de pe placa de dezvoltare (pinul 3 al circuitului LD1117S33TR). Schema placii de dezvoltare se poate gasi pe pagina producatorului, aici. Daca va uitati pe schema placii, exista o dioda intre alimentarea de 5V din mufa usb de pe placa si intrarea in regulatorul de 3.3V, deci nu ar trebui sa fie probleme cand placa este legata la PC prin cablul USB si in acelasi timp este alimentata si extern.

Divizorul format din R6-R7 aduce la un nivel mai mic tensiunea de alimentare externa ca sa poata fi citita cu ADC microcontrollerului (nivel 0-3.3V).  Tensiunea externa maxima, la care iesirea divizorului este de 3.3V este de 13.83V. O tensiune de intrare mai mare decat aceasta va face sa circule un curent prin dioda de protectie din port, cea spre VDD. Aceasta citire este necesara pentru functia de detectare distorsiune semnal. 

Potentiometrele R2 si R3 sunt de fapt un potentiometru "stereo", actionate concomitent de acelasi ax. Doar R3 este folosit pentru amplificarea semnalului care iese din DAC (0-3.3V(VDD)). R2 va amplifica tensiunea de 3.3V(VDD, care este Vpeak generat de DAC) si iesirea este masurata de ADC prin divizorul R8-R9. Cand iesirea amplificatorului operational IC1B se apropie la mai putin de 2V de tensiunea de alimentare, LED-ul se va aprinde, semnaland distorsiunea semnalului generat de amplificator. Logica acestui lucru este urmatoarea: indiferent de semnalul generat, DAC-ul va scoate semnal "full range", de la 0 la 3.3V(VDD) pentru ca asa sunt definite tabele semnalelor, adica Vpeak al semnalului va fi 3.3V. Acesta va fi amplificat, dar daca cererea de amplificare este prea mare, semnalul va fi taiat (limitat) in partea de sus din ce in ce mai mult, pentru ca amplificatorul operational nu poate genera tensiuni mai mari decat tensiunea la care este alimentat (la LM358AN pe care l-am avut eu, pentru 12V alimentare iesirea nu putea urca mai mult de 10.5V). O sa avem aceeasi amplificare setata pentru cele doua amplificatoare operationale pentru ca potentiometrul nostru este "stereo" si modifica R2 si R3 la fel de mult. Iesirea AO-ului IC1B o sa-mi dea practic Vpeak a semnalului generat de IC1A pe care il masor si il compar cu tensiunea de alimentare. Cand Vpreak se apropie prea mult de tensiunea de alimentare aprind LED-ul de distorsiune. Daca nu as fi facut asa ar fi trebui sa masor cu ADC-ul direct semnalul generat amplificat si sa-i aflu tensiunea de varf (Vpeak) ceea ce nu am reusit sa fac satisfacator mai ales cand frecventa semnalului era destul de mare.

In schema apar notatiile: +3V3, PC7, PF0, PC4, PC1, PA1, PA2, PA3, PE6 si PE7. Acestea se regasesc pe conectorii pini ai placii de dezvoltare. 

In schema mai apare o rezistenta de 10k legata intre PA1 (RST) si +3V3. Aceasta rezistenta tine linia de RESET a microcontrollerului la 3.3V, nu il lasa sa intre in RESET. Fara acasta rezistenta, cateodata, microcontrollerul ramanea in RESET si aplicatia nu pornea.

Download

Fisierul s19 se poate programa cu utilitarul gratuit oferit de ST STVP.

Dezvoltari ulterioare

Toate formele de unda sunt generate de DAC-ul intern al microcontrollerului de pe placa (STM8L152). Am limitat frecventa maxima a semnalului generat la 15kHz. Pana la aceasta frecventa am considerat ca distorsiunile semnalului sunt intr-o marja acceptabila. Peste acasta frecventa viteza limitata a DAC-ului face ca semnalul generat sa fie din ce in ce mai distorsionat. Viteza limitata a DAC-ului se vede mai ales la semnale SQUARE sau PWM unde tranzitiile de la LOW la HIGH sau HIGH la LOW necesita o modificare maxima a iesirii DAC-ului intr-un timp scurt. Cum modificarea nivelului iesirii necesita un timp, aceste tranzitii se vad ca o panta pe osciloscop. Pe masura ce frecventa este crescuta, timpul necesar pentru ca iesirea DAC-ului sa creasca de la LOW la HIGH sau invers devine comparabil cu perioada semnalului si semnalul este din ce in ce mai distorsionat. Ar fi fost frumos ca pentru generarea semnalelor SQUARE si PWM sa se fi folosit un TIMER hardware din microcontroller configurat in mod generare PWM, caz in care s-ar fi putut obtine semnale cu frecventa de ordinul megahertzilor. Din pacate nu au mai fost pini liberi din cauza ca ecranul LCD ocupa foarte multi pini. Daca acest ecran ar fi inlocuit cu altul care necesita mai putini pini (de ex. unul compatibil HD44780) atunci s-ar mai elibera pini.