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".
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:
Hat jemand eine Idee, ich muss ein ca. 2 kHz starkes PWM-Signal erzeugen. Nicht unbedingt mit Timer1.Code:' 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
Vielen Dank.
Grüße
datatom
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".
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
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
Hat jetzt geklappt, danke für die Tipps.
Der Motor läuft jetzt mit 1,9 kHz. Ich meine er läuft jetzt fast rund.
Hier das Programm:
Code:' 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
Lesezeichen