BLDC (nach Rading) - Poti als Geschwindigkeitsvorgabe verwenden

Gast #4742980
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?
Gast #4742998
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.
(Firma: matzetronics) #4743489
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren