PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pulsweitenmudulation mit Atmega32



Moebius
08.11.2010, 20:07
Hi,
ich habe meine ersten Versuche einer PWM gemacht. Es scheint zu funktionieren. Ändere ich z.B. den Vergleichswert, so werden meine Rechtecksignale größer bzw. kleiner.


#include <avr/io.h> // Namen der IO Register
#include <util/delay.h> // Funktionen zum warten
// Achtung, damit delay richtig funktioniert muß mit Optimierung compiliert werden

int main(void)
{
DDRC = (1 << 0); // Nur PC0 als output, _BV(0) = (1<<0) = 1
PORTC = 0b11111110; // Pullups auf allen anderen Pins

DDRD = (1 << 5);
TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11);
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10) | (1<<CS10);
ICR1 = 0x8FFF;
OCR1A = 0x1FFF;

while (1)
{
PORTC &= 0b11111110; // 0 auf Bit 0 Ausgeben, Rest so lassen
_delay_ms(10); // 100 ms Warten
PORTC |= 0b00000001; // 1 auf Bit 0 Ausgeben, Rest so lassen
_delay_ms(10);
}
}


Insgesamt erscheint mir das Signal aber ziemlich verrauscht. Was sagt ihr dazu? (Bild am Anhang)

Mfg Moebius

Besserwessi
08.11.2010, 21:26
Das Signal ist wirklich realtiv strak verrauscht. Die Amplitude ist auch etwas kleine für ein normales Digitalsignal. Das Rauschen hat aber wohl nichts mit dem Programm zu tun, sondern der Schaltung.

Ein PWM Signal durch aktives Warten zu erzeugen ist aber in der Regel keine gute Lösung. Besser ist dafür ein Timer geeignet - Anfänge sind ja schon da.

Moebius
08.11.2010, 21:37
Habe den Fehler gefunden. Ich hatte über OC1 und OC2 gemessen. Das ist natürlich Unfug. Ich messe jetzt zwischen OC1 und Masse und siehe da, das Rauschen ist weg und die Amplitude beträgt 5 V. \:D/

@Besserwessi: Bist du sicher das du den Code richtig gelesen hast? DIe while Schleife schaltet mir nur meine LED. (Hab ich vergessen herauszulöschen).

Mfg Moebius