Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert sind; Die von diesem Forum gesetzten Cookies düfen nur auf dieser Website verwendet werden und stellen kein Sicherheitsrisiko dar. Cookies auf diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Themabewertung:
  • 3 Bewertung(en) - 4 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Fahren mit 2 Autos pro Spur
#90
Hallo,

Ich habe auf Anregung von mos im Schaltplan die Betriebsspannung auf 12 Volt reduziert, dazu die Zenerdioden D10, D11, D14 und D15 von 12V auf 4,7 Volt abgeändert und ein paar Kleinigkeiten ergänzt. Und hier ist ein vorläufiger Code.

Ciao Finbar

Code:
/* AMS controller 2 State using PWM outputs V0.8.2.ino
//
// Before starting:
//
//    - double check direction of Zenerdiodes and measurement circuit to avoid 12V on Arduino input!
//    - use stabilized power supply 12 Volt!
//    - add heatsink to L293!
//    - check each car is using diode
//
//    - checked with and optimized for zinc motors
//
// controls 2 x 2 Faller AMS cars by measuring motor rpm via Back EMF and
// using L293N dual H bridge module, a CD4051 multiplexer and 4 potmeters
//
//  *** Version 0.8.2 preliminary ***
//       (c) Rainer Woerthmann
//
//
//  ->  No warranty
//  ->  Have fun
//
//
// ================================= [global variables ] ==========================================
*/
// input pin definition
const byte bemf1pin = A0;                                         //  Back-EMF input car 1 track A
const byte bemf2pin = A1;                                         //  Back-EMF input car 2 track A
const byte bemf3pin = A2;                                         //  Back-EMF input car 3 track B
const byte bemf4pin = A3;                                         //  Back-EMF input car 4 track B

const byte mx0 = 2;                                               //  to multiplexer 4051 pin 11, LSB
const byte mx1 = 3;                                               //  to multiplexer 4051 pin 10, HSB
const int analogPin =A5;                                          //  setpoint readings via multiplexer 4051, cars 1...4

// output pin definition H-bridge 1, track A (L293 V1 und V4)
const byte L293V1pin = 11;                                        //  track A, car 1, L293 pin 2, PWM
const byte L293V4pin = 6;                                         //  track A, car 2, L293 Pin 15, PWM

// output pin definition H-bridge 2, track B, (L293 V2 and V3)
const byte L293V2pin = 10;                                        //  track B, car 3, L293 pin 7, PWM
const byte L293V3pin = 9;                                         //  track B, car 4, L293 pin 10, PWM

// output pin definition H-bridge, high state
const byte L293V12ena = 7;                                        //  car 1+2 enable, L293 Pin 1
const byte L293V34ena = 8;                                        //  car 3+4 enable, L293 Pin 9

// constant value to equalize speed of different motors           //  increase value => car faster, decrease value => car slower
const byte carfactor1 = 3;                                        //  f.e. zinc, 5 or 6
const byte carfactor2 = 3;                                        //  Truck Flachanker = 1
const byte carfactor3 = 3;
const byte carfactor4 = 3;                                        //   

int Setpoint1, Setpoint2, Setpoint3, Setpoint4;                   //  setpoints cars 1...4
int bemf1,bemf2,bemf3,bemf4;                                      //  back-emf cars 1...4
int ref1,ref2,ref3,ref4;                                          //  reference values cars 1...4, standstill
int data1,data2;
byte pwm1,pwm2,pwm3,pwm4;                                         //  output cars 1...4
word i;                                                           //  counter

const int pulsetime =5000;                                        //  frequency (around (2*(5ms+4ms measurement))
                                                                  //  increase if motor does not start, decrease for running smooth
// =========================== [ set up ]=========================================================================

void setup() {

  Serial.begin(9600);                                             //  monitor everything
  Serial.println(" ");    
  Serial.println("START Programm AMS RPM controller");
 
  pinMode(2,OUTPUT);                                              //  multiplexer 4051, LSB                                         
  pinMode(3,OUTPUT);                                              //  multiplexer 4051, HSB
 
  pinMode(analogPin,INPUT);                                       //  setpoints cars 1...4
 
  pinMode(bemf1pin,INPUT);                                        //  back-emf car 1
  pinMode(bemf2pin,INPUT);                                        //  back-emf car 2
  pinMode(bemf3pin,INPUT);                                        //  back-emf car 3
  pinMode(bemf4pin,INPUT);                                        //  back-emf car 4
 
  pinMode(L293V12ena,OUTPUT);                                     //  H-bridge V 1,2 high state
  pinMode(L293V34ena,OUTPUT);                                     //  H-bridge V 3,4 high state
  digitalWrite(L293V12ena,LOW);
  digitalWrite(L293V34ena,LOW);
 
  pinMode(L293V1pin,OUTPUT);                                       // H bridge input, cars 1..4
  pinMode(L293V2pin,OUTPUT);
  pinMode(L293V3pin,OUTPUT);
  pinMode(L293V4pin,OUTPUT);
 
// read reference values
  digitalWrite(L293V34ena,LOW);                                    //  cars 1 + 3 high state
  digitalWrite(L293V1pin,HIGH);                                    //  car 1 to plus
  digitalWrite(L293V2pin,HIGH);                                    //  car 3 to plus
  digitalWrite(L293V12ena,HIGH);                                   //  cars 1 + 3 enable
  delay(1000);
 
      ref1 = analogRead(bemf1pin);                                 //  read reference (standstill) value car 1
      ref1 = constrain(ref1,300,950);
      ref3 = analogRead(bemf3pin);                                 //  read reference (standstill) value car 3
      ref3 = constrain(ref3,300,950);
 
  digitalWrite(L293V12ena,LOW);                                    //  cars 2 + 4 high state
  digitalWrite(L293V3pin,HIGH);                                    //  car2 to plus
  digitalWrite(L293V4pin,HIGH);                                    //  car 4 to plus
  digitalWrite(L293V34ena,HIGH);                                   //  cars 2+4 enable
  delay(1000);
 
      ref2 = analogRead(bemf2pin);                                  //  read reference (standstill) value car 2
      ref2 = constrain(ref2,300,950);
      ref4 = analogRead(bemf4pin);                                  //  read reference (standstill) value car 4
      ref4 = constrain(ref4,300,950);
                                           
  Serial.print(ref1,DEC);                                           // Show reference values   
  Serial.print(" ");
  Serial.print(ref2,DEC);
  Serial.print(" ");
  Serial.print(ref3,DEC);
  Serial.print(" ");
  Serial.println(ref4,DEC);
 
}                                                                   // end of setup
// =========================== [ main ] ==========================================================================
void loop() {
 
// 1. halfwave
    
        //  setup L293 for bemf measurement car 1 + 3
              digitalWrite(L293V34ena,LOW);                         //  L293 cars 1 + 3 high state
              digitalWrite(L293V1pin,HIGH);                         //  car 1 to plus
              digitalWrite(L293V2pin,HIGH);                         //  car 3 to plus
              digitalWrite(L293V12ena,HIGH);                       
              delayMicroseconds(500);                               //  allow settings (0,5ms)
       
        // measure bemf car 1 + 3
              
              bemf1 = 0;
              bemf3 = 0;
              
              for (i = 0; i < 20; i++) {                            //  do 20 readings
                  data1 = analogRead(bemf1pin);                     //  read supply voltage minus bemf car 1
                  if (data1 < 100){                                 //  poor contact?
                       data1 = ref1;
                       }
                   bemf1 += ref1-min(data1,ref1);                   //  calculate rpm car1
                                         
                   data2 = analogRead(bemf3pin);                    //  read supply voltage minus bemf car 3
                   if (data2 < 100) {                               //  poor contact??
                       data2 = ref3;
                       }
                   bemf3 += ref3-min(data2,ref3);                   //  calculate rpm car1  
                   }
        
       // return to pwm
              analogWrite(L293V1pin,pwm1);                          
              digitalWrite(L293V4pin,LOW);
              analogWrite(L293V2pin,pwm3);
              digitalWrite(L293V3pin,LOW);
              digitalWrite(L293V34ena,HIGH);                        //  end of measurement
      
       // calculate new PWM value car 1
              if (Setpoint1 < 1) {                                  
                    analogWrite(L293V1pin,0);                       //  standstill
                    }
              else {
                    if (bemf1 <1) {                                 //  f.e. poor contact
                       analogWrite(L293V1pin,255);                  //  add power car 1
                       }
 
                    else {
                         bemf1 = constrain(bemf1/carfactor1,0,1023);//  include carfactor
                         if (Setpoint1>bemf1) {                     //  power calculation car 1
                            pwm1 = 255;                             //  value may be reduced for smooth drive car1 (0...255)
                         }
                         else {                                     
                            pwm1 = 0;                               //  PWM off                                                 
                         }
                         analogWrite(L293V1pin,pwm1); }             //  write new PWM value car 1
                   }
                            
       // calculate new PWM value car 3                                
              if (Setpoint3 <1) {                                   
                     analogWrite(L293V2pin,0);                      //  standstill
                  }
              else {
                    if (bemf3 <1) {                                 //  f.e. poor contact
                       analogWrite(L293V2pin,255);                  //  add power car 3
                       }
                       
                    else {
                         bemf3 = constrain(bemf3/carfactor3,0,1023);// include carfactor
                         if (Setpoint3>bemf3) {                     // power calculation car3
                            pwm3 = 255;                             // value may be reduced for smooth drive car3 (0...255)
                         }
                         else {
                            pwm3 = 0;                               //  PWM off
                         }                                                                 }
                         analogWrite(L293V2pin,pwm3);               //  write new PWM value car 3                
                   }
          
        // check setpoints car 1 and 3
            digitalWrite(mx0,LOW);                                  //  initialize multiplexer 4051
            digitalWrite(mx1,LOW);
            Setpoint1 = (analogRead(analogPin));                    //  read Setpoint 1
            digitalWrite(mx1,HIGH);                                 //  
            Setpoint3 = analogRead(analogPin);                      //  read Setpoint 3
       
            Serial.print(Setpoint1,DEC);                                
            Serial.print(" ");
         /* Serial.print(bemf1,DEC);                                    //  helpful for diagnose
            Serial.println("   "); */
            Serial.print(Setpoint2,DEC);
            Serial.print(" ");
         /* Serial.print(bemf2;DEC);                                    //  helpful for diagnose
            Serial.print("   ");   */       
            
            delayMicroseconds(pulsetime);                           //  hold signal until end of halfwave
     
     // end 1. halfwave       
   
     // 2. halfwave
     
       // setup L293 for bemf measurement car 2 + 4
             digitalWrite(L293V12ena,LOW);                          //  L293 cars 2 + 4 high state
             digitalWrite(L293V3pin,HIGH);                          //  car 2 to plus
             digitalWrite(L293V4pin,HIGH);                          //  car 4 to plus  
             digitalWrite(L293V34ena,HIGH);         
             delayMicroseconds(500);                                //  allow settings (0,5ms)
        
       // measure bemf car 2 + 4
       
             bemf2 = 0;
             bemf4 = 0;
             
             for ( i = 0; i < 20; i++) {                            //  do 20 readings
                   data1 = analogRead(bemf2pin);                    //  read supply voltage minus bemf car 2
                   if (data1 < 100){                                //  poor contact?
                       data1 = ref2;
                       }
                   bemf2 += ref2-min(data1,ref2);     //  calculate rpm car 2
                                      
                   data2 = analogRead(bemf4pin);                    //  read supply voltage minus bemf car4
                   if (data2 < 100) {                               //  poor contact?
                       data2= ref4;
                       }
                   bemf4 +=ref4-min(data2,ref4);     //  calculate rpm car 4
                   }
             
        // return to pwm  
             analogWrite(L293V4pin,pwm2);
             digitalWrite(L293V1pin,LOW);
             analogWrite(L293V3pin,pwm4);                      
             digitalWrite(L293V2pin,LOW);
             digitalWrite(L293V12ena,HIGH);                         // end of measurement
    
        // calculate new PWM value car 2
             if (Setpoint2 < 1) {                                                     
                 analogWrite(L293V4pin,0);                          //  standstill  
                  }
              else {
                    if (bemf2 < 1) {                                //  f.e. poor contact
                        analogWrite(L293V4pin,1);                   //  add power car 2
                        }
                    else {
                        bemf2 = constrain(bemf2/carfactor2,0,1023);  //  include carfactor
                        if (Setpoint2>bemf2) {
                            pwm2 = 255;                              //   value may be reduced for smooth drive car2 (0...255)
                            }
                        else {
                            pwm2 = 0;                                //  PWM off
                            }                                    
                        analogWrite(L293V4pin,pwm2);                 //  write new PWM value car 2
                         }
                   }
           
       // calculate new PWM value car 4
            if (Setpoint4 < 1) {
                  digitalWrite(L293V3pin,0);                          //  standstill
                  }
              else {
                    if (bemf4<1) {                                     //  f.e. poor contact
                        analogWrite(L293V3pin,255);                    //  add power car 4
                        }
                    else {
                         bemf4 = constrain(bemf4/carfactor4,0,1023);   //  include carfactor
                         if (Setpoint4>bemf4) {                        //  power calculation car 4
                             pwm4 = 255;                               //  value may be reduced for smooth drive car 4 (0...255)
                             }
                         else {
                             pwm4 = 0;                                 //  PWM off
                             }                                                  
                         digitalWrite(L293V3pin,pwm4);                 //  write new PWM value car 4
                         }
                   }
     
     // check setpoints car 2 and 4    
           digitalWrite(mx0,HIGH);                                    //  initialize multiplexer 4051
           digitalWrite(mx1,LOW);
           Setpoint2 = (analogRead(analogPin));                       //  read Setpoint 2
           digitalWrite(mx1,HIGH);
           Setpoint4=(analogRead(analogPin));                         //  read Setpoint 4
     
           
           Serial.print(Setpoint3,DEC);                               //  need for diagnose purposes only
           Serial.print(" ");
        /* Serial.print(bemf4,DEC);                                   // helpful for diagnose
           Serial.print("  ");*/
           Serial.print(Setpoint4,DEC);
     /*    Serial.print(" ");                                         // helpful for diagnose
           Serial.print(bemf4,DEC);*/
           Serial.println(" ");
        
           delayMicroseconds(pulsetime);                              //  hold signal until end of halfwave
    
}                                                                     //  repeat forever
            



 
 
// ==========================[ end main ] ========================================================================


Angehängte Dateien
.pdf   AMS Control 1.4.pdf (Größe: 47,88 KB / Downloads: 34)
Zitieren


Nachrichten in diesem Thema
Fahren mit 2 Autos pro Spur - von Maexhoe - 19-11-2018, 16:22
RE: Fahren mit 2 Autos pro Spur - von bert - 19-11-2018, 21:15
RE: Fahren mit 2 Autos pro Spur - von mos - 19-11-2018, 23:12
RE: Fahren mit 2 Autos pro Spur - von MX1954LL - 20-11-2018, 14:52
RE: Fahren mit 2 Autos pro Spur - von Loddar M - 20-11-2018, 18:21
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 20-11-2018, 22:03
RE: Fahren mit 2 Autos pro Spur - von mos - 21-11-2018, 00:26
RE: Fahren mit 2 Autos pro Spur - von cw658 - 21-11-2018, 00:34
RE: Fahren mit 2 Autos pro Spur - von MicMac - 21-11-2018, 00:35
RE: Fahren mit 2 Autos pro Spur - von mos - 21-11-2018, 00:46
RE: Fahren mit 2 Autos pro Spur - von cw658 - 21-11-2018, 00:57
RE: Fahren mit 2 Autos pro Spur - von mos - 21-11-2018, 01:09
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 21-11-2018, 13:44
RE: Fahren mit 2 Autos pro Spur - von cw658 - 21-11-2018, 14:23
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 21-11-2018, 16:08
RE: Fahren mit 2 Autos pro Spur - von MX1954LL - 21-11-2018, 16:30
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 21-11-2018, 18:16
RE: Fahren mit 2 Autos pro Spur - von Loddar M - 22-11-2018, 05:29
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 22-11-2018, 10:46
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 22-11-2018, 21:52
RE: Fahren mit 2 Autos pro Spur - von mos - 22-11-2018, 22:49
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 22-11-2018, 23:27
RE: Fahren mit 2 Autos pro Spur - von cw658 - 22-11-2018, 23:48
RE: Fahren mit 2 Autos pro Spur - von mos - 23-11-2018, 18:20
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 23-11-2018, 18:30
RE: Fahren mit 2 Autos pro Spur - von Hebi - 24-11-2018, 00:27
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 24-11-2018, 13:21
RE: Fahren mit 2 Autos pro Spur - von cw658 - 24-11-2018, 13:38
RE: Fahren mit 2 Autos pro Spur - von mos - 25-11-2018, 01:29
RE: Fahren mit 2 Autos pro Spur - von Loddar M - 25-11-2018, 07:31
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 25-11-2018, 10:54
RE: Fahren mit 2 Autos pro Spur - von cw658 - 25-11-2018, 13:58
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 30-11-2018, 11:30
RE: Fahren mit 2 Autos pro Spur - von Hebi - 30-11-2018, 14:16
RE: Fahren mit 2 Autos pro Spur - von cw658 - 30-11-2018, 11:55
RE: Fahren mit 2 Autos pro Spur - von mos - 30-11-2018, 15:35
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 30-11-2018, 16:42
RE: Fahren mit 2 Autos pro Spur - von MX1954LL - 01-12-2018, 00:10
RE: Fahren mit 2 Autos pro Spur - von cw658 - 01-12-2018, 00:16
RE: Fahren mit 2 Autos pro Spur - von rocket - 01-12-2018, 00:41
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 01-12-2018, 14:03
RE: Fahren mit 2 Autos pro Spur - von cw658 - 01-12-2018, 14:39
RE: Fahren mit 2 Autos pro Spur - von MX1954LL - 01-12-2018, 15:05
RE: Fahren mit 2 Autos pro Spur - von mos - 03-12-2018, 00:19
RE: Fahren mit 2 Autos pro Spur - von 72Sonett - 07-12-2018, 00:14
RE: Fahren mit 2 Autos pro Spur - von 72Sonett - 10-12-2018, 15:18
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 10-12-2018, 17:17
RE: Fahren mit 2 Autos pro Spur - von 72Sonett - 10-12-2018, 21:56
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 10-12-2018, 22:00
RE: Fahren mit 2 Autos pro Spur - von 72Sonett - 10-12-2018, 22:35
RE: Fahren mit 2 Autos pro Spur - von mos - 11-05-2019, 13:07
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 11-05-2019, 13:23
RE: Fahren mit 2 Autos pro Spur - von Rainerr - 06-01-2020, 23:24
RE: Fahren mit 2 Autos pro Spur - von Maexhoe - 07-01-2020, 11:23
RE: Fahren mit 2 Autos pro Spur - von hubert - 12-01-2020, 21:48
RE: Fahren mit 2 Autos pro Spur - von mos - 12-01-2020, 23:59
RE: Fahren mit 2 Autos pro Spur - von hubert - 18-01-2020, 19:30
RE: Fahren mit 2 Autos pro Spur - von MX1954LL - 24-01-2020, 23:11
RE: Fahren mit 2 Autos pro Spur - von hubert - 25-01-2020, 01:26
RE: Fahren mit 2 Autos pro Spur - von MX1954LL - 25-01-2020, 11:38
RE: Fahren mit 2 Autos pro Spur - von hubert - 25-01-2020, 12:01
RE: Fahren mit 2 Autos pro Spur - von MX1954LL - 27-01-2020, 15:38
RE: Fahren mit 2 Autos pro Spur - von hubert - 28-01-2020, 00:56
RE: Fahren mit 2 Autos pro Spur - von MX1954LL - 30-01-2020, 15:13
RE: Fahren mit 2 Autos pro Spur - von hubert - 30-01-2020, 15:58
RE: Fahren mit 2 Autos pro Spur - von hubert - 06-02-2020, 00:14
RE: Fahren mit 2 Autos pro Spur - von mos - 06-02-2020, 10:15
RE: Fahren mit 2 Autos pro Spur - von hubert - 06-02-2020, 23:42
RE: Fahren mit 2 Autos pro Spur - von MX1954LL - 20-03-2020, 20:09
RE: Fahren mit 2 Autos pro Spur - von finbar - 05-09-2020, 18:33
RE: Fahren mit 2 Autos pro Spur - von HeHo - 06-09-2020, 20:46
RE: Fahren mit 2 Autos pro Spur - von MX1954LL - 06-09-2020, 12:49
RE: Fahren mit 2 Autos pro Spur - von finbar - 06-09-2020, 21:01
RE: Fahren mit 2 Autos pro Spur - von mos - 06-09-2020, 23:21
RE: Fahren mit 2 Autos pro Spur - von finbar - 07-09-2020, 01:58
RE: Fahren mit 2 Autos pro Spur - von finbar - 08-09-2020, 16:15
RE: Fahren mit 2 Autos pro Spur - von mos - 09-09-2020, 11:21
RE: Fahren mit 2 Autos pro Spur - von finbar - 09-09-2020, 21:54
RE: Fahren mit 2 Autos pro Spur - von finbar - 10-09-2020, 17:11
RE: Fahren mit 2 Autos pro Spur - von 72Sonett - 11-09-2020, 19:58
RE: Fahren mit 2 Autos pro Spur - von finbar - 11-09-2020, 22:09
RE: Fahren mit 2 Autos pro Spur - von 72Sonett - 11-09-2020, 23:09
RE: Fahren mit 2 Autos pro Spur - von finbar - 12-09-2020, 00:30
RE: Fahren mit 2 Autos pro Spur - von 72Sonett - 12-09-2020, 23:53
RE: Fahren mit 2 Autos pro Spur - von finbar - 23-11-2020, 14:43
RE: Fahren mit 2 Autos pro Spur - von mos - 23-11-2020, 16:31

Gehe zu:


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