Generatore onde sinusoidali con stranezze

Progetti Arduino
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Generatore onde sinusoidali con stranezze

Messaggio da Guido »

Ho voluto cimentarmi nel codice per generare una semionda sinusoidale sul pin 5 e un'altra semionda nel pin 6. L'idea e' quella di mandare poi queste due semionde a due BJT-Mosfet collegati al primario con presa centrale di una trasformatore in modo da creare un UPS sinusoidale con uscita 230 volt.
Qui c'e' il codice:
https://drive.google.com/file/d/1S8eUb6 ... sp=sharing
Ho cambiato l'estensione .ino in .txt cosi' puo' essere visionato con Notepad
L'array e' stato preso da un sorgente di PierAisa, ma l'ho cancellato in parte perche' era molto lungo (312 valori per semionda).
Il codice funziona perfettamente finche' lascio la istruzione seguente per tracciare sul plotter seriale le sinusoidi:
Serial.println(sinPWM); // stampa i valori su seriale
Le semionde sono perfette sia su Plotter seriale sia su oscilloscopio, ma sono lente anche perche' ci sono le suddette istruzioni Serial.print dopo l'elaborazione di ogni valore contenuto nell'array :
https://drive.google.com/file/d/1XyUyKq ... sp=sharing
Ma appena cancello o disabilito con il segno di commento // le suddette istruzioni per avere una velocita' accettabile ottengo delle onde caotiche:
https://drive.google.com/file/d/1KOINkw ... sp=sharing

Ho provato ad accorciare l'array (mettendo la meta' dei passi) senza risultato.
Da 4 giorni non riesco a risolvere questo problema, grazie a chi suggerira' qualcosa.
PS il processore e' ATmega 2560: sfoltendo l'array ad un numero minore di passi pensate che si possa ottenere 50 Hz (cioe' una onda intera ogni 20 mS) su Arduino Nano ?
PS PS ovviamente quello che vedo sull'oscilloscopio non sono le sinusoidi, ma le onde quadre che costituiscono il segnale PWM. Invece sul Plotter seriale di Arduino le sinusoidi sono perfette, quando lascio le istruzioni che ho detto.
Ultima modifica di Guido il mar 16 giu 2020, 18:23, modificato 1 volta in totale.
Avatar utente
Maxvarese
Messaggi: 1958
Iscritto il: mar 9 apr 2019, 23:53

Re: Generatore onde sinusoidali con stranezze

Messaggio da Maxvarese »

Come è fatto l'hardware? Il filtro RC ?
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: Generatore onde sinusoidali con stranezze

Messaggio da Guido »

Pensavo di aver detto tutto, invece non ho detto che per il momento ho preso i segnali dall'Arduino nudo e crudo, collegando i puntali dell'oscillo direttamente sui pin. Faccio inoltre una correzione sul precedente messaggio: quello che vedo sull'oscilloscopio non sono le sinusoidi, ma le onde quadre che costituiscono il segnale PWM. Invece sul Plotter seriale di Arduino le sinusoidi sono perfette, quando lascio le istruzioni che ho detto.
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: Generatore onde sinusoidali con stranezze

Messaggio da Guido »

Ho voluto sfoltire l'array ed ho messo una filtro RC sui pin 5 e 6 di Arduino, filtri quasi copiati di sana pianta dal video di PierAisa #367 : io ho usato condensatore da 33uF e resistenza da 47 ohm invece del condensatore da 27 uF e resistenza da 50 ohm. Cosi' l'opera di saccheggio del lavoro di Pier Aisa e' completa :-)
L'array adesso ha la meta' degli elementi rispetto all'array originale di Pier Aisa.
Qui ho messo il codice completo, cosi' se qualcuno volesse provarlo basta che cambi l'estensione .txt in .ino:
https://drive.google.com/file/d/1N_kqU5 ... sp=sharing

Come nel mio precedente messaggio se lascio le istruzioni di stampa sul monitor seriale
Serial.println(sinPWM) ottengo sinusoidi perfette grazie al filtro RC:
https://drive.google.com/file/d/1SldA4A ... sp=sharing
pero' sempre a causa delle suddette istruzioni Serial.Print un ciclo dura 120 mS invece dei 20 mS desiderati.

Se tolgo le istruzioni Serial.println(sinPWM) ottengo una schifezza:
https://drive.google.com/file/d/18TeTEm ... sp=sharing

Ma il serial monitor mi dice che un ciclo dura 8 mS ma non so che attendibilita' abbia questa misura visto il caos che appare all'oscillo.
Chi avesse qualche idea ... grazie
apollokid
Messaggi: 74
Iscritto il: lun 27 lug 2020, 14:36

Re: Generatore onde sinusoidali con stranezze

Messaggio da apollokid »

Ciao, secondo me il problema è che scrivendo su seriale stai indirettamente rallentando il thread di esecuzione con pause abbastanza costanti per ogni print che dipendono dai baud di velocità della seriale, non appena le togli dovresti fare te il calcolo delle pause per gestire correttamente gli stati alto e basso del PWM (non sono ancora un grande esperto ma ricordo di aver letto sul libro "Arduino progetti e soluzioni" della Orelly che se si scende sotto a certi valori di temporizzazione la funzione delay non va più bene e bisogna utilizzare le interrupt)
drpaolo
Messaggi: 73
Iscritto il: sab 14 mar 2020, 10:14

Re: Generatore onde sinusoidali con stranezze

Messaggio da drpaolo »

...se si scende sotto a certi valori di temporizzazione la funzione delay non va più bene e bisogna utilizzare le interrupt
.

Concordo; io non uso il micro che usa Arduino, ma il set di istruzioni (RISC) è simile in moltissimi micro.

Per avere un'onda sinusoidale stabile a partire da PWM per frequenze nemmeno troppo alte, bisognerebbe usare le porte abilitate al conteggio, dotate di proprii registri di programmazione e di proprio interrupt.

In questa maniera si ottengono sinusoidi molto pulite, indipendentemente dal task che il micro sta eseguendo in parallelo (comunicazione seriale, lettura di tasti, ecc.).

Io riesco ad ottenere sinusoidi con distorsione < 1% con risoluzione adeguata; devo scrivere un po' di righe in assembler da inserire all'interno del compilatore di linguaggio strutturato che uso. I datasheet dei micro sono però piuttosto dettagliati, sull'argomento.
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: Generatore onde sinusoidali con stranezze

Messaggio da Guido »

Quindi se ho ben capito il codice di generazione dei segnali pwm dovrebbe essere sotto interrupt ?
Provero' appena avro' un po' di tempo. Il problema che ho descritto piu' su' si e' dimostrato un po' piu' complicato del previsto perche' ho posto il quesito sul forum inglese di Arduino.cc . Ho trovato due persone molto gentili che mi hanno proposto il loro codice, ma anche i loro codici non funzionavano correttamente. Mi e' venuto anche il dubbio che il mio Arduino/clone Elegoo Mega2560 avesse un problema ma ho provato con un Arduino originale senza miglioramenti. Ho provato poi a generare segnali pseudo-PWM con temporizzazioni sulle porte digitali ma anche li' usciva una onda caotica. Ho posto un quesito su problemi matematici sorti con quest'ultimo codice, e relativi quindi al linguaggio C, sul forum Arduino.cc in italiano: ho trovato persone disponibili ma anche dei gran cafoni presuntuosi ed ho lasciato perdere . A questo punto potrei utilizzare il codice pronto ed utilizzare il codice di Pier Aisa, ma volevo fare qualcosa di personale per imparare. Ma per il momento ho accantonato questo progetto.
Ultima modifica di Guido il mer 29 lug 2020, 0:36, modificato 1 volta in totale.
apollokid
Messaggi: 74
Iscritto il: lun 27 lug 2020, 14:36

Re: Generatore onde sinusoidali con stranezze

Messaggio da apollokid »

Ripeto, non sono purtroppo ancora molto esperto di Arduino però nel libro che ti dicevo c'è un intero capito che tratta proprio questi argomeni legati aila generazione di segnali PWM.
Ho visto che usa molto spesso queste due librerie:
https://playground.arduino.cc/Code/Timer1/
https://playground.arduino.cc/Main/MsTimer2/
Si spinge poi anche nell'uso diretto dei registri, diciamo però che sono cose che è giusto sapere che esistono ma poi uno se le va ad approfondire solo quando servono ed a me fin'ora non sono servite.

Nel tuo caso l'idea di generare un inverter con onda sinusoidale l'ho trovata molto interessante, nella mia ignoranza penso che dovrebbe essere un metodo migliore rispetto a quello di usare un'onda quadra PWM per alimentare un trasformatore, il grafico con l'oscilloscopio però che avevi allegato non era di una sinusoide ma di un'onda quadra ad ampiezza variabile e questo mi aveva lasciato un po' spiazzato, anche perchè i PIN5 e 6 mi risulta che siano output digitali e non analogici. Sbaglio? Io poi pensavo che nell'array sinPWM tu avessi memorizzato i valori di tensione analogica già normalizzati per evitare di spendere tempo nel calcolare ad ogni iterazione una moltiplicazione ed una funzione trigonometrica. E' così?
In ogni caso quel tipo di modulazione l'ho già vista usata da qualche parte negli inverter ma ancora la devo comprendere.
Poi magari non ho capito bene quello che volevi fare perchè io so usare (parola grossa) solo i transistor BJT e mi sono immaginato che tu volessi utilizzare l'onda sinusoidale come input di un circuito amplificatore.
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: Generatore onde sinusoidali con stranezze

Messaggio da Guido »

apollokid ha scritto: mar 28 lug 2020, 22:14
Nel tuo caso l'idea di generare un inverter con onda sinusoidale l'ho trovata molto interessante, nella mia ignoranza penso che dovrebbe essere un metodo migliore rispetto a quello di usare un'onda quadra PWM per alimentare un trasformatore, il grafico con l'oscilloscopio però che avevi allegato non era di una sinusoide ma di un'onda quadra ad ampiezza variabile e questo mi aveva lasciato un po' spiazzato, anche perchè i PIN5 e 6 mi risulta che siano output digitali e non analogici. Sbaglio? Io poi pensavo che nell'array sinPWM tu avessi memorizzato i valori di tensione analogica già normalizzati per evitare di spendere tempo nel calcolare ad ogni iterazione una moltiplicazione ed una funzione trigonometrica. E' così?
In ogni caso quel tipo di modulazione l'ho già vista usata da qualche parte negli inverter ma ancora la devo comprendere.
Poi magari non ho capito bene quello che volevi fare perchè io so usare (parola grossa) solo i transistor BJT e mi sono immaginato che tu volessi utilizzare l'onda sinusoidale come input di un circuito amplificatore.
Grazie per la segnalazione di queste due librerie, appena riprendero' in mano il progetto Arduino le provero'. Io inserito in questo thread anche un messaggio che riporta le onde sinusoidali risultanti dopo filtraggio passa basso RC, come ci ha insegnato PierAisa, e vedi tutto nel mio messaggio del
17-06-2020, dove e' mostrato anche il caos che viene fuori appena tolgo le istruzioni serial.print. Nell'array ho memorizzato i valori pwm (per es. 255 ampiezza high per tutto il periodo 127 high per un 1/2 periodo poi low per altri 1/2 periodo) (PORCA MISERIA ! non ho messo le temporizzazioni che indicano la lunghezza di un periodo: il periodo era quindi determinato dai tempi del comando serial.print; ma forse avevo provato ad inserirli devo riguardare i codici vari sparsi nel mio PC)

Qui c'e' lo schema di principio del circuito come e' nella mia idea: ovviamente quando inseriro' i BJT il filtro RC andra' tolto in quanto fara' da filtro l'induttanza del trasformatore, e forse andranno messi filtri sui collettori del BJT e diodi di protezione :
https://forum.arduino.cc/index.php?acti ... ach=372157
I pin 5-6 di Arduino Mega ed Uno, se ben ricordo possono svolgere la funzione di out digitale ed out PWM, quindi si possono usare in entrambi i modi.
L'array l'ho preso da un video di Pier Aisa, come c'e' scritto nel sorgente del codice che ho allegato nel mio primo messaggio
ad ogni modo il codice era mostrato in questo video di PierAisa:
https://www.youtube.com/watch?v=BWouNZAFWG0
apollokid
Messaggi: 74
Iscritto il: lun 27 lug 2020, 14:36

Re: Generatore onde sinusoidali con stranezze

Messaggio da apollokid »

Proverò a guardarmi meglio il video che hai postato ed a cercare altro materiale a riguardo così da farmi un po' di cultura.
Posso approfittare di te e provare a togliermi una curiosità? Perchè si preferisce generare un segnale PWM e poi filtrare le armoniche anzicchè generare direttamente la sinusuoide attraverso l'uscita analogica da amplificare poi con un amplificatore audio?
Sicuramente ci sono dei motivi ma al momento mi sfuggono, posso solo ipotizzare che sia più semplice il circuito di amplificazione piuttosto che la sinusoide filtrata dalle componenti armoniche risulti alla fine più pulita e continua rispetto a quella generata con il DAC che per forza di cose ha una forma più o meno scalettata in funzione del numero di bit di risoluzione.
Rispondi