rieccomi dopo qualche giorno ![]()
credo proprio di essere riuscito a generare un bella sinusoide a 400hz ]![]()
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 ![]()
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
