mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pulsweitenmodulation (PWM) ATmega128


Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: john (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)????

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.