10-09-2020, 17:11
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
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 ] ========================================================================