PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit ATMega168A und PWM



TechMo
17.09.2012, 12:47
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:


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

Searcher
17.09.2012, 13:54
/*
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

TechMo
17.09.2012, 17:23
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 ;-)

Searcher
17.09.2012, 22:35
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:


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

TechMo
18.09.2012, 10:02
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

damfino
18.09.2012, 20:48
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!

TechMo
19.09.2012, 08:10
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.