inverter 12/115v 400hz

rieccomi dopo qualche giorno :grin:
credo proprio di essere riuscito a generare un bella sinusoide a 400hz ]:smiley:

tramite il timer2 ho generato un fast pwm a 25khz
tramite la funzione sin() genero i punti per la sinusoide con una risoluzione di 0.1rad
dato che 0.1rad equivale a dare 62.8 punti ogni punto sono 39.81us arrotondato per comodità a 40us
quindi 40us a punto generano 400 cambi di stato a 25khz (1000000us/40)

ho messo un condensatorino da 1uf al pin 3 (per mostrare la sinusoide) e collegato l'oscilloscopio sembra che sia proprio così!!
sono ancora un po' incerto però, a voi torna questo ragionamento??

#include <avr/io.h>
#include <avr/interrupt.h>
#include <math.h>


float i;
float o;

int main(void)
{

  DDRD  =  0b00001000;              //pin 3 output

  TCCR2A = 0b10100011;              // timer2 fast pwm

  TCCR2B = 0b00001010;              //prescaler 8


  while(1)
  {
    i += 0.1f;                                     //risoluzione 0.1rad
    o = sin(i);                                    //seno di i, punti per duty cycle sinusoide

    OCR2A =79;                                     // 25khz

    OCR2B = (unsigned char)(abs(o *79.0f));        //duty cycle
  }


}

nella foto un quadratino verticale corrisponde a 1v e uno orizzontale a 2ms, quindi come dico mi sembra che torni, però l'oscilloscopio mi lascia ancora un po' perplesso :blush:

OCR2B = (unsigned char)(abs(o *79.0f)); //duty cycle

modificando 79.0f e abbassandolo posso evitare che il duty cycle arrivi al 100% e quindi anche retroazionare la tensione in ingresso al trasformatore in base alla lettura dell'alta tensione raddrizzata e con partitore di tensione

edit:grazie anche a arducompanion che aiuta un sacco a fare i calcoletti per i valori!!

ciao a tutti
luca