PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Mega2560 2 kHz-PWM-Signal erzeugen



datatom
02.02.2012, 21:03
Hallo zusammen,

ich habe ein RN-Mega2560 http://www.robotikhardware.de/download/rnmega2560.pdf und möchte in Bascom ein ca. 2 kHz starkes PWM Signal erzeugen. Dazu wollte ich den Timer1 benutzen.

Die Quarzfrequenz liegt bei 16000000

Der Timer1 ist ein 16 Bit Timer. Soviel ich weiß, kann man den 16 Bit Timer auch mit weniger Bit betreiben, um dass mal laienhaft auszudrücken.

Wenn ich den Prescaler auf 256 setzte und den Timer auf 14 Bit setze, erhalte ich 1,9 kHz. Allerdings bekomme ich beim komiplieren einen Fehler: Invalid parameter for config parameter or value [14]

Mein Programm:


' PWM Testprogram'''''$prog , 255 , &B11011100,
$prog , 255 , &B11011001,
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44




$crystal = 16000000 'Quarzfrequenz
$baud = 19200




Config Pind.5 = Output
Led Alias Portd.5


Config Pinc.0 = Output ' Stiftleiste JP 2; Pin 3; PC0
Motor1_reset Alias Portc.0


Config Pinc.1 = Output ' Stiftleiste JP 2; Pin 4; PC1
Motor1_rotational_direction Alias Portc.1


Dim Motor1_speed As Integer


Echo Off


Config Timer1 = Pwm , Pwm = 14 , Compare A Pwm = Clear Up , Prescale = 256 ' Stiftleiste JP 1; Pin 24




Led = 0 ' LED einschalten


Motor1_reset = 1
Waitms 1
Motor1_reset = 0
Waitms 1
Motor1_reset = 1


Motor1_rotational_direction = 1


Motor1_speed = 127
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Do


' Der max. Wert von Compare1a liegt bei 2 hoch Bit-Wert => 2 hoch 8 = 256. Da ab 0 gezählt wird, ist der max. Wert für einen 8 Bit-Timer 255
Compare1a = Motor1_speed ' Stiftleiste JP 1; Pin 24


Loop


'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
End

Hat jemand eine Idee, ich muss ein ca. 2 kHz starkes PWM-Signal erzeugen. Nicht unbedingt mit Timer1.

Vielen Dank.

Grüße

datatom

Kampi
02.02.2012, 21:13
Willst du den Timer1 mit 14 vorladen?
Wenn ja musst du das so schreiben:

Timer1 = 14

Mit "PWM = X" legst du die Timerauflösung fest und das ist 8 Bit. Du musst also schreiben "PWM = 8".

masasibe
02.02.2012, 21:37
Du kannst einen 16-bit Timer nicht einfach auf 14 bit setzen,
stattdessen musst du ihn, wie Kampi schon geschrieben hat,
auf einen Startwert setzen von dem der Timer dann loszählt.
8 bit Timer zählen natürlich immer bis 255 und 16 bit Timer bis
65535!
Möchtest du dass der Timer sozusagen mit 14 bit läuft, dann musst
du den Startwert entsprechend anpassen.

mfg masasibe

datatom
03.02.2012, 22:53
Hat jetzt geklappt, danke für die Tipps.:p

Der Motor läuft jetzt mit 1,9 kHz. Ich meine er läuft jetzt fast rund.

Hier das Programm:

' PWM Testprogram
'''''$prog , 255 , &B11011100,
$prog , 255 , &B11011001,
$regfile = "m2560def.dat"
$hwstack = 82 '80
$framesize = 68 ' 64
$swstack = 68 '44


$crystal = 16000000 'Quarzfrequenz
$baud = 19200


Config Pind.5 = Output
Led Alias Portd.5

Config Pinc.0 = Output ' Stiftleiste JP 2; Pin 3; PC0
Motor1_reset Alias Portc.0

Config Pinc.1 = Output ' Stiftleiste JP 2; Pin 4; PC1
Motor1_rotational_direction Alias Portc.1

Dim Motor1_speed As Integer
Dim Motor1_max As Integer
Echo Off

' Bei dem Motortreiber 18V15 von Pololu liegt die PWM Frequenz (kHz) bei max. 40 kHz, siehe Doku des Motorboard auf Seite 3
' Formel zur kHz-Berechnung: Ausgangsfrequenz = (Quarzfrequenz/Prescale ) /(Timerauflösung*2)
' Quarzfrequenz = $crystal = 16000000
' Bei 16 Bit Timer: Prescale = 1, 8, 64, 256, 1024 für Timer1 Seite 164 der Doku für ATMEGA2560
' Bei 8 Bit Timer/ Counter2: Prescale = 1, 8, 32, 64, 128, 256 , 1024
' Timerauflösung = Bit, bzw. Pwm = 8, Bit ist dann 8. Mit dem Wert Bit wird die Zahl 2 hochgenommen => 2 hoch 8 = 256

' (16000000:1024):(256*2) = 30,517578125 kHz

' Timer1 ist ein 16 Bit Timer, wird in diesen Fall auf 8 Bit gesetzt.
'Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1024 ' Stiftleiste JP 1; Pin 24
' (16000000:1024):(256*2) = 30,517578125 kHz
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 256 ' 3,814697265625 ' Stiftleiste JP 1; Pin 24

Timer1 = 14

Led = 0 ' LED einschalten

Motor1_reset = 1
Waitms 1
Motor1_reset = 0
Waitms 1
Motor1_reset = 1

Motor1_rotational_direction = 1

Motor1_max = 0

Motor1_speed = 0
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
Do

If Motor1_max = 0 Then

'''''''' Beschleunigen

Motor1_speed = Motor1_speed + 1
' Der max. Wert von Compare1a liegt bei 2 hoch Bit-Wert => 2 hoch 8 = 256. Da ab 0 gezählt wird, ist der max. Wert für einen 8 Bit-Timer 255

Compare1a = Motor1_speed ' Stiftleiste JP 1; Pin 24

Waitms 50

If Motor1_speed = 256 Then
Motor1_max = 1
''''' Richtungswechsel
Motor1_speed = 256
Waitms 1
Toggle Motor1_rotational_direction
End If

Elseif Motor1_max = 1 Then

'''''''' Abbremsen
Motor1_speed = Motor1_speed - 1

Compare1a = Motor1_speed ' Stiftleiste JP 1; Pin 24

Waitms 50

If Motor1_speed = 1 Then
Motor1_max = 0
''''' Richtungswechsel
Motor1_speed = 256
Waitms 5
Toggle Motor1_rotational_direction
Waitms 1
Motor1_speed = 1
End If

End If

Loop

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''
End