- fchao-Sinus-Wechselrichter AliExpress    Werbung      
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

    E-Bike
    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.118
    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.118
    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
  •  

    Werbung      Labornetzteil AliExpress