Forum: Mikrocontroller und Digitale Elektronik BLDC (nach Rading) - Poti als Geschwindigkeitsvorgabe verwenden


von Jonas (Gast)


Lesenswert?

Wer kann mir bitte nochmal weiterhelfen?

Ich habe mir einen BLDC Motorcontroller nach "Ulrich Rading" gebaut, 
welcher auch soweit gut funktioniert.

Allerdings würde ich gerne die Drehzahl per Poti einstellen können.

Nur, was vor ein paar Tagen wunderbar funktioniert hatte, klappt heute 
nicht mehr.

Im Grunde habe ich mich an das gehalten, was ich hier gefunden habe:
http://www.fingers-welt.de/phpBB/viewtopic.php?f=14&t=1406

und auch so eingefügt:

//##################################################################
void next_commutate_state (unsigned char startup)
//##################################################################


{

/*
//Potiwert einlesen

ACSR &= ~(1<<ACIE);                  //ANALOG_COMP_vect interrupt 
deaktivieren
  ADMUX = (0<<REFS1) | (0<<REFS0);           //Externe Referenzspannung 
verwenden
  ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);    //Vorteiler = 128 => 
125kHz
  ADCSRA |= (1 << ADEN);                // ADC aktivieren

  old_ADMUX =ADMUX;                  //ADMUX zwischenspeichern
  ADMUX = POTI;                    // Kanal für Poti wählen (ADMUX = 5)

  ADCSRA |= (1 << ADSC);                // eine ADC-Wandlung
  while (ADCSRA & (1 << ADSC)) {            // auf Abschluss der 
Konvertierung warten
  }
  rx_pwm = ADCW >> 2;                  // MSB in rx_pwm lesen
  ADCSRA &= ~(1 << ADEN);                // ADC deaktivieren

  ADMUX = old_ADMUX;                  // AMDUX zurücksetzen

  ACSR &= ~(1<<ACIE);                  // ANALOG_COMP_vect interrupt 
aktivieren

*/

  switch (rotor_state)
  {
    case (0):
      if(!SENSE_H || startup)
      {
        WH_OFF;
        UH_ON;
        SENSE_W;
        rotor_state = 1;
        TCNT1 = 1;
      }
      break;

.
.
.



Das Problem ist aber, das der Controller völlig aus dem Takt kommt, 
sobald ich die Potimessung einkommentiere. Heißt, er findet 
überhauptnicht mehr in den Interruptbetrieb bzw. der Motor läuft sehr 
Ruckartig.


Dies war vorgestern noch anders, alles was ich verändert habe, ist ein 
neuer Prozessor und ein 16MHz Quarz anstatt von 8Mhz. Allerdings habe 
ich den Vorteiler des ADCs daher angepasst, sodass er auf 125kHz liegt.

Hat schonmal jemand gleiches erfolgreich Versucht und kann mir ein paar 
Tips geben?

von Jonas (Gast)


Lesenswert?

Um es nochmal anders zu formulieren,

es ist egal, ob ich den gemessenen Wert rx_pwm verwenden, oder nicht. 
Sobald ich die ADC-Potimessung einkommentiere, kommt der Motor nicht 
mehr in Gang. Also bremst diese das ganze System aus.

Nur, wie gesagt. Vor kurzem hat es noch genau so funktioniert.

von Jonas (Gast)


Lesenswert?

Kennt vielleicht jemand einen funktionierenden Beispielcode zu dem 
Thema?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Jonas schrieb:
> while (ADCSRA & (1 << ADSC)) {            // auf Abschluss der
> Konvertierung warten
>   }

Da währenddessen nichts anderes mehr geht (denn der ADCOMP Interrupt ist 
ja auch gesperrt), ist das recht mutig. Das steht ja auch so bei Fingers 
Welt:
>Beim Gas geben muss man allerdings ein wenig sachte sein, sonst
> verschluckt er sich gern, aber damit kann ich leben.

Der nächste Punkt ist das Überschreiben von ADMUX:
Einmal
>   ADMUX = (0<<REFS1) | (0<<REFS0); //Externe Referenzspannung
> verwenden
Und dann gleich
>  ADMUX = POTI;                    // Kanal für Poti wählen (ADMUX = 5)
Ich hoffe, das 'POTI' bei dir auch richtig definiert ist.

Das haut so aber trotzdem nicht hin, denn dann ist das vorherige 
Beschreiben sinnlos. Mach dir lieber ein #define, indem du REF und Kanal 
gleichzeitig setzt und schreib das in einem Rutsch auf ADMUX. Im Moment 
kann das gerade so klappen, denn REFS ist bei dir auf 0, aber trotzdem 
mal im Auge behalten. Was ist denn am AREF Pin angeschlossen?

Das ist aber alles recht heikel, denn der ADCOMP-Job ist so ziemlich das 
wichtigste bei diesem BLDC Kontroller.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.