0367: PWM Sinusoidale con i Timer di Arduino

Поділитися
Вставка
  • Опубліковано 12 вер 2024
  • Forum: mylothehack.alt...
    Sito: mylothehack.alt...
    Sorgenti: mylothehack.alt...
    Banggood: www.banggood.c...
    Codice sconto Coupon: Elec
    Per ottenere un controllo PWM sinusoidale a 50Hz alla massima risoluzione possibile con Arduino uso i due timer a 8 bit, TIMER0 e TIMER1. La frequenza di switching massima ottenibile per il PWM è pari a 31.372KHz generata da TIMER1, in modalità CTC con un interrupt ad ogni impulso PWM per TIMER0, il quale imposta il valore della durata dell'impulso PWM. Un periodo di sinusoide a 50Hz ha 628 impulsi PWM. Per ricostruire i valori degli impulsi PWM della sinusoide a 50Hz utilizzo un programma sempre su Arduino che calcola il primo quarto della sinusoide, lo moltiplica per il range a 250. I valori vengono tabulati su un vettore, che viene poi usato a runtime per la modifica del valore di conteggio del TIMER0. Visualizzo i segnali con l'oscilloscopio e tramite due filtri passabasso RC ricostruisco effettivamente la sinusoide a 50Hz.

КОМЕНТАРІ • 52

  • @GianniLaschi
    @GianniLaschi 6 років тому +2

    Grande Pier, le funzioni hardware/registri/clock di Arduino non sono immediate da usare, ma questi tuoi video sono molto chiari, aiutano molto, Grazie!

    • @PierAisa
      @PierAisa  6 років тому +2

      Grazie Gianni. Mi sarebbe piaciuto anche commentare i registri di dettaglio con il datasheet alla mano, ma dopo il video rischiava di diventare anche un po' noioso ....

  • @michelelupi2614
    @michelelupi2614 6 років тому +1

    ti ringrazio per i tuoi utilissimi tutorial, ammiro la tua profonda conoscenza degli argomenti :)

  • @lemonfriz
    @lemonfriz 6 років тому +1

    molto interessante, non avevo pensato a questa soluzione con due forme d'onda opposte. Attendiamo la prova con i componenti di potenza!!!

    • @PierAisa
      @PierAisa  6 років тому

      Leo IT9GUR se si fa così si ha la cancellazione armonica e la prima armonica da sopprimere è 2 x f switching. Vedi ua-cam.com/video/EcitbW0OPGw/v-deo.html

  • @g4vrv
    @g4vrv Рік тому

    Ciao Pier, ho da poco scoperto i tuoi video è davvero complimenti anche per la semplicità con cui le spieghi.
    Tra i tuoi codici sorgente per caso hai anche una funzione che riesce a gestire i timer interni di arduino nano every? Attualmente uso una funzione su arduino uno per gestire il timer legato ai pin 9 e 10 per aumentare la frequenza ma mi è stato detto che la stessa non va bene in quanto il processore dei due è diverso.
    Grazie in anticipo

    • @PierAisa
      @PierAisa  Рік тому

      grazie se ti può fare comodo ecco la mia videolist www.pieraisa.it. Sui timer puoi prendere spunto da questo video dove avevo spinto a massima velocità Arduino Uno ua-cam.com/video/d0ycCB1JxA4/v-deo.html

  • @giuseppecolombo4701
    @giuseppecolombo4701 6 років тому

    Ottima spiegazione come sempre

  • @francomaggiori1935
    @francomaggiori1935 3 роки тому

    Chiedo scusa se sono fuori tema ma, vista la conoscenza profonda che ha e la mia infinita ignoranza in materia, vorrei proporle un progetto che riscontrerà sicuramente gratitudine e benedizioni da molti appassionati di HiFi. Il progetto è quello di un alimentatore AC a 50Hz per alimentare il motore sincrono del giradischi. Dovrà avere la regolazione della frequenza (per variare il numero di giri). La tensione in uscita di 180-220V. Potenza del motore 10W max. Il costo di questi alimentatori (se ben fatti) è molto alto (anche 500 e più euro). Che altro dire...grazie dell'attenzione e saluti.

    • @PierAisa
      @PierAisa  3 роки тому

      Ciao Franco, scrivimi a pieraisaforum@gmail.com.

  • @maurospagnoletti4787
    @maurospagnoletti4787 4 роки тому +1

    Ciao, ottimo lavoro visto le prospettive che ha il fotovoltaico dove l'inverter è il componente fondamentale. Io possiedo l'inverter di Nuova Elettronica (LX1640) che uso quotidianamente nel mio impianto fotovoltaico. Esso non è un inverter gridline ma grazie alle connessioni da me elaborate (brevetto n. 0001416091 del 22/05/2015) puô asservire la mia abitazione. Sarei curioso di sapere se Arduino con il programma da te elaborato puô sostituire il microprocessore dell'LX1640 (EP1640), se non altro per il fatto che non è reperibile il ricambio nella malaugurata eventualità di un guasto ad esso. Grazie

    • @PierAisa
      @PierAisa  4 роки тому

      Assolutamente sì, infatti l'inverter di Nuova Elettronica lavora a 256 punti quindi completamente compatibili con Arduino e il firmware che ho proposto si tratta di arrangiare un po' I pin per vedere Una piccola interfaccia di collegamento ed il gioco è fatto.

  • @Olavotemrazaodenovo
    @Olavotemrazaodenovo 4 роки тому

    Obrigado, do Brasil.

    • @PierAisa
      @PierAisa  4 роки тому

      Grazie! L'ultima volta che venni in Brasile fun nel 96

  • @MarcoRizzinelli
    @MarcoRizzinelli 4 роки тому

    Grazie, ogni giorno si impara qlcs

  • @michelevuerich8952
    @michelevuerich8952 4 роки тому

    ciao Pier molto interessante e chiaro come spiegazione, non riesco però atrovare il link del sorgente per arduino, puoi indicarmi il link per sacricarlo grazie Michele

    • @PierAisa
      @PierAisa  4 роки тому

      Il link lo trovi in descrizione del video sotto la voce sorgenti ma per aver accesso a quel file bisogna sottoscrivere almeno per una volta il livello medio del mio programma patreon così ti crea un account a vita per scaricare tutti i sorgenti.

  • @MrTega1975
    @MrTega1975 6 років тому +1

    si può usare per quel vettore un tipo di dato più piccolo di int

    • @PierAisa
      @PierAisa  6 років тому +1

      Esatto ! Soprattutto lavorando su Arduino che ha le risorse limitate sempre meglio risparmiare. Potrebbe andare bene byte o char per coprire i valori che possono andare da 0 a 255

    • @MrTega1975
      @MrTega1975 6 років тому

      Complimenti comunque, ottimo lavoro, molto chiaro, come sempre. Grazie!

  • @NicozStrat
    @NicozStrat 6 років тому

    Ciao Pier! Come sempre un ottimo video! Volevo chiederti in base alla tua esperienza: se voglio ricreare un segnale es sinusoide ad un certa frequenza, e per esempio a 8 bit, è necessario che il numero di step con cui aggiornare il duty cycle sia multiplo del numero di bit? Per esempio, posso costruire una sinusoide a 16 bit, disponendo di 254 step? (Ovviamente con un mcu che abbia una pwm con quella risoluzione come per esempio un xmega). Sarebbe inoltre interessante lo stesso progetto con la possibilità di variare ampiezza e frequenza: io infatti non sono riuscito a ottenere questo risultato con un at328p perché il tempo necessario all'adc per finire la conversione su uno dei due controlli è più lungo di quello messo a disposizione dall'isr

    • @PierAisa
      @PierAisa  6 років тому

      Abbiamo due tipi di quantizzazione. La prima sull'asse delle ascisse, ossia sul tempo. In questo caso la durata dello step di aggiornamento del PWM deve rispettare un rapporto fra frequenza di switching e frequenza del segnale da ricostruire che sia sufficientemente alto, rispetto alla applicazione che devi sviluppare. Ad esempio se devi pilotare un carico come un motore forse puoi permetterti di usare pochio punti per ciclo. Questo aumenta la distorsione e le armoniche ma sul motore magari non ti interessa più di tanto. Viceversa in una applicazione audio cove magari vuoi poca distorsione devi usare molti step, per fare in modo che il contenuto armonico indesiderato sia basso. Rispetto alla seconda quantizzazione quella sull'oerdinate, qui sei lefato alla base 2, il numero di livelli che vuoi è uguale a 2 elevato al numero di bit che userai e ti devi chiedere anche in questo caso che risouzione ti serve. In un prossimo video posso generalizzare il codie introducendo il controllo di frequenza, ampiezza e fase a run-time. Tanto in fin dei conti è ..... trigonometria ....... Se devi fare i conti con la lentezza dell'adc di arduino forse vale la pena pensare ad un adc esterno

  • @marcofestini4459
    @marcofestini4459 3 роки тому

    Ciao Pier, ho aggiunto lo stadio finale di potenza con 2 mosfet driver, 2 mosfet in push-pull collegati ad un trasformatore 12v a presa centrale 100VA...La tensione RMS massima della sinusoide a vuoto però è 180V partendo dai 13v in ingresso...Come mai? c'è una spiegazione "teorica"? grazie mille

    • @PierAisa
      @PierAisa  3 роки тому +1

      Probabilmente il duty cycle non copre gli estremi 0-100%, ma ha un duty minimo , duty massimo; in altre parole copre solo una parte del range completo e questo si traduce in una tensione minore

    • @marcofestini4459
      @marcofestini4459 3 роки тому

      @@PierAisa ma è un problema del codice? dello stadio di pilotaggio/mosfet? del trasformatore? Secondo te è possibile risolverlo? Mi piacerebbe creare un piccolo inverter per quando va via la luce in casa, giusto per accendere 3-4 lampadine. grazie ancora

    • @PierAisa
      @PierAisa  3 роки тому +1

      @@marcofestini4459 il codice lo si puo' modificare per fare lavorare il PWM con duty massimo, senza rischiare di non portare in cross conduction i MOSFET. Varrebbe la pena aumentare il rapporto spire del trasformatore se si vuole stare in sicurezza

  • @reimundolopez1198
    @reimundolopez1198 5 років тому

    Esas 2 salidas del arduino puedo conectar a un puente H directamente ?
    Otra pregunta, como puedo variar la frecuencia de 0 hasta 140 hz ?
    Quiero variar la frecuencia con step/dir para un motor monofásico

    • @PierAisa
      @PierAisa  5 років тому

      Hello, you shall use dedicated drivers to be able to drive the H bridge mosfet or igbts, in order to have the right current sink and source for the gate diacharge/charge. For example a UCC37321 driver (see my video ua-cam.com/video/FfJjuluSle4y/v-deo.htmles) you can change the frequency by changing the code.

  • @fralam7791
    @fralam7791 3 роки тому

    Grazie per i tanti tutorial e la grande competenza, chiedo un consiglio su come sistemare il dispositivo di accensione di una caldaia elettronica che continua ad emettere scintille fino a quando non raggiunge la temperatura impostata nel termostato, cioe allo spegnimento della fiamma, probabilmente non funziona il circuito dell elettrodo di rilevazione fiamma, ci puo essere qualche componente guasto. Grazie

    • @PierAisa
      @PierAisa  3 роки тому

      grazie esattamente.. molto probabilmente è un problema del sensore...

    • @fralam7791
      @fralam7791 3 роки тому

      @@PierAisa sa dove poso trovare lo schema di funzionamento generico di un dispositivo di accensione e rilevazione fiamma? grazie

    • @PierAisa
      @PierAisa  3 роки тому

      Ciao per la mia esperienza ho sempre visto questo flame sensor nel mondo Arduino come un sensore che fornisce un segnale alto/basso e necessita di una alimentazione 5V

    • @fralam7791
      @fralam7791 3 роки тому

      @@PierAisa grazie per la dritta....

  • @MarcoFranceschini1971
    @MarcoFranceschini1971 5 років тому +1

    Una sorta di generazione tramite lookup table...

    • @PierAisa
      @PierAisa  5 років тому +1

      Esatto. Le tabelle. Lookup sono una soluzione versatile e facilmente configurabile. Inoltre per il tono sinolusoidalennenbasta un quarto....

  • @michelevuerich8952
    @michelevuerich8952 4 роки тому

    ciao Pier ho provato a selezionare il livello medio come mi hai detto ma il sito va in loop e non mi far andare avanti

    • @PierAisa
      @PierAisa  4 роки тому

      Ti ho iscritto e mandato il tuo login via patreon, devi inserire le credenziali che ti ho mndato, Fammi sapere a pieraisaforum@gmail.com

  • @MarcoFranceschini1971
    @MarcoFranceschini1971 5 років тому

    Sera Pier...mi sembra che ci sia un piccolo refuso nella scrittura di "elapsed"...

    • @PierAisa
      @PierAisa  5 років тому +1

      A che minuto Marco ? grazie

    • @MarcoFranceschini1971
      @MarcoFranceschini1971 5 років тому

      Prova a 2:34 Pier...mi sembra se la vista non mi inganna...di leggere "ellapserd"....

    • @PierAisa
      @PierAisa  5 років тому +1

      @@MarcoFranceschini1971 Ops .... già già , brutto errorino. Grazie.

    • @MarcoFranceschini1971
      @MarcoFranceschini1971 5 років тому +1

      Eehehehehe...don't worry...we are humans...

  • @giancarlovolpe445
    @giancarlovolpe445 4 роки тому

    Complimenti, Video ben fatto, come al solito. Siccome avevo sotto mano, due inverter trifase, di cui uno l'ho riparato a discapito dei condensatori dell'altro, il realtà funziona anche il resto ma non è l'oggetto di quanto voglio ottenere come finale. Su questo che mi è rimasto ci faccio un po di esperimenti. Il lato potenza e pilotaggio è tutto funzionante, ho già individuato tutti i contatti con cui appoggirmi per pilotare gli IGBT. Volevo pilotarlo con un arduino, ho una domanda a riguardo. Quando con la parte iniziale del vidio dici di copiare l'output della sinusoide per poi costruirci il vettore nel codice definitivo noto che la seguenza è diversa, mi piacerebbe sapere perche la seguenza del vettore sinPWM è stata costruita proprio in quel modo.

    • @PierAisa
      @PierAisa  4 роки тому

      Mi riesci a dire il minuto a cui ti riferisci,?

    • @giancarlovolpe2755
      @giancarlovolpe2755 4 роки тому

      Pier Aisa Ciao, ti scrivo da altro account, cosi magari se ti va puoi vedere qualche video che ho fatto io, niente a che fare con i tuoi però. riguardo alla costruzione dell'array al minuto 6:09 (dove dici che copi i numeri per incollarli nell'array. Poi al minuto 10:10 si vede l'array ma le sequenza é diversa.

    • @PierAisa
      @PierAisa  4 роки тому +1

      Hai ragione probabilmente ho adottato un altro file per generarla con risoluzione diversa non sono esattamente identici

    • @giancarlovolpe2755
      @giancarlovolpe2755 4 роки тому

      Pier Aisa Che pensi di implementare il vettore con una retroazione dipendente da una misura di tensione sulla uscita di un eventuale inverter?

    • @PierAisa
      @PierAisa  4 роки тому +1

      @@giancarlovolpe2755 Il vettore rappresenta la sinusoide normalizzata (ampiezza = percentuale della massima tensione del DC bus), poi la sinusoide deve essere moltiplicata per una ampiezza in digitale, che verrà calcolata in modo da azzerare l'errore rispetto a quella impostata. Quindi servirà come hai detto una retroazione, dal valore letto in uscita al coefficiente moltiplicativo in digitale, che andrà a modificare il valore del duty cycle del PWM corrente