Sinus PWM mit Atmega 644

OP #3328717
Lesenswert?

Hallo Zusammen,
ich komme nicht wirklich weiter. Ich soll in der Schule einen AC-Motor 
(12V) über einen sinusgeneriertes PWM-Signal ansteuern. Habe hier schon 
eine gutes Programm, aber habe mal an meinen Ausgang des µController ein 
Oszilloskop gehangen und so sieht das Bild (siehe Anhang) aus. Jemand ne 
idee? Ist der PWM-Mode 5 falsch oder woran liegt es?? Wieso habe ich 
zwei Kurven.
Gruß Marco danke für Hilfe

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <inttypes.h>

#define F_CPU 16000000UL  // Quarz mit 16.000.000 Mhz
#define TIMERRELOAD 256  // Nachladewert des Timers 255
#define AUFLOESUNG 65536 // 16-Bit Counter 65535

const uint8_t sinustabelle[256] PROGMEM = 
{127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178 
,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223 
,225,227,229,231,233,234,236,238,239,240,242,243,244,245,247,248,249,249 
,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252 
,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231 
,229,227,225,223,221,219,217,215,212,210,208,205,203,200,198,195,192,190 
,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136 
,133,130,127,124,121,118,115,111,108,105,102,99,96,93,90,87,84,81,78,76, 
73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20, 
18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4 
,5,5,6,7,9,10,11,12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,4 
6,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,1 
11,115,118,121,124};

volatile union {uint16_t u16; uint8_t u8[2];} counter; //0 ist Low, 1 
ist High Byte
volatile uint16_t offset;

void frequenz_setzen(uint8_t Ausgabefrequenz)
{ // 614 Takte mit -Os
 offset = ((F_CPU/2 + Ausgabefrequenz  TIMERRELOAD  AUFLOESUNG) / 
F_CPU); // F_CPU/2 ist fürs Runden
}

int main(void)
{
 OSCCAL = 0xAE; //Kalibrieren des Internen RC OSC
 TCCR1A = (1<<COM1A1) | (1<<WGM10); //Clear OC0A on Compare Match & Fast 
PWM Mode 5
 TCCR1B = (1<<WGM12) | (1<<CS10); //CPU-Takt & Fast PWM Mode 5
 TIMSK1 = (1<<TOIE1); //Timer 1 Overflow interrupt an
 DDRB = (1<<PB5); //PB5 (OC1A) als Ausgang
 frequenz_setzen(50);
 sei();

 while(1);

 return 0;
}

ISR(TIMER1_OVF_vect)
{
 OCR1A = pgm_read_byte(&sinustabelle[counter.u8[1]]);
 counter.u16 += offset;
 return;
}
Angehängte Dateien:
Gast #3330459
Lesenswert?

Du hast das Ausgangsfilter vergessen!

Schalte mal einen Tiefpaß an den µC-Ausgang, R so um die 10k und den C 
berechnen daß die Grenzfrequenz ca. 2* höher als deine höchste 
Sinusfrequenz ist.

Du wirst nun einen sauberen Sinus sehen.

Und das Osziloskop natürlich auf DC-Kopplung stellen.
Gast #3330499
Lesenswert?

"

Ich würde sagen, daß die Masse nicht richtig angeschlossen ist.
Das sieht aus wie ein überlagertes Netzbrummen.

Gruß
Andreas


20.09.2013 12:53: Bearbeitet durch User

"

Vielleicht passe ich ja wirklich nicht mehr in die Zeit, aber was, 
bitte, musste bei diesen beiden Kurzsätzen nachbearbeitet werden, und 
das auch noch in derselben Minute?
Bei nur geringfügig 'komplexeren' Beiträgen sieht man manchmal 2 oder 
gar 3 Nachbearbeitungen, was soll das?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren