- LiFePO4 Speicher Test         
Ergebnis 1 bis 6 von 6

Thema: PWM - Motorsteuerun?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214

    PWM - Motorsteuerun?

    Anzeige

    Praxistest und DIY Projekte
    Hallo,
    ich komme nur langsam voran. Inzwischen ist zwar das Fahrwerk meines Roboters fertig - die Prorammierung des RN-Control Boards klappt noch nicht.
    Zwar lässt sich inzwischen die Richtung regeln - nicht jedoch die Geschwindikeit.
    Also ich verstehe das doch richtig:
    Ausgang PD4 und PD5 regeln die Geschwindigkeit? Also auf 0 setzen => Roboter steht.
    OCR1A und OCR1B geben den "Anteil" der Rechteckspannung der 1 ist!? Also 0 => keine Ammplitude => Motoren stehen
    Richtig? Wenn ja warum funktioniert das Proramm nicht (Hier der Motortreiber)
    Code:
    #include <avr/io.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include "motor.h"
    
    void MotorInit(void) // Initialisierung der Motoren
    {
       DDRD |= (1<<PD4) | (1<<PD5);   // PWM Pins als Ausgang festlegen (links/rechts)
       // Motor Ports für die Richtung festlegen (als Ausgänge)
       DDRC |= (1<<PC6) | (1<<PC7);   // 6=Motor 1 Kanal 1    7= Motor 1 Kanal 2
       DDRB |= (1<<PB0) | (1<<PB1);   // 0=Motor 2 Kanal 1    1= Motor 2 Kanal 2
       // PWM einstellen
       TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0) | (1<<WGM11)|(1<<WGM10); // 10 Bit Pwm, invertierend
       TCCR1B = (1<<CS11);      // Prescaler 8
       // Ausgänge für PWM
       PORTD &=  ~(( 1 << PD5 )| ( 1 << PD4 ));  // Motor an Port PD4 und PD5 aus
       OCR1A=1;         // Mindestzeit für PWM1
       OCR1B=1;         // Mindestzeit für PWM2
       // und in Ausgangswerte setzen
       
    }
    
    /* Motor Geschwindigkeit verändern */
    void MotorSpeed(unsigned int left_speed, unsigned int right_speed)
    {
    	PORTD &=  ~(( 1 << PD5 )| ( 1 << PD4 ));  // Motor an Port PD4 und PD5 aus
    	OCR1A = left_speed;
    	OCR1B = right_speed;
    	PORTD |= (( 1 << PD5 )| ( 1 << PD4 ));  // Motor an Port PD4 und PD5 an
    }
    /* Motoren anhalten */
    void MotorStop (void)
    {
    	// PORTD &=  ~(( 1 << PD5 )| ( 1 << PD4 ));  // Motor an Port PD4 und PD5 aus
    	OCR1A = 0;
    	OCR1B = 0;
    }
    /* Motor Richtung festlegen (FWD; BWD) */
    void MotorDir(unsigned char left_dir, unsigned char right_dir)
    {
    	PORTB &= ~((1 << PB0) | (1 << PB1));
        PORTB |= right_dir;
    	if (left_dir == FWD) 
    		left_dir = (1 << PC6);
    	else
    		left_dir = (1 << PC7);
    	PORTC &= ~((1 << PC6) | (1 << PC7));
    	PORTC |= left_dir;
    }
    Vielen Dank für eure Hilfe.
    Gruß
    Stefan

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    OCR1A=1; // Mindestzeit für PWM1
    OCR1B=1; // Mindestzeit für PWM2
    setzt mal auf 255 bei 8bit pwm´oder 1024 bei 10bit pwm
    mfg pebisoft

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214
    Ja das wars. Danke!!
    Aber wieso? ist OCR1x die Frequenz und bedeutet bei 1024 eine Welle?
    Gruß Stefan

  4. #4
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    Ja OCR1x legt fest wie lange die Amplitude innerhalb der Welle (Periode) High ist. Bei 10 Bit PWM bedeutet 1023 das quasi das Signal immer auf High ist - Motor hat halt volle Spannung.
    Bei 0 ist es immer Low, also Motor aus. Und alle Zwischenwerte erhöhen den High-Anteil innerhalb dieser Welle so das Motorgeschwindigkeit steigt.
    So einfach ist es, die Konfiguration sieht übrigens nur in C durch die kryptische Syntax etwas verwirrend aus.

    https://www.roboternetz.de/wiki/pmwiki.php?n=Main.PWM

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    22.11.2003
    Beiträge
    214
    Ja so wie du es beschreibst hatte ich es auch verstanden - aber leider ist es bei meinem Programm genau umekehrt ... bei 1023 steht der Motor. Kann es daran liegen, dass das PWM-Signal "inverted" ist? Also das ganze nur andersrum?
    Danke
    Gruß Stefan

  6. #6
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    Ja offenbar invertiertst du PWM. Du musst in TCCR1A / TCCR1B wohl falsches Bit gesetzt haben.

    In Bascom sieht der ganze C Wirrwarr so aus:

    Code:
      Tccr1a = &B10100011                       
      Tccr1b = &B10000001
      Pwm1a = 0 ' Geschwindigkeit 0 - 1023
      Pwm1b = 0 ' Geschwindigkeit 0 - 1023

Berechtigungen

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

12V Akku bauen