-         

Ergebnis 1 bis 8 von 8

Thema: PWM im Mega32

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2004
    Ort
    Nettetal
    Alter
    29
    Beiträge
    107

    PWM im Mega32

    Anzeige

    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:
    Code:
    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.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    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).
    Disclaimer: none. Sue me.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    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).

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2004
    Ort
    Nettetal
    Alter
    29
    Beiträge
    107
    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.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    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 (Mega. Wobei das indirekt über ein SPI-Protokoll geht!!! Da ist also einiges machbar, wenn man C nimmt und der µC die Ohren anlegt
    Disclaimer: none. Sue me.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2004
    Ort
    Nettetal
    Alter
    29
    Beiträge
    107
    OK. Dann werd ich gleich nochmal ein wenig spielen. Danke schonmal!

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.08.2004
    Ort
    Nettetal
    Alter
    29
    Beiträge
    107
    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?

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    21.10.2005
    Ort
    Erde
    Alter
    50
    Beiträge
    1.195
    Die Timerausgänge sind fest verdrahtet und liegen auf bestimmten Pins, die - bei vielen AVR - mehrere Funktionen haben. Welche, steht im Datenblatt.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •