Pololu Motor Treiber Ansteuerung: Fehlt da was auf der Platine 1.4?

cat

Member
Ich wollte den Motortreiber selber mit einem Sketch ansteuern, aber der Rückwärtsgang verhält sich abnormal und das PWM wird invertiert.
Ich glaube da fehlt Logik zwischen Pololu Board und Microcontroller um PWM und DIR zu bekommen.

Ich habe da aber einen zweiten MC33926 Treiber von Pololu gefunden, der PWM und DIR bietet und nicht IN1 und IN2 direkt als PWM und DIR bezeichnet.
Bin noch am Rätseln was die Schaltung (2 invertierte UND-Gatter) bewirkt.

Ist das ein Fehler auf der Platine, der per Software korrigiert wurde?
Schaut mir ziemlich übel aus das per Software zu korrigieren :-(

Das Datenblatt sagt:
IN2
Logic input control of OUT2; e.g., when IN2 is logic HIGH, OUT2 is set to VPWR, and when IN2 is logic LOW, OUT2 is set to PGND. (Schmitt trigger input with ~80 A source so default condition = OUT2 HIGH.)

IN1
Logic input control of OUT1; e.g., when IN1 is logic HIGH, OUT1 is set to VPWR, and when IN1 is logic LOW, OUT1 is set to PGND. (Schmitt trigger Input with ~80 A source so default condition = OUT1 HIGH.)

Das heisst 100% vorwärts wäre IN1 HIGH und IN2 LOW
Das heisst 100% rückwärts wäre IN1 LOW und IN2 HIGH
Bremsen: IN1 LOW und IN2 LOW (Kurzschluss über GND?)
Freilauf? IN1 HIGH und IN2 HIGH oder braucht man dazu den D1 Eingang?

Werd da einmal mit dem Mähmotor Tests machen ... brrr kompliziert.
 

Anhänge

  • Bildschirmfoto 2021-07-28 um 10.32.14.png
    Bildschirmfoto 2021-07-28 um 10.32.14.png
    54,8 KB · Aufrufe: 2
  • Bildschirmfoto 2021-07-28 um 10.44.41.png
    Bildschirmfoto 2021-07-28 um 10.44.41.png
    103 KB · Aufrufe: 3
Nach meinem Test mit dem Mähmotor sind die States
IN1 = HIGH zugleich IN2 = HIGH
und
IN1 = LOW zugleich IN2 = LOW
illegal, weil beide den Motor kurzschließen und bremsen.
Man merkt das Bremsen auch wenn man die stehende Mähscheibe mit der Hand antreiben will, dass da gebremst wird.

Also ich finde nur die Lösung dass man ENABLE während der PWM=LOW Phasen synchronisiert abschaltet.

Hab ich was übersehen?

So würde der Treiber doch massenweise Energie verbraten?
 
Zuletzt bearbeitet:
Hier noch mein Testcode mit PWM Simulator.
Vorsicht! Mähmotor schaltet ein!!!

Code:
#define ARDUMOWER_MOTOR_MOW_FAULT  26
#define ARDUMOWER_MOTOR_MOW_IN2    29
#define ARDUMOWER_MOTOR_MOW_DIR    29
#define ARDUMOWER_MOTOR_MOW_ENA    28
#define ARDUMOWER_MOTOR_MOW_IN1    2
#define ARDUMOWER_MOTOR_MOW_PWM    2

#define ARDUMOWER_MOTOR_L_FAULT    25
#define ARDUMOWER_MOTOR_L_DIR      31
#define ARDUMOWER_MOTOR_L_PWM      5
#define ARDUMOWER_MOTOR_R_FAULT    27
#define ARDUMOWER_MOTOR_R_DIR      33
#define ARDUMOWER_MOTOR_R_PWM      3
#define ARDUMOWER_MOTOR_LR_ENA     37

#define ARDUMOWER_SPEAKER 53

int tin1 = LOW, tin2 = LOW;
bool drive = false, reverse=false, useEnable = false;

void simulatePWM()
{
    if(drive)
    {
      if(reverse)
      {
        tin1 = !tin1;
        tin2 = LOW;
      }
      else
      {
        tin1 = LOW;
        tin2 = !tin2;
      }
    }
    else
    {
        tin1 = LOW;
        tin2 = LOW;
    }

    mowerSet(tin1, tin2);
}

void mowerSet(int in1, int in2)
{
    if(useEnable)
      digitalWrite(ARDUMOWER_MOTOR_MOW_ENA, (in1 == LOW && in2 == LOW ? LOW : HIGH));
    else
      digitalWrite(ARDUMOWER_MOTOR_MOW_ENA, HIGH);
      
    digitalWrite(ARDUMOWER_MOTOR_MOW_IN1, in1);
    digitalWrite(ARDUMOWER_MOTOR_MOW_IN2, in2);
}

void mowerBrake()
{
    useEnable = false;
    mowerSet(LOW, LOW);
    drive = false;
}

void mowerBrake2()
{
    useEnable = false;
    mowerSet(HIGH, HIGH);
    drive = false;
}

void mowerFreerun()
{
    drive = false;
    useEnable = true;
    mowerSet(LOW, LOW);
}

void setup() {
    pinMode(13, OUTPUT);

    pinMode(ARDUMOWER_SPEAKER, OUTPUT);
    digitalWrite(ARDUMOWER_SPEAKER, LOW);  // ArdumowerBuzzer

    pinMode(ARDUMOWER_MOTOR_MOW_IN1, OUTPUT);
    pinMode(ARDUMOWER_MOTOR_MOW_IN2, OUTPUT);
    mowerSet(LOW, LOW);

    pinMode(ARDUMOWER_MOTOR_MOW_ENA, OUTPUT);
    digitalWrite(ARDUMOWER_MOTOR_MOW_ENA, HIGH);
}

unsigned int loopCounter = 0;

void loop() {
  loopCounter++;
  delay(300); // 600 ms PWM with 50% dutycycle

  switch(loopCounter)
    {
      case 10:
        useEnable = false; // Standard PWM
        drive=true; break;
      case 20:
        drive=false; break;
      case 30:
        drive=true; reverse=true; break;
      case 40:
        // Disable Motordriver if PWM == LOW this behavior I would expect from the driver
        useEnable = true;
        drive=true; break;
      case 60:        
        mowerBrake2(); break;
    }
      
  simulatePWM();
}
 
Folgendes hab ich über den MC33936 rausgefunden:
  • Bei zu geringer PWM Geschwindigkeit steigt der lastfreie Stromverbrauch der Motoren beim langsam Fahren z.B. 33% auf 1.2A rapide an und wird bei Vollgas 100%, geringer, so ca. 200mA.
  • Ab einer gewissen PWM Frequenz normalisiert sich der Stromverbrauch und langsamer fahren braucht weniger Strom.
  • MC33936 hat IN1 und IN2, die normalerweise wechselseitig mit IN1=LOW und IN2=PWM oder IN1=PWM und IN2=LOW beschaltet werden
  • Alternativ wie bei dieser Platine kann man aber IN1=PWM und IN2=LOW/HIGH schalten WENN man im Rückwärtsgang das PWM SIGNAL INVERTIERT also IN1=PWM und IN2=LOW oder Rückwärts IN1=~PWM (invertiertes PWM) und IN2=HIGH. Sonst fährt man bei 0 PWM mit 100% Motorleistung los.
  • MC33936 hat keinen Freilauf (ausser ENABLE = LOW) und bremst bei IN1=IN2 den Motor auf 0
  • MC33936 ist ein bremsender Motorcontroller, der die RPM des Motors aktiv nach PWM einstellt.
Jetzt frag ich mich ob das energieeffizient ist? Bei der Mähscheibe könnte man sich das Bremsen vermutlich sparen. Die ist ja ein Schwungrad und der Motorcontroller vernichtet beim reduzieren der RPM Energie.
 
Oben