Mostrando entradas con la etiqueta PID. Mostrar todas las entradas
Mostrando entradas con la etiqueta PID. Mostrar todas las entradas

jueves, 3 de marzo de 2016

Control, PID, de velocidad con ATmega



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.
pid1

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.
PID


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.
image


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.
image
Las variables a usar son:

Figura 5.
image