PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM-Signal erzeugen



datatom
23.12.2012, 17:19
Hallo zusammen,

ich versuche mit einem ATMEGA2561 http://www.atmel.com/Images/doc2549.pdf in Bascom ein PWM-Signal zu erzeugen. An dem ATMEGA habe ich die Pololu Motorsteuerung http://www.pololu.com/catalog/product/755 angeschlossen, klappt leider nicht.

Zuerst habe ich versucht die Frequenz zu berechnen: (Frequenz des Quartz 16000000/Prescaler 1024)/(2^16Bit*2) = 119 Hz
Dann habe ich in Bascom die Register des ATMEGA2561 eingestellt auf Fast PWM, Prescaler, usw.
Tccr1a = &B11000011
Tccr1b = &B00011101

Hat jemand vielleicht einen Tipp? Mich interessiert als erstes:
Habe ich die Frequenz richtig berechnet?
Habe ich die Register richtig belegt?

Vielen Dank für die Hilfe im Voraus.

Grüße

datatom

Das Bascom-Programm sieht so aus:




'

$regfile = "m2561def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44




$crystal = 16000000 'Quarzfrequenz
$baud = 19200


' Portbelegung Seite 3 in der ATMEL-DOKU - Pinbelegung siehe Alvidi Doku


Config Pinb.5 = Output ' Pin 22; PB5 für Timer1/ OC1A im FAST PWM-Modus




Config Pinf.0 = Output
Led0 Alias Portf.0
Config Pinf.1 = Output
Led1 Alias Portf.1
Config Pinf.2 = Output
Led2 Alias Portf.2
Config Pinf.3 = Output
Led3 Alias Portf.3


Config Pinc.0 = Output ' Pin 45; PC0
Motor1_reset Alias Portc.0


Config Pinc.1 = Output ' Pin 46; PC1
Motor1_direction Alias Portc.1




Dim I1 As Integer
Dim I2 As Integer
Dim Takt_hz As Long


Echo Off


Led0 = 1 ' LEDs einschalten
Led1 = 1
Led2 = 1
Led3 = 1

' reset Motortreiber
Motor1_reset = 1
Waitms 500

Motor1_reset = 0
Waitms 500

Motor1_reset = 1


Motor1_direction = 1


I1 = 1
I2 = 50

On Compare1a Timer1_isr
Tccr1a = &B11000011
Tccr1b = &B00011101 '
Enable Compare1a
Enable Interrupts


Compare1a = 30 ' Frequenz Hz für die Drehgeschwindigkeit


Loop


End


Timer1_isr:


I1 = I1 + 1


If I1 = 1025 Then


'Tccr1b = &B00001000 ' Timer/ Counter stopped, no clock source


End If


Return

Thomas E.
23.12.2012, 19:02
Warum so kompliziert? Ein einfaches Config Timer1=Pwm tuts doch auch?

for_ro
23.12.2012, 19:12
Hallo Datatom,
wenn du Fastpwm Modus 15 auswählst, dann ist OCR1A der TOP Wert, bestimmt also die Frequenz, während OCR1B den Umschaltpunkt festlegt. Den PWM kannst du dann an OC1B abgreifen.
Die Frequenz berechnet sich aus _XTAL/(Prescale*(OCR1A+1)), bei dir also etwa 500Hz.
Du musst also unbedingt OCR1B festlegen, sonst passiert da nichts.
Außerdem musst du anstelle von COM1A1:0 nun COM1B1:0 setzen, also so
Tccr1a = &B00110011
Tccr1b = &B00011101

@Thomas E.
Ich wüsste keinen Weg, wie man mit Bascom direkt den FastPWM Modus setzen könnte.
Ob Datatom den hier überhaupt braucht, ist natürlich eine andere Frage.

datatom
23.12.2012, 20:27
Danke für die Antworten. Ich habe das mit dem Top-Wert und den Umschaltpunkt noch nicht genau verstanden.

Hier meine Vorstellung:

Der Topwert ist die Spitze, also der maximale Wert, der beim zählen des Timers erreicht wird.
Wenn der Timer von Null an hochzählt, ist der Umschaltpunkt der Wert wo von low auf high umgeschaltet wird und bis zum Topwert weitergezählt wird.
Stimmt das?

Gibt es eigentlich eine deutschsprachige Erklärung?

Weiterhin vielen Dank für die Hilfe.

for_ro
23.12.2012, 21:05
Ja, genau so.
Bist du eigentlich sicher, dass du eine PWM mit dem Modus 15 brauchst, also eine mit einer genau festgelegten Frequenz? Deine Motorsteuerung sollte doch auch mit normalem PWM gehen, oder?
Bei Modus 15 kannst du auch nur eine PWM erzeugen, weil du beide OCR1n Register benötigst. Als Alternative ginge noch Modus 14, wo du für die Frequenz das ICR Register verwendest und dann noch beide Ausgänge nutzen kannst.

datatom
23.12.2012, 21:53
Also genau genommen weiß ich es nicht ob Modus 15 oder 14? Deswegen schreib ich hier im Forum. Ich möchte einen Motor in verschiedenen Geschwindigkeiten drehen lassen. Ich hatte per CTC einen Schrittmotor per Schrittmotorensteuerung drehen lassen. Da habe ich mir gedacht, das ich von CTC auf FastPWM umstellen muss und schon läuft es. Mir fehlt natürlich das Wissen wie man per PWM einen Motor drehen lässt.

Kann ich denn mit Modus 14 den PWM-Wert variabel steuern?

Am besten ist eine gute Erklärung, evtl. ein Tutorial oder eine Buchempfehlung.

Thomas E.
23.12.2012, 21:55
Am besten ist eine gute Erklärung, evtl. ein Tutorial oder eine Buchempfehlung.
Da oben, da gibt es so einen Button - da steht RN-Wissen drauf. Da musst du hin. :)

for_ro
23.12.2012, 22:32
Hallo datatom,
eine deutsche Erklärung für Fast-PWM habe ich nicht zur Hand. Für normales PWM gibt es hier im Forum genügend.
PWM ist normalerweise an feste Frequenzen gebunden, die sich aus dem Takt des Controllers, dem Prescaler des Timers und der Auflösung der PWM ergeben. Die Frequenzen sind bei normalen PWM Anwendungen auch eher zweitrangig. Es geht vielmehr um das Verhältnis der Ein- und Ausschaltzeiten, die durch Setzen der Register ändern kannst. Das geht bei jeder PWM, sollte also für deine Motoren funktionieren.
Bei Fast-PWM kann man zusätzlich noch die Frequenz und damit die Auflösung der PWM ändern. Dies ist nur für ganz spezielle Anwendungen notwendig. Wenn du z.B. eine PWM mit einer Aufösung von 100 oder auch 10000 Schritten brauchst, kannst du mit den normalen Modi nicht arbeiten. Die haben immer 8-, 9- oder 10-bit Auflösung, also 256, 512 bzw. 1024 Schritte.
Hinzu kommt noch, dass Fast-PWM die Puls- und Pausenzeit innerhalb eines Zyklus macht, was de facto zu einer Verdopplung der Frequenz führt. Daher wohl auch der Name Fast-PWM.