Este post será dedicado al control de velocidad de un pequeño motor DC usando el algoritmo PID.
El esquema general a desarrollar se muestra a continuación (Figura 1).
Figura 1.
El algoritmo será implementado en un ATmega32. Este microcontrolador recibirá, por el puerto serie, órdenes desde una interfaz gráfica hecha en visual c# (Figura 2).
El programa en la PC permitirá enviar hacia el controlador(ATmega32) el SetPoint(SP), Kp(Ganancia proporcional), Ti(Tiempo integrativo en seg) y OUT cuando se seleccione modo manual. También permitirá graficar PV, SP y OUT. PV, SP y OUT son escalados de 0 a 100.
Figura 2.
DEL SOFTWARE (en el controlador mega32).
Del uC usaremos:
- Los pines PD0 y PD1 (INT0 e INT1) para leer las salidas(A y B) del encoder tal como en un post anterior.
- El UART para recibir, mediante interrupción, SP,Kp,Ti y OUT(en modo manual) y para enviar PV y OUT(en modo automático).
- El Timer1 para generar una interrupción cada 100ms que permitirá ejecutar el algoritmo de control y hacer el envío de datos a la PC.
- El Timer2 para generar una señal PWM equivalente a la salida (OUT) del controlador. La salida será por el pin PD7/OC2.
El programa funcionará a una frecuencia de 7.3728MHz y el UART a 115200bps tal como se muestra en la figura 3.
Figura 3.
Se usaran las uniones de la figura 4. TRAMA_t es para la recepción y envío de datos hacia/desde la PC y States_t para el manejo de los estados del encoder.
Figura 4.
Las variables a usar son:
Figura 5.