Paso 11: Software de Control para el Arduino
/*
* BLDC_congroller 3.1.1
* por David Glaser
*
* La serie 3.x de programas es para lo ST L6234 3 fases Motor Driver IC
*
* Ejecuta un motor de unidad de disco en sentido horario
* Con frenado regenerativo
* Velocidad motor y de frenado es controlado por un potenciómetro único
* Determinada posición motor con tres sensores de efecto Hall
* El Arduino recibe salidas de sensores hall 3 (pines 2,3,4)
* y su combinación se convierte en 6 pasos diferentes de conmutación
* PWM salidas pines 9,10,11, a 32 kHz (correspondiente a EN 1,2,3 respectivamente
* 3 no en pernos 5.6.7 (1,2,3)
* Analógico en 0 está conectado a un potenciómetro para cambiar el deber PWM y cambiar
entre el automovilismo y regenerativo de frenado.
* 0-499: frenado
* 500-523: costear
* 524-1023: automovilismo
* Hay muchas líneas comentamos hacia fuera que se utiliza para la depuración por
* impresión de distintos valores para la conexión en serie.
*/
int HallState1; Variables de los sensores de tres pasillo (3,2,1)
int HallState2;
int HallState3;
int HallVal = 1; valor binario de todos los sensores de pasillo 3
int mSpeed = 0; nivel de velocidad del motor
int bSpeed = 0; nivel de frenado
Acelerador de int = 0; Esta variable se utiliza con análogo en para medir la posición del potenciómetro mariposa
void setup() {}
pinMode(2,INPUT); Pabellón 1
pinMode(3,INPUT); Sala 2
pinMode(4,INPUT); Sala 3
Salidas para el conductor del Motor L6234
pinMode(5,OUTPUT); EN LA 1
pinMode(6,OUTPUT); EN LA 2
pinMode(7,OUTPUT); EN EL 3
pinMode(9,OUTPUT); EN 1
pinMode(10,OUTPUT); EN 2
pinMode(11,OUTPUT); EN 3
Serial.Begin(9600); descomentar esta línea Si utilizas la conexión en serie
también descomentar Serial.flush comando al final del programa.
/ * Ajustar frecuencia de PWM en pernos 9,10 y 11
Este pedacito de código proviene de
http://usethearduino.blogspot.com/2008/11/Changing-PWM-Frequency-on-Arduino.html
*/
Set PWM para pernos de 9,10 a 32 kHz
Claro primero todos los tres bits de divisor:
int prescalerVal = 0x07; crear una variable llamada prescalerVal y set igual al número binario "00000111" número "00000111" número "00000111"
TCCR1B & = ~ prescalerVal; Y el valor en TCCR0B con el número binario "11111000"
Ahora configurar los bits divisor apropiados:
int prescalerVal2 = 1; prescalerVal Set igual al número binario "00000001"
TCCR1B | = prescalerVal2; O el valor en TCCR0B con el número binario "00000001"
Set PWM para pernos 3,11 a 32 kHz (sólo pin 11 se utiliza en este programa)
Claro primero todos los tres bits de divisor:
TCCR2B & = ~ prescalerVal; Y el valor en TCCR0B con el número binario "11111000"
Ahora configurar los bits divisor apropiados:
TCCR2B | = prescalerVal2; O el valor en TCCR0B con el número binario "00000001" //First todos los tres bits de divisor:
}
BUCLE PRINCIPAL DE LA PRGROM
void loop() {}
tiempo = millis();
imprime el tiempo desde que comenzó el programa
Serial.println(Time);
Serial.Print("\n");
mariposa = analogRead(0); valor del potenciómetro mariposa
mSpeed = mapa (acelerador, 512, 1023, 0, 255); Automovilismo se asigna a la parte superior del potenciómetro
bSpeed = mapa (de la válvula reguladora, 511, 255, 0, 0); frenado regenerativo en la parte inferior de olla
mSpeed = 100; utiliza para la depuración
HallState1 = digitalRead(2); leer valor de entrada del pabellón 1
HallState2 = digitalRead(3); leer valor de entrada de la sala 2
HallState3 = digitalRead(4); leer valor de entrada de la sala 3
digitalWrite (8, HallState1); LED encendida cuando el sensor correspondiente es alto - originalmente se utiliza para la depuración
digitalWrite (9, HallState2);
digitalWrite (10, HallState3);
HallVal = (HallState1) + (2 * HallState2) + (4 * HallState3); Calcula el valor binario de los 3 sensores de pasillo
/*Serial.Print ("H 1:"); utiliza para la depuración
Serial.println(HallState1);
Serial.Print ("H 2:");
Serial.println(HallState2);
Serial.Print ("H 3:");
Serial.println(HallState3);
Serial.println("");
*/
Serial.println(mSpeed);
Serial.println(HallVal);
Serial.Print("\n");
Monitor salidas del transistor
Delay(1000);
/ * T1 = digitalRead(2);
T1 = ~ T1;
T2 = digitalRead(4);
T2 = ~ T2;
T3 = digitalRead(5);
T3 = ~ T3;
Serial.Print(T1);
Serial.Print("\t");
Serial.Print(T2);
Serial.Print("\t");
Serial.Print(T3);
Serial.Print("\n");
Serial.Print("\n");
Serial.Print(digitalRead(3));
Serial.Print("\t");
Serial.Print(digitalRead(9));
Serial.Print("\t");
Serial.println(digitalRead(10));
Serial.Print("\n");
Serial.Print("\n");
Delay(500);
*/
Conmutación para automovilismo
Cada número binario tiene un caso que corresponde a los diferentes transistores se enciende
Bits de matemáticas se utilizan para cambiar los valores de la salida
Tutorial en bitmath con Arduino: http://www.arduino.cc/playground/Code/BitMath
PORTD contiene las salidas de los pines de la IN en el controlador L6234
determinar si se utiliza el transistor superior o inferior de cada fase
Las salidas de los pines EN son controladas por el Arduino comando analogWrite, que
establece el deber del PWM (0 = OFF, 255 = ON o valor que se controla con el potenciómetro de la válvula reguladora).
Si (acelerador > 511) {}
interruptor (HallVal)
{
caso 3:
PORTD = B011xxx00; Salida deseada para pins 0-7 xxx se refiere a las entradas de la sala, que no se deben cambiar
PORTD y = B00011111;
PORTD | = B01100000; //
analogWrite(9,mSpeed); PWM en fase A (transistor de alta presión)
analogWrite(10,0); Fase B apagado (deber = 0)
analogWrite(11,255); Fase C en - deber = 100% (transistor del lado de baja)
rotura;
caso 1:
PORTD = B001xxx00; Salida deseada para pins 0-7
PORTD y = B00011111; //
PORTD | = B00100000; //
analogWrite(9,mSpeed); PWM en fase A (transistor de alta presión)
analogWrite(10,255); Fase B (transistor del lado de baja)
analogWrite(11,0); Fase B apagado (deber = 0)
rotura;
caso 5:
PORTD = B101xxx00; Salida deseada para pins 0-7
PORTD y = B00011111; //
PORTD | = B10100000;
analogWrite(9,0);
analogWrite(10,255);
analogWrite(11,mSpeed);
rotura;
caso 4:
PORTD = B100xxx00; Salida deseada para pins 0-7
PORTD y = B00011111;
PORTD | = B10000000; //
analogWrite(9,255);
analogWrite(10,0);
analogWrite(11,mSpeed);
rotura;
caso 6:
PORTD = B110xxx00; Salida deseada para pins 0-7
PORTD y = B00011111;
PORTD = B11000000; //
analogWrite(9,255);
analogWrite(10,mSpeed);
analogWrite(11,0);
rotura;
caso 2:
PORTD = B010xxx00; Salida deseada para pins 0-7
PORTD y = B00011111;
PORTD | = B01000000; //
analogWrite(9,0);
analogWrite(10,mSpeed);
analogWrite(11,255);
rotura;
}
}
Conmutación para frenado regenerativo
Pines PORTD (salidas para en pins en L6234) siempre son bajos por lo que sólo el
se utilizan transistores inferiores en cada fase
los transistores superiores son siempre apagado durante la regeneración. de frenado.
Else {}
PORTD = B000xxx00; Salida deseada para pins 0-7
PORTD y = B00011111;
PORTD | = B00000000; //
interruptor (HallVal)
{
caso 3:
analogWrite(9,bSpeed);
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,0);
rotura;
caso 1:
analogWrite(9,bSpeed);
analogWrite(10,0);
analogWrite(11,0);
rotura;
caso 5:
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,bSpeed);
rotura;
caso 4:
analogWrite(9,0);
analogWrite(10,0);
analogWrite(11,bSpeed);
rotura;
caso 6:
analogWrite(9,0);
analogWrite(10,bSpeed);
analogWrite(11,0);
rotura;
caso 2:
analogWrite(9,0);
analogWrite(10,bSpeed);
analogWrite(11,0);
rotura;
}
}
tiempo = millis();
imprime el tiempo desde que comenzó el programa
Serial.println(Time);
Serial.Print("\n");
Serial.Flush(); descomentar esto si va a usar puerto serie para la depuración
}