(12-09-2020, 00:30)finbar schrieb: Das kann mit dem Uno schon funktionieren. ... in der Software nur alle analogWrite(..,255) ersetzen durch digitalWrite(...,HIGH) ...
Das habe ich gemacht, das Programm für 4 Autos sieht dann so aus:
Code:
// AMS controller 2 State using PWM outputs V0.8.2
//
// Before starting:
//
// - double check direction of Zenerdiodes and measurement circuit to avoid 12 V 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
//
// ---------------------------------------------------------------
// *** Version 0.8.3 preliminary ***
// analogWrite() replaced with digitalWrite()
// pwm1,pwm2,pwm3,pwm4 variables eliminated
//
// ================================= [global variables ] ==========================================
//
// input pin definitions feedback voltage
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 setpointspin =A5; // setpoint potmeter 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 out
const byte L293V4pin = 6; // track A, car 2, L293 Pin 15, PWM out
// output pin definition H-bridge 2, track B, (L293 V2 and V3)
const byte L293V2pin = 10; // track B, car 3, L293 pin 7, PWM out
const byte L293V3pin = 9; // track B, car 4, L293 pin 10, PWM out
// output pin definition H-bridge, high state
const byte L293V12ENpin = 7; // car 1+2 enable, L293 Pin 1, dig out
const byte L293V34ENpin = 8; // car 3+4 enable, L293 Pin 9, dig out
// 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(setpointspin,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(L293V12ENpin,OUTPUT); // enable H-bridge V 1,2 high state
pinMode(L293V34ENpin,OUTPUT); // enable H-bridge V 3,4 high state
digitalWrite(L293V12ENpin,LOW);
digitalWrite(L293V34ENpin,LOW);
pinMode(L293V1pin,OUTPUT); // H bridge input, cars 1..4
pinMode(L293V2pin,OUTPUT);
pinMode(L293V3pin,OUTPUT);
pinMode(L293V4pin,OUTPUT);
// reference values
digitalWrite(L293V34ENpin,LOW); // cars 1 + 3 high state
digitalWrite(L293V1pin,HIGH); // car 1 to plus
digitalWrite(L293V2pin,HIGH); // car 3 to plus
digitalWrite(L293V12ENpin,HIGH); // cars 1 + 3 enable
delay(1000);
ref1 = constrain(analogRead(bemf1pin),300,950); // read reference (standstill) value car 1
ref3 = constrain(analogRead(bemf3pin),300,950); // read reference (standstill) value car 3
digitalWrite(L293V12ENpin,LOW); // cars 2 + 4 high state
digitalWrite(L293V3pin,HIGH); // car2 to plus
digitalWrite(L293V4pin,HIGH); // car 4 to plus
digitalWrite(L293V34ENpin,HIGH); // cars 2+4 enable
delay(1000);
ref2 = constrain(analogRead(bemf2pin),300,950); // read reference (standstill) value car 2
ref4 = constrain(analogRead(bemf4pin),300,950); // read reference (standstill) value car 4
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(L293V34ENpin,LOW); // L293 cars 1 + 3 high state
digitalWrite(L293V1pin,HIGH); // car 1 to plus
digitalWrite(L293V2pin,HIGH); // car 3 to plus
digitalWrite(L293V12ENpin,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 car3
}
// return to pwm
//analogWrite(L293V1pin,pwm1); // pwm1 VALUE IS NOT INITIALISED !
digitalWrite(L293V4pin,LOW);
//analogWrite(L293V2pin,pwm3); // pwm3 VALUE IS NOT INITIALISED !
digitalWrite(L293V3pin,LOW);
digitalWrite(L293V34ENpin,HIGH); // end of measurement
// calculate new PWM value car 1
if (setpoint1 < 1) {
//analogWrite(L293V1pin,0);
digitalWrite(L293V1pin,LOW); // standstill
}
else {
if (bemf1 <1) { // f.e. poor contact
//analogWrite(L293V1pin,255); // add power car 1
digitalWrite(L293V1pin,HIGH); // add power car 1
}
else {
bemf1 = constrain(bemf1/carfactor1,0,1023);// include carfactor
if (setpoint1>bemf1) { // power calculation car 1
//pwm1 = 255; // xxxxxxxxxxx
digitalWrite(L293V1pin,HIGH); // write new PWM value car 1
}
else {
//pwm1 = 0; // PWM off
digitalWrite(L293V1pin,LOW); // write new PWM value car 1
}
//analogWrite(L293V1pin,pwm1); // write new PWM value car 1
}
}
// calculate new PWM value car 3
if (setpoint3 <1) {
//analogWrite(L293V2pin,0);
digitalWrite(L293V2pin,LOW); // standstill
}
else {
if (bemf3 <1) { // f.e. poor contact
//analogWrite(L293V2pin,255); // xxxxxxxxxxx
digitalWrite(L293V2pin,HIGH); // add power car 3
}
else {
bemf3 = constrain(bemf3/carfactor3,0,1023); // include carfactor
if (setpoint3>bemf3) { // power calculation car3
//pwm3 = 255; // xxxxxxxxx
digitalWrite(L293V2pin,HIGH); // write new PWM value car 3
}
else {
//pwm3 = 0; // PWM off
digitalWrite(L293V2pin,LOW); // write new PWM value car 3
}
//analogWrite(L293V2pin,pwm3); // xxxxxxxxxxxxxxxx
}
}
// check setpoints car 1 and 3, mx2 hard wired to 0 b210
digitalWrite(mx0,LOW); // initialize multiplexer 4051 %000 = 0
digitalWrite(mx1,LOW);
setpoint1 = analogRead(setpointspin); // read setpoint 1
digitalWrite(mx1,HIGH); // initialize multiplexer 4051 %010 = 2
setpoint3 = analogRead(setpointspin); // 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(L293V12ENpin,LOW); // L293 cars 2 + 4 high state
digitalWrite(L293V3pin,HIGH); // car 2 to plus
digitalWrite(L293V4pin,HIGH); // car 4 to plus
digitalWrite(L293V34ENpin,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); // pwm2 VALUE IS NOT INITIALISED !
digitalWrite(L293V1pin,LOW);
//analogWrite(L293V3pin,pwm4); // pwm4 VALUE IS NOT INITIALISED !
digitalWrite(L293V2pin,LOW);
digitalWrite(L293V12ENpin,HIGH); // end of measurement
// calculate new PWM value car 2
if (setpoint2 < 1) {
//analogWrite(L293V4pin,0); // standstill
digitalWrite(L293V4pin,LOW); // standstill
}
else {
if (bemf2 < 1) { // f.e. poor contact
//analogWrite(L293V4pin,255); // add power car 2 (255, not 1)
digitalWrite(L293V4pin,HIGH); // add power car 2
}
else {
bemf2 = constrain(bemf2/carfactor2,0,1023); // include carfactor
if (setpoint2>bemf2) {
//pwm2 = 255; // xxxxxxxxxxxx
digitalWrite(L293V4pin,HIGH); // write new PWM value car 2
}
else {
//pwm2 = 0; // PWM off
digitalWrite(L293V4pin,LOW); // standstill
}
//analogWrite(L293V4pin,pwm2); // write new PWM value car 2
}
}
// calculate new PWM value car 4
if (setpoint4 < 1) {
//analogWrite(L293V3pin,0); // standstill
digitalWrite(L293V3pin,LOW); // standstill
}
else {
if (bemf4<1) { // f.e. poor contact
//analogWrite(L293V3pin,255); // add power car 4
digitalWrite(L293V3pin,HIGH); // add power car 4
}
else {
bemf4 = constrain(bemf4/carfactor4,0,1023); // include carfactor
if (setpoint4>bemf4) { // power calculation car 4
//pwm4 = 255; // xxxxxxxxxxxxx)
digitalWrite(L293V3pin,HIGH); // write new PWM value car 4
}
else {
//pwm4 = 0; // PWM off
digitalWrite(L293V3pin,LOW); // write new PWM value car 4
}
//analogWrite(L293V3pin,pwm4); // write new PWM value car 4
}
}
// check setpoints car 2 and 4 b210
digitalWrite(mx0,HIGH); // initialize multiplexer 4051 %001 = 1
digitalWrite(mx1,LOW);
setpoint2 = analogRead(setpointspin); // read setpoint 2
digitalWrite(mx1,HIGH); // initialize multiplexer 4051 %011 = 3
setpoint4 = analogRead(setpointspin); // 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 ] ========================================================================
Auch pwm1, pwm2, pwm3, pwm4 gibt es nicht mehr (wurden nie initialisiert). Ohne "analogWrite()" könnte das Arduino nano Programm einfach ausgebreitet werden für 8 Autos.
Martin H.