- Labornetzteil AliExpress         
Ergebnis 1 bis 4 von 4

Thema: RN-Mega2560 2 kHz-PWM-Signal erzeugen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.09.2009
    Beiträge
    164

    RN-Mega2560 2 kHz-PWM-Signal erzeugen

    Anzeige

    Praxistest und DIY Projekte
    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:

    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
    Hat jemand eine Idee, ich muss ein ca. 2 kHz starkes PWM-Signal erzeugen. Nicht unbedingt mit Timer1.

    Vielen Dank.

    Grüße

    datatom

  2. #2
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von masasibe
    Registriert seit
    21.01.2011
    Beiträge
    181
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.09.2009
    Beiträge
    164
    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

Ähnliche Themen

  1. bas-Signal mit Atmega32 erzeugen
    Von Waldichecker im Forum C - Programmierung (GCC u.a.)
    Antworten: 17
    Letzter Beitrag: 25.05.2010, 09:45
  2. Antworten: 0
    Letzter Beitrag: 04.07.2007, 17:10
  3. PWM-Signal erzeugen
    Von theodrin im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 11.12.2006, 16:10
  4. PPM Signal mit AVR erzeugen
    Von Razer im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 07.09.2006, 09:34
  5. PPM Signal erzeugen
    Von blizzard im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 8
    Letzter Beitrag: 07.07.2005, 12:48

Berechtigungen

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

Solar Speicher und Akkus Tests