PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM im Mega32



Andy1988
07.02.2006, 22:24
Hi.
Ich hab mir vorgestern ne H-Bridge gebaut, mit der ich meine RB35 Motoren regeln möchte.
Heute hab ich mich mal ein bischen mit dem AVR-C beschäftigt. Ports ein- und ausschalten is kein Problem (is ja im Prinzip nur Bitshifting).

Jetzt wollte ich meinen Motor regeln. Da hab ich das hier geschrieben:

int main(void)
{
//Port D als Output
DDRD = 0xff;

//10 Bit Phase Correct PWM, max Wert 1023
TCCR1A = (1<<WGM10) | (1<<WGM11) |(1<<COM1A1);
//Takt = CPU-Takt/64
TCCR1B = (1<<CS10) | (1<<CS11);

//Port D Bit 7 (Enable) auf I
PORTD |= (1 << PD7);

while(1)
{
PORTD |= (1 << PD6);
for(uint16_t i = 0; i <= 1023; i++)
{
OCR1A = i;
_delay_ms(5);
}
PORTD &= ~(1 << PD6);

PORTD |= (1 << PD5);
for(uint16_t i = 0; i <= 1023; i++)
{
OCR1A = i;
_delay_ms(5);
}
PORTD &= ~(1 << PD5);

}

return 0;
}
Der Motor regelt jetzt auch schön, allerdings fängt der an zu stottern. Dazu komm ich gleich noch. Ich glaub ich weiß, woran das liegt.

Aber regel ich jetzt ALLE ausgänge? Ich will doch nur einem Pin sagen, wie der den Saft ein- und ausschalten soll. Nicht allen. Und hier liegt anscheinend auch das Problem mit dem stoppen. Der Motorregler ist ein L298. Der hat ja eine Enable Leitung und zwei für die Richtung. Anscheinend wird jetzt die Enable Leitung UND die Richtungsleitung "ge-pwm-t". Also stottert der so.

Wie kann ich denn jetzt dem AVR sagen, dass er nur einen Pin "pwm-em" soll?

edit:
Das stottern ist weg. Hab den Takt von CPU-Takt/64 auf CPU-Takt/8 gestellt. Jetzt scheint das zu gehen. Aber da bleibt immenroch die Frage, ob der alle Pins regelt. Müsste er eigentlich, weil ich ja nirgendwo angebe, welchen Port er regeln soll.

SprinterSB
08.02.2006, 08:30
Die Pins, an der eine PWM ausgegeben wird bzw. wo das überhaupt möglich ist, sind bei AVR fest verdrahtet. Üblicherweise heissen die Pins OCn, wenn n die Timer-Nummer ist. Bei mehreren PWM-Kanälen auch OCxA, OCxB, ...

Im TCCR1A aktivierst du die PWM-Verbindung zum Pin OC1A in einem bestimmten Modus. Den entsprechenden Pin wird als Ausgang geschaltet und muss danach nicht mehr explizit gesetzt werden; das übernimmt die PWM-Einheit. Über TOP und OCR1A werden Wiederholrate und Tastverhältnis eingestellt. TOP ist je nach Timer-Modus fix oder steht in einem Register (z.B. ICR1).

ogni42
08.02.2006, 08:34
Hallo Andy,

Du regelst den Motor nicht, sondern stellst Ihn ein. Im Wiki findest Du den Unterschied erklärt.

Ich nehme mal an, dass Du mit D.5 und D.6 die Richtung umschaltest? Der uC "PWMt" die Pins die Du dafür frei geschaltet hast. Beim Mega168 steht das z.B. im Register TCCR1A. Du steuerst im Moment nur OCR1A an, hast das dem AVR also schon so gesagt, wie Du es wahrscheinlich vor hattest :)

Wenn Du weitere PWM Pins benutzen willst, musst Du daran denken, dass neben der Freischaltung im TCCRxA Register das Datenrichtungsregister des Ports entsprechend gesetzt sein muss (ist zumindest beim Mega168 so).

Andy1988
08.02.2006, 09:02
Ja. D.5 und D.6 steuern die Richtung. Dann war das purer Zufall, dass ich das so angeklemmt hab.

Ich werd warscheinlich einfach die Enable Leitung auf den PWM-Port legen und dann die Richtung steuern. Ist einfacher und spart PWM-Ports.

Hat der Mega32 nur 2 PWM-Ports? Ich werd nämlich leider 3 brauchen, weil ich mit Omniwheels arbeiten will und deswegen die 3 Motoren getrennt regeln müsste um in jede Richtung fahren zu können.

Aber das C ist herrlich! Da lernt man richtig gut, was in dem Prozessor abläuft. Hab bisher nur ein bischen mit Bascom gebastelt. Aber das ist langweilig... Da is ja schon alles fertig ^^ Und das "unübersichtliche Basic Chaos" mag ich nicht so. :D

SprinterSB
08.02.2006, 10:39
Programmiersprachen sind Geschmackssache, ich mag auch lieber C. ABer jedem das Seine...

So weit ich sehen kann, hat ATmega32 4 PWM-Ausgänge: OC0, OC1A/B und OC2. Software-PWM ist aufwändiger und braucht auch nen Timer für den Takt. Ich mach momentan ne 10-kanälige Soft-PWM bei 20kHz IRQ-Frequenz (Mega8). Wobei das indirekt über ein SPI-Protokoll geht!!! Da ist also einiges machbar, wenn man C nimmt und der µC die Ohren anlegt :-)

Andy1988
08.02.2006, 13:17
OK. Dann werd ich gleich nochmal ein wenig spielen. Danke schonmal!

Andy1988
08.02.2006, 18:27
Eine Sache versteh ich immernoch nicht. Ich schalte oben den Timer ein. Dann stel ich den Takt ein. Aber woher weiß der AVR denn jetzt welchem Port er mit dem Timer, der grade läuft, verbinden soll.

Könnt ihr mir evtl. einen Schnipsel geben, in dem OC2 (PD7) ge-pwm-t wird?

ogni42
08.02.2006, 19:04
Die Timerausgänge sind fest verdrahtet und liegen auf bestimmten Pins, die - bei vielen AVR - mehrere Funktionen haben. Welche, steht im Datenblatt.