INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
H-Brücke für Anwendung berechnen
11.10.2014, 13:28
Beitrag #17
RE: H-Brücke für Anwendung berechnen
(11.10.2014 13:23)HaWe schrieb:  wie tito und andere schon schrieben:
wenn es ohne Umpolung funktioniert, dann ohne Umpolung.

Da aber ohne Umpolung offenbar nicht der von dir gewünschte Effekt schnell genug eintritt, hieße das für mich logischerweise:
dann also PI oder PID MIT Umpolung.
Ok,
aber mir ist nicht klar, wie ich den Arduino-PID so verknüpfe im Programm, dass er bei Überschreitung der Temperatur mit Umpolung regelt, also das "vorherige Regeln" mit Vorzeichenwechsel sozusagen.

Gruß
Cray-1
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.10.2014, 14:06 (Dieser Beitrag wurde zuletzt bearbeitet: 11.10.2014 14:23 von HaWe.)
Beitrag #18
RE: H-Brücke für Anwendung berechnen
das macht der PID-regler automatisch, wenn du ihn richtig initialisierst. Das aber ist wiederum abhängig von den Eingangswerten, die deine H-Bridge erwartet.

für die L293/298-kompatiblen H-Bridges weiß ich es, die verwende ich selber.

Hier ist mein PID-Code für L293-Motortreiber:

Code:
//********************************************************************************​****
// global motor & PID variables
//********************************************************************************​****

    volatile long   motenc[MAXMOTORS]    = {0,0,0,0,0,0},
                    oldenc[MAXMOTORS]    = {0,0,0,0,0,0};

    double  PIDsetpoint[MAXMOTORS],
            PIDinput[MAXMOTORS],
            PIDoutput[MAXMOTORS];
    int     OUTregstate[MAXMOTORS];
    float   PIDencgap[MAXMOTORS];

//------------------------------------------------------------------------------------



    // PID tuning parameters
    PID PIDs[] =
    {   PID (&PIDinput[ 0], &PIDoutput[ 0], &PIDsetpoint[ 0],  20,50,1, DIRECT) ,
        PID (&PIDinput[ 1], &PIDoutput[ 1], &PIDsetpoint[ 1],  20,50,1, DIRECT) ,
        PID (&PIDinput[ 2], &PIDoutput[ 2], &PIDsetpoint[ 2],  20,50,1, DIRECT) ,
        PID (&PIDinput[ 3], &PIDoutput[ 3], &PIDsetpoint[ 3],  20,50,1, DIRECT) ,
        PID (&PIDinput[ 4], &PIDoutput[ 4], &PIDsetpoint[ 4],  20,50,1, DIRECT) ,
        PID (&PIDinput[ 5], &PIDoutput[ 5], &PIDsetpoint[ 5],  20,50,1, DIRECT) };

    #define  PID_REGTIME_MS       5
    #define  PID_REG_PREC         1

    #define  PID_REGMAX         255
    #define  PID_REGMIN        -255
    
    const float  PWM_SCALE_F = 2.55;  // pwm +/- 100 ==> +/-255

void setup() {

   // reset PID parameters

     for (int i=0; i<MAXMOTORS; ++i) {
       PIDs[ i].SetMode(AUTOMATIC);
       PIDs[ i].SetOutputLimits(PID_REGMIN, PID_REGMAX);
       PIDs[ i].SetSampleTime(PID_REGTIME_MS);
       PIDsetpoint[ i] = 0;                     // set target,
       OUTregstate[ i] = OUT_REGSTATE_IDLE;     // switch the PID on to motor[i]
     }

}

//********************************************************************************​****
// motor control
//********************************************************************************​****

inline void motoron(int motnr, int power) {
      if(power>0) {
           digitalWrite( pinmotdir[motnr][0],HIGH);
           digitalWrite( pinmotdir[motnr][1],LOW);
      }  else  if(power<0) {
           digitalWrite( pinmotdir[motnr][0],LOW);
           digitalWrite( pinmotdir[motnr][1],HIGH);
      }  else  if(power==0) {
           digitalWrite( pinmotdir[motnr][0],LOW);
           digitalWrite( pinmotdir[motnr][1],LOW);
      }
      power = abs(power);
      if(power>PID_REGMAX) power=PID_REGMAX;
      analogWrite( pinmotpwm[motnr], power);
}

//------------------------------------------------------------------------------------

inline void motorcoast(int motnr) {
      digitalWrite( pinmotdir[motnr][0],LOW);
      digitalWrite( pinmotdir[motnr][1],LOW);
      analogWrite( pinmotpwm[motnr], 0); // 1?
}

//------------------------------------------------------------------------------------

#define     motoroff    motorcoast




//********************************************************************************​****
// PID regulation
//********************************************************************************​****

void  PIDupdate( byte nr)
{
       PIDinput[nr]  = motenc[nr];
       PIDencgap[nr] = abs(PIDsetpoint[nr]-PIDinput[nr]); //distance away from setpoint

       if ( OUTregstate[nr]==OUT_REGSTATE_PIDACTIVE  || OUTregstate[nr]==OUT_REGSTATE_PIDHOLD)  
       {
          PIDs[nr].Compute();
          PIDs[nr].SetTunings(40, 200, 1.2);
      
          if ( PIDencgap[nr]>PID_REG_PREC
          && ( OUTregstate[nr]==OUT_REGSTATE_PIDACTIVE || OUTregstate[nr]==OUT_REGSTATE_PIDHOLD) )
          {
             motoron(nr, PIDoutput[nr]);
          }    
       }
  
}

//------------------------------------------------------------------------------------

void PIDcheckok (byte nr) {
       if(__mainloopcnt__ >=MAXMAINCOUNTER) {              // totally stopped after several loops delay ?
        
         if( PIDencgap[nr]<=PID_REG_PREC && abs(oldenc[nr]-motenc[nr])<1
         && abs(PIDoutput[nr]<PID_REGMAX/2 )
         && OUTregstate[nr]!=OUT_REGSTATE_PIDHOLD
         && OUTregstate[nr]==OUT_REGSTATE_PIDACTIVE  )
      {
           PIDs[nr].SetMode(MANUAL);
           PIDs[nr].SetTunings( 0,  0, 0);
           OUTregstate[nr]=OUT_REGSTATE_IDLE;
           motoroff(nr);
         }
       }
}


void loop()
{
       //...
       // motor and PID handling
       for(int i=0; i< MAXMOTORS ; ++i) PIDupdate( i);   // regulate motors
       for(int i=0; i< MAXMOTORS ; ++i) PIDcheckok( i);  // switch off when target reached

}



Es ist aber schwierig, zugegeben.



ps,
hier ist die Anleitung zur PID library falls du sie noch nicht kennst.
Hiernach habe ich auch meinen PID controller implementiert:

http://playground.arduino.cc/Code/PIDLibrary



pps,
Was soll das denn eigentlich werden?
Eine Klimaanlage für Gewächshäuschen? Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2014, 14:20 (Dieser Beitrag wurde zuletzt bearbeitet: 12.10.2014 14:35 von Cray-1.)
Beitrag #19
RE: H-Brücke für Anwendung berechnen
(11.10.2014 14:06)HaWe schrieb:  das macht der PID-regler automatisch, wenn du ihn richtig initialisierst. Das aber ist wiederum abhängig von den Eingangswerten, die deine H-Bridge erwartet.

für die L293/298-kompatiblen H-Bridges weiß ich es, die verwende ich selber.

Hier ist mein PID-Code für L293-Motortreiber:

Code:
//********************************************************************************​****
// global motor & PID variables
//********************************************************************************​****

    volatile long   motenc[MAXMOTORS]    = {0,0,0,0,0,0},
                    oldenc[MAXMOTORS]    = {0,0,0,0,0,0};

    double  PIDsetpoint[MAXMOTORS],
            PIDinput[MAXMOTORS],
            PIDoutput[MAXMOTORS];
    int     OUTregstate[MAXMOTORS];
    float   PIDencgap[MAXMOTORS];

//------------------------------------------------------------------------------------



    // PID tuning parameters
    PID PIDs[] =
    {   PID (&PIDinput[ 0], &PIDoutput[ 0], &PIDsetpoint[ 0],  20,50,1, DIRECT) ,
        PID (&PIDinput[ 1], &PIDoutput[ 1], &PIDsetpoint[ 1],  20,50,1, DIRECT) ,
        PID (&PIDinput[ 2], &PIDoutput[ 2], &PIDsetpoint[ 2],  20,50,1, DIRECT) ,
        PID (&PIDinput[ 3], &PIDoutput[ 3], &PIDsetpoint[ 3],  20,50,1, DIRECT) ,
        PID (&PIDinput[ 4], &PIDoutput[ 4], &PIDsetpoint[ 4],  20,50,1, DIRECT) ,
        PID (&PIDinput[ 5], &PIDoutput[ 5], &PIDsetpoint[ 5],  20,50,1, DIRECT) };

    #define  PID_REGTIME_MS       5
    #define  PID_REG_PREC         1

    #define  PID_REGMAX         255
    #define  PID_REGMIN        -255
    
    const float  PWM_SCALE_F = 2.55;  // pwm +/- 100 ==> +/-255

void setup() {

   // reset PID parameters

     for (int i=0; i<MAXMOTORS; ++i) {
       PIDs[ i].SetMode(AUTOMATIC);
       PIDs[ i].SetOutputLimits(PID_REGMIN, PID_REGMAX);
       PIDs[ i].SetSampleTime(PID_REGTIME_MS);
       PIDsetpoint[ i] = 0;                     // set target,
       OUTregstate[ i] = OUT_REGSTATE_IDLE;     // switch the PID on to motor[i]
     }

}

//********************************************************************************​****
// motor control
//********************************************************************************​****

inline void motoron(int motnr, int power) {
      if(power>0) {
           digitalWrite( pinmotdir[motnr][0],HIGH);
           digitalWrite( pinmotdir[motnr][1],LOW);
      }  else  if(power<0) {
           digitalWrite( pinmotdir[motnr][0],LOW);
           digitalWrite( pinmotdir[motnr][1],HIGH);
      }  else  if(power==0) {
           digitalWrite( pinmotdir[motnr][0],LOW);
           digitalWrite( pinmotdir[motnr][1],LOW);
      }
      power = abs(power);
      if(power>PID_REGMAX) power=PID_REGMAX;
      analogWrite( pinmotpwm[motnr], power);
}

//------------------------------------------------------------------------------------

inline void motorcoast(int motnr) {
      digitalWrite( pinmotdir[motnr][0],LOW);
      digitalWrite( pinmotdir[motnr][1],LOW);
      analogWrite( pinmotpwm[motnr], 0); // 1?
}

//------------------------------------------------------------------------------------

#define     motoroff    motorcoast




//********************************************************************************​****
// PID regulation
//********************************************************************************​****

void  PIDupdate( byte nr)
{
       PIDinput[nr]  = motenc[nr];
       PIDencgap[nr] = abs(PIDsetpoint[nr]-PIDinput[nr]); //distance away from setpoint

       if ( OUTregstate[nr]==OUT_REGSTATE_PIDACTIVE  || OUTregstate[nr]==OUT_REGSTATE_PIDHOLD)  
       {
          PIDs[nr].Compute();
          PIDs[nr].SetTunings(40, 200, 1.2);
      
          if ( PIDencgap[nr]>PID_REG_PREC
          && ( OUTregstate[nr]==OUT_REGSTATE_PIDACTIVE || OUTregstate[nr]==OUT_REGSTATE_PIDHOLD) )
          {
             motoron(nr, PIDoutput[nr]);
          }    
       }
  
}

//------------------------------------------------------------------------------------

void PIDcheckok (byte nr) {
       if(__mainloopcnt__ >=MAXMAINCOUNTER) {              // totally stopped after several loops delay ?
        
         if( PIDencgap[nr]<=PID_REG_PREC && abs(oldenc[nr]-motenc[nr])<1
         && abs(PIDoutput[nr]<PID_REGMAX/2 )
         && OUTregstate[nr]!=OUT_REGSTATE_PIDHOLD
         && OUTregstate[nr]==OUT_REGSTATE_PIDACTIVE  )
      {
           PIDs[nr].SetMode(MANUAL);
           PIDs[nr].SetTunings( 0,  0, 0);
           OUTregstate[nr]=OUT_REGSTATE_IDLE;
           motoroff(nr);
         }
       }
}


void loop()
{
       //...
       // motor and PID handling
       for(int i=0; i< MAXMOTORS ; ++i) PIDupdate( i);   // regulate motors
       for(int i=0; i< MAXMOTORS ; ++i) PIDcheckok( i);  // switch off when target reached

}



Es ist aber schwierig, zugegeben.



ps,
hier ist die Anleitung zur PID library falls du sie noch nicht kennst.
Hiernach habe ich auch meinen PID controller implementiert:

http://playground.arduino.cc/Code/PIDLibrary



pps,
Was soll das denn eigentlich werden?
Eine Klimaanlage für Gewächshäuschen? Big Grin
Nein,
ich will einfach nur eine Temperatur von 0 bis 100° C mit einem Peltier-Element erzeugen und halten.

Wo initialisiert man den PID-Regler von Arduino für die Umpolung? Im eigenen Code oder muss man die Library verändern?

Gruß
Cray-1
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2014, 17:09 (Dieser Beitrag wurde zuletzt bearbeitet: 12.10.2014 17:12 von HaWe.)
Beitrag #20
RE: H-Brücke für Anwendung berechnen
http://playground.arduino.cc/Code/PIDLib...tputLimits

guckst du in der Setup-Routine:

PID.SetMode(AUTOMATIC);
PID.SetOutputLimits(PID_REGMIN, PID_REGMAX);
PID.SetSampleTime(PID_REGTIME_MS);


du brauchst übrigens nicht meinen gesamten Post mitzukopieren, wenn du antwortest - das macht es nur unübersichtlicher Undecided
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.10.2014, 19:56
Beitrag #21
RE: H-Brücke für Anwendung berechnen
Benutze die Umpolung jetzt nur, um unter die Raumtemperatur zu gelangen. Die Regelung funktioniert soweit mit Fremdkühlung. Ich habe mir das so gedacht, dass ich sagen if(Solltemperatur>Raumtemperatur) regel nach oben; if(Solltemperatur<Raumtemperatur) pole um und regel dann z. B. 10° C. Der Tempsensor ist ja dann nach wie vor an der Kaltseite und die PWM wird dann so geregelt, bis 10° C anliegt. Für die Umpolung verwende ich das Arduino Motor Shield.
Wäre das so sinnvoll?

Cray-1
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Gewichteten Durchschnitt berechnen, 20 Werte in fortlaufender Variable speichern TimeMen 10 476 03.07.2016 09:00
Letzter Beitrag: Binatone
  Aluminium-Block, Wärmemenge berechnen Cray-1 9 1.909 31.10.2014 19:40
Letzter Beitrag: Cray-1

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste