- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 7 von 7

Thema: Problem mit ATMega168A und PWM

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2012
    Beiträge
    18

    Frage Problem mit ATMega168A und PWM

    Anzeige

    E-Bike
    Hallo,
    Ich bin schier am verzeweifeln..

    Habe einen ATMega168 und einen L293B der mit diesem gesteuert wird.
    Einfaches Einschalten der Enable-Leitung und einer der Richtungsleitungen führt wie gewünscht zum fahren in die entsprechende Richtung.
    Allerdings ist das ganze bei voller Spannung etwas sehr schnell für den Aufgabenbereich (Saugroboter).
    Daher wollte ich wie im Motorenartikel hier im RN den L293B per PWM ansteuern und ihn dadurch langsamer fahren lassen.
    Dafür benutze ich Ausgang D6(OC0A) und B2(OC1B).
    Bei Ausgang B2(16-Bit Timer) funktioniert das ganze auch ganz hervorragend.
    Nur Ausgang D6 gibt nichts von sich.

    Hier mal das Programm:
    Code:
    Reset:
      ldi temp,LOW(RAMEND)		; Stackpointer initalisieren
      out SPL,temp
      ldi temp,HIGH(RAMEND)		; Stackpointer initalisieren
      out SPH,temp
    
    ;B7= Richtung 3
    ;B2= Enable1(OC1B)
    ;B1= LED
      ldi temp,0b10000110			; Ausgänge B setzen
      out DDRB,temp
    
    ;D4= Richtung 4
    ;D5= Richtung 2
    ;D6= Enable2(OC1A)
    ;D7= Richtung 1
      ldi temp,0b11110000			; Ausgänge D setzen
      out DDRD,temp
    
    ;LED auf 1 (aus)
    ;Pullup an Schalter(B0) einschalten
      ldi temp,0b00000011			
      out PORTB,temp
    ;Richtung 2 (Bit5) und Richtung 4 (Bit4) auf 1(vorwärtsfahren)
      ldi temp,0b00110000			; Alle Ausgänge auf 0 setzen
      out PORTD,temp
    	
    /*
    TCCR0A
    COM0A1 | COM0A0 | COM0B1 | COM0B0 | - | - | WGM01 | WGM00 |
        1    |    0    |   0    |    0  | 0 | 0 | 1  |   1  |
    FASTPWM Clear		Normal Port		Fast PWM
    on Compare Match	Operation		TOP=OCRA
    */
    
    
    	ldi temp,0b10000011
    	sts TCCR0A,temp
    
    /*
    TCCR0B
    FOC0A | FOC0B | - | - | WGM02 | CS02 | CS01 | CS00 |
       0   |   0   | 0 | 0 |  1  |   0  |  0  |  1  |
    			 s.o	Clock select ohne
    					Prescaling
    */
    
    	ldi temp,0b00001001
    	sts TCCR0B,temp
    
    ;OCR0A=127
    	ldi temp,0b01111111
    	sts OCR0A,temp
    
    
    	ldi temp,0b00100011
    	sts TCCR1A,temp
    	ldi temp,0b00011001
    	sts TCCR1B,temp
    	ldi temp,0b00000000
    	sts TCCR1C,temp
    	ldi r17,0b00000000
    	ldi r16,0b00000000
    	sts OCR1BH,r17
    	sts OCR1BL,r16 
    
    loop: 
    	rjmp loop
    Der untere Teil ist nicht kommentiert, da er funktioniert.
    Wenn jemand einen Fehler findet, wäre ich ihm schwer dankbar.

    Danke im Vorraus

    Mit freundlichen Grüßen

    TechMo

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von TechMo Beitrag anzeigen
    /*
    TCCR0B
    FOC0A | FOC0B | - | - | WGM02 | CS02 | CS01 | CS00 |
    0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
    s.o Clock select ohne
    Prescaling
    */

    ldi temp,0b00001001
    sts TCCR0B,temp
    Hi,
    meiner Meinung nach sollte das WGM02 bit nicht gesetzt sein. Im mode 7 ist sonst das OCR0A auch gleichzeitig der TOP Wert des Timers. Ohne WGM02 mit WGM00 und WGM01 im mode 3 läuft der Timer bis FF und OCR0A sollte die Compare Funktion erfüllen.

    PS: oder WGM02 bleibt stehen und COM0A0 statt COM0A1 setzen. Dann sollte der OC0A Pin nach 127 (OCR0A Wert) Timer steps toggeln (wenn ich das Datenblatt richtig interpretiere)

    Gruß
    Searcher
    Geändert von Searcher (17.09.2012 um 14:45 Uhr) Grund: PS hinzugefügt
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2012
    Beiträge
    18
    Also habe beides ausprobiert, leider ohne Erfolg.
    Aber selbst bei meiner Config sollte der doch die ganze Zeit Spannung geben, und nicht wie er tut, gar nicht, oder?
    Ganz eigenartig ist, das egal welchen Part ich auskommentiere (Timer 0 oder Timer 1) der eine Motor dreht.
    Ich befürchte hier liegt ein Problem mit der Verkabelung vor. Werde dies morgen prüfen.

    Wenn jmd sonst noch eine Idee hat, darf er das gerne äußern

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von TechMo Beitrag anzeigen
    Also habe beides ausprobiert, leider ohne Erfolg.
    Hi,
    hab Dein Problem zum Anlaß genommen meinen am Samstag frisch gelieferten Mega88A auszuprobieren. Der ist bis auf den Speicher gleich dem Mega168A.

    Meine beiden Vorschläge von oben funktionieren. Mit 8MHz internem Takt gibt es ein Rechteck mit 32kHz am OC0A (PD6).

    Allerdings hab ich festgestellt, daß auch Dein OC1B (PB2) kein Rechteck ausgibt. Um den gleich dem OC0A zu kriegen, würde ich aus dem Timer0-Teil nur das WGM02 Bit löschen und dann

    im Timer1-Teil mit WGM10 und WGM12 den mode 5 einstellen (fast PWM 8 bit). Dann noch das OCR1BL Register mit 127 (0b01111111) setzten. OCR1C wird nicht gebraucht.

    etwas so:
    Code:
         ldi temp,0b00100001
         sts TCCR1A,temp
         ldi temp,0b00001001
         sts TCCR1B,temp
    ;ocr1b = 127
         ldi temp,0b00000000   ;zur Sicherheit ?
         sts OCR1BH,temp       ;zur Sicherheit wg 16Bit Register ?
         ldi temp,0b01111111
         sts OCR1BL,temp
    Gruß
    Searcher
    Geändert von Searcher (17.09.2012 um 23:19 Uhr)
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2012
    Beiträge
    18
    So habe nochmal die Schlatung überprüft und es ist alles soweit richtig verbunden.

    Leider wird aber auch wenn ich den Teil für OC1B auskommentiere, an diesem Ausgang eine Spannung von etwa 1,1V abgegeben.Bei OC0A geht weiterhin gar nichts. Egal mit welcher Variante. Aus irgendeinem Grund leuchtet allerdings die LED, die ja eigt auf 1 geschaltet ist und damit nicht leuchten sollte.

    Ich bin stark verzweifelt.
    Wenn irgendjemand noch eine Idee hat woran es liegen könnte, wäre ich furchtbar dankbar.

    MfG

    TechMo

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    521
    Hi, hab zwar keine Lösung, hatte aber genau das gleiche Problem mit dem Atmega168PA. PWM hat absolut nicht funktioniert, der gleiche Code in einem anderen Atmega Typ aber schon. (gleicher Timer, gleicher Code). Vielleicht gibts eine Besonderheit beim Atmega168??

    Mir ist bei Deinem Code aber nicht ganz klar welche Timer Du verwendest, OC0A und OC1B sind einmal Timer0 und Timer1...

    LG!
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2012
    Beiträge
    18
    Ja genau, ich nutze Timer 0 (kommentierter Code) und Timer 1 (unkommentierter Code darunter). Werde aber heute mal ausprobieren beides an den selben Timer anzuschließen und nur den Compare Wert für die beiden Ausgänge zu verändern um verschiedene Ausgangswerte zu erhalten. Ich denke es muss iein Bit geben, dass ich übersehen habe zu setzen, da ja volle Geschwindigkeit ohne Probleme funktioniert. Nur das PWM funktioniert an dem Timer0 Ausgang überhaupt nicht.

Ähnliche Themen

  1. ATMega32 UART problem --> Problem gelöst
    Von ChristophB im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 12.03.2010, 19:45
  2. Problem mit Atmega644P Erkennung (Bascom-Versions-Problem)
    Von Rohbotiker im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 11.08.2008, 19:52

Berechtigungen

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

12V Akku bauen