Forum: Mikrocontroller und Digitale Elektronik Pulsweitenmodulation (PWM) ATmega128


von john (Gast)


Lesenswert?

habe folgenden Code zur Ansteurung meiner 4 Motoren geschrieben:

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

//function definition
void setMotorSpeed(unsigned char motorSpeed1, unsigned char 
motorSpeed2,unsigned char motorSpeed3, unsigned char motorSpeed4);

int main(void){
//setting PWM-Ports to output is needed
DDRB|=(1<<PB7)|(1<<PB6)|(1<<PB5);
DDRE|=(1<<PE3);
// 8-Bit no-inverting PWM on OC1A,OC1B,OC1C & OC3A
TCCR1A|=0xA9;
TCCR3A|=0x81;
// Timer running on MCU clock/8
TCCR1B|=(1<<CS11);
TCCR3B|=(1<<CS11);
//set Motor Speed
setMotorSpeed(200,100,160,220);
while(1);
return 0;
}


void setMotorSpeed(unsigned char motorSpeed1, unsigned char 
motorSpeed2,unsigned char motorSpeed3, unsigned char motorSpeed4){
//turn off interrupts (is needed to write OCR1A usw)
cli();
OCR1AH|=0x00;
OCR1AL|=motorSpeed1;
OCR1BH|=0x00;
OCR1BL|=motorSpeed2;
OCR1CH|=0x00;
OCR1CL|=motorSpeed3;
OCR3AH|=0x00;
OCR3AL|=motorSpeed4;
//turn on interrupts
sei();
}

Zuerst mal vorweg: Das ist das erste Programm das ich mit PWM 
geschrieben habe! Ist das eigentlich soweit korrekt, geht das so?
Wenn ich das im AVR studio simuliere klappt die Simulation auch ganz 
gut, bis zum Zeitpunkt wo ich OCR1BH setzen will! Sollte ja null sein, 
aber es schreibt dann den Wert motorspeed2 dort rein! und weiter unten 
schreibt es dann überhaupt nichts mehr! OCR1AL ging noch problemlos! bin 
froh um jeden Tipp!

von Johannes M. (johnny-m)


Lesenswert?

Das mit dem Schreiben der 16-Bit-Register bei den Timern ist ein 
bekannter Bug im Simulator vom AVRStudio. Es ist oft sinnvoll, sich in 
der AVRStudio-Hilfe die bekannten Einschränkungen und Fehlfunktionen 
anzuschauen.

von john (Gast)


Lesenswert?

ich bin mir jetzt gar nicht mehr sicher ob ich da wirklich die richtigen 
PWM Ports ausgewählt habe? welche Ports kann ich für PWM beim ATmega128 
verwenden? Im Datenblatt heisst es ja er habe insgesamt sechs! aber 
momentan sehe ich es folgendermassen: 2PWM (8-bit) und 6PWM(16-bit)????

von Johannes M. (johnny-m)


Lesenswert?

john wrote:
> ich bin mir jetzt gar nicht mehr sicher ob ich da wirklich die richtigen
> PWM Ports ausgewählt habe? welche Ports kann ich für PWM beim ATmega128
> verwenden?
Wieso schaust Du nicht einfach erstmal bei den Pin Configurations, wo 
Deine Ausgänge überhaupt liegen. Ich hab jetzt ehrlich gesagt keine Zeit 
und Lust, Deine TCCRnA-Werte zu überprüfen. Schreib die Sachen demnächst 
besser auch in der "1<<BIT"-Schreibweise. Dann kann man sofort sehen, 
was für Bits da gesetzt werden.

> Im Datenblatt heisst es ja er habe insgesamt sechs! aber
> momentan sehe ich es folgendermassen: 2PWM (8-bit) und 6PWM(16-bit)????
"6 PWM Channels with Programmable Resolution from 2 to 16 Bits" heißt 
was? Überleg mal, ob das mit 8-Bit-Timern geht... Die 8-Bit-PWM-Kanäle 
finden da gar keine Erwähnung.

OC2 lässt sich übrigens auch nur alternativ zu OC1C verwenden, weil die 
beiden am selben Portpin hängen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.