1. Ingeniería en Automatización
y Control Industrial
Departamento de Ciencia y Tecnología
S I S T E M A S D I G I T A L E S
Proyecto Final de Materia
PROGRAMACIÓN EN C DE UN MICROCONTROLADOR MOTOROLA JK3
OBJETIVO: CONTROL DE UN MOTOR DE CC CON EJE FLEXIBLE
Alumno: Leandro Martín Pagnanini
Legajo: 6558
Año 2005
2. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
INDICE
1. Objetivo
2. Requerimientos
3. Datos Técnicos
4. Desarrollo
4.1 Programación del microcontrolador
4.2 Realización del Kit Motor-Encoder
4.3 Detalles del programa
5. Temas que abarca el proyecto
6. Archivos adjuntos
7. Conclusión
2
3. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
1- OBJETIVO:
Aprender a programar microcontroladores Motorola jk3 en C e interactuar con
componentes electrónicos asociados al microcontrolador.
Con la finalidad de realizar un Driver con un microcontrolador Motorola
MC68HC908JK3CP programado en C, para controlar un motor de CC (corriente
continua) con un algoritmo de control, que pueda comunicarse con una PC por RS-232
para modificar dinámicamente los set point y las constantes del control de manera
interactiva.
Detallado: Se realizara un control de posición y velocidad a lazo cerrado de un motor
unido a través de un eje flexible a una masa que reporta su posición por medio de un
encoder incremental. El algoritmo de control esta programado en C en un
microcontrolador MC68HC908JK3CP de Motorola que lee los pulsos y sentido de giro
del encoder y actúa sobre el PWM y el sentido de giro del motor para posicionar la masa
donde lo indique el set point.
Los parámetros de control Kp, Ki, Kd para el control PID (control proporcional integral
y derivativo) y el set point deseado es transmitido al microcontrolador por RS-232 por un
programa realizado exclusivamente para este proyecto en Visual Basic 6.0. El
microcontrolador es el encargado de obtener el error, la derivada del error y la integral
del error que combinados a los parámetros antes mencionados obtendrá la actuación
necesaria para llegar al set point deseado.
El microcontrolador transmite a la PC la posición real cada 1 segundo para realizar
un grafico que representa la evolución de la posición en el tiempo.
2 - REQUERIMIENTOS
Microcontrolador MC68HC908JK3CP
Placa de programación
Software de programación en C y C++: CodeWarrior
Manuales del microcontrolador
Motor y encoder
Visual Studio 6.0 para realizar el soft de monitoreo
3 – DATOS TECNICOS
Microcontrolador
MC68HC908JK3CP de Motorola
Internal RAM 128 bytes
Internal Flash 4096 bytes
1 Timer con 2 canales
Max Bus Frequency 8 MHz
A/D Converter 10 canales de 8 bits
Pulse Width Modulators 16 bits
Input Output Pins 15
3
4. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
Motor
Alimentación 24 V de corriente continua
corriente nominal 1.4 Amper
Encoder
Alimentación 5-24 V de corriente continua
Corriente nominal 0.7 mA
2500 pulsos por vuelta
canales A, B y Z.
4 - DESARROLLO
4.1 Programación del microcontrolador
Se comenzó realizando la placa programadora para los microcontroladores Motorola
JK3. Desde un comienzo se diseño el grabador propuesto en el Technical Data del
microcontrolador. Este circuito fue util para transitar los primeros pasos en la programación
de este tipo de microcontroladores, sin embargo se opto por realizar un programador en
circuito impreso y mas completo para poder sacar el mayor provecho posible al
microcontrolador.
Esquemáticos: estos son lo circuitos utilizados para realizar la placa programadora utilizada
para programar el microcontrolador.
Esta familia de micros tiene un modulo (MON) que es el llamado modo monitor utilizado
para programarlos y debagear los programas. Este modo permite la programación de la
memoria Flash y además permite correr el programa y debagear paso a paso la aplicación
en circuito.
4
5. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
La conexión a la pc se realiza por el puerto serie a través del protocolo RS232 y las
conexiones de los pines se realizan de la siguiente manera.
Una de los requerimientos para ingresar al modo monitor es alimentar el micro con Vdd = 5V
y aplicar en la pata 1 correspondiente a IRQ una tensión mayor de 1.5*Vdd, que en este
caso usamos 8.2V. En el siguiente esquemático se muestra el circuito para obtener estas
dos tensiones usando un transformador de 10 a 24 V de corriente continua.
5
6. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
Circuito impreso: Este es el circuito impreso que se utilizó para realizar la placa
programadora utilizada durante el proyecto. Posee jumpers que permiten se programar y
utilizar el microcontrolador sin sacarlo del socket, además posee un potenciómetro
conectado a la patita PTB7 del micro que es la usada por el ADC7 (conversor analógico
digital), y otros jumpers que simulan entradas binarias.
La técnica utilizada para la transferencia fue imprimir la imagen anterior sobre una hora para
fotografías (las que son mas brillantes de un lado) con una impresora láser. Luego el lado
impreso de esta hoja se apoya sobre el lado cobreado de una placa de pertinax previamente
pulida con birulna para retirar suciedades y oxido indeseados. Con una plancha para ropa se
plancha la hoja de 3 a 4 minutos y el calor mas la presión transfiere el toner que se
encuentra sobre la hora a la placa de cobre. Luego sumergir la placa y el papel que quedan
pegados en agua para ablandar el papel y lograr que se desarme al raspar con los dedos.
Una vez que las pistas queden dibujadas sobre la placa de cobre, hay que sumergirla en
cloruro férrico por unos 10 o 15 minutos, esta solución disuelve el cobre con el que toma
contacto y solo queda el cobre que esta oculto por el toner. Ahora solo queda retirar el toner
con una birulana y agujerear para colocar los componentes.
Una vez listo el circuito impreso se deben colocar los componentes que figuran en la lista de
componentes de la forma indicada en el esquemático. El cable usado para unir la placa
programadora a la PC tendrá una ficha RJ11 en el extremo de la placa programadora y una
ficha DB9 en el extremo que ira conectada a la PC. Este mismo cable será usado más
adelante para comunicar la placa en la que se aloja el microcontrolador que es usada para
controlar el motor DC.
6
7. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
Lista de Materiales para la placa programadora.
7
8. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
Una vez terminada la placa programadora tiene este aspecto:
Software de programación: El soft utilizado para programar en C estos microcontroladores
es el CodeWarrior 3.1, es un programa proporcionado por Motorola que permite realizar
aplicaciones hasta de 4kb en forma libre, y si se requiere programar aplicaciones mayores
hay que adquirir una licencia, como en nuestro caso el micro que usamos tiene 4kbyte de
memoria nos es suficiente la versión libre.
El programa puede bajarse de la web desde la siguiente dirección:
http://www.metrowerks.com/MW/download/default.asp
Una vez instalado, siga los siguientes pasos para crear un nuevo proyecto:
(a) Abra el CodeWarrior 3.1
(c) Seleccione HC(s)08 New Project Wizard y escriba el nombre de su proyecto.
(d) El dispositivo de trabajo, p.e. MC68HC908JL3.
(e) El código de trabajo, p.e. C solamente.
(f) No utilizar Processor Expert.
(g) No incluir un proyecto con PC-lint.
(h) El formato a utilizar sobre el tipo de punto flotante, p.e. None.
(i) El modelo de tipo de memoria a utilizar, p.e. Small.
(j) El tipo de conexiones, p.e. P&E Full Chip Simulation.
8
9. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
Finalmente se abre una ventana con el proyecto, de todos los archivos vinculados al
proyecto los mas importantes son:
main.c y P&E_FCS_Linker.prm.
(b) main.c contiene el código de nuestro programa.
(c) P&E_FCS_Linker.prm contiene la información de áreas como FLASH, ROM y Vectores
de Interrupción.
Una vez agregado el código necesario para que el micro realice las operaciones requeridas
se deben seguir los siguientes pasos para grabar el programa en la memoria flash.
En la opción de Debug, el CodeWarrior nos deriva a la aplicación True Time Simulator &
Real Time Debuger. Esta aplicación tiene tres modos de funcionamiento:
1º modo Full Chip Simulator, simula el micro por software, sin conexion.
2º modo In Circuit Simulator, sin grabar el código en la memoria flash es posible debaguear y
ver los cambios en el circuito.
3º modo In Circuit Debug/Programming, graba el programa en la memoria flash del micro y
permite el debugeo real tieme de la aplicación.
9
10. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
Al intentar comunicarse con el micro que ya debe estar en modo monitor. En la pantalla
de parámetros de conexión se debe elegir clase 3, que es la clase de programador que
detallamos arriba.
Esta es una captura de pantalla del entorno de programación CodeWarrior 3.1 en el
momento en que estaba programando el micro para controlar el motor de cc.
10
11. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
4.2 Realización del Kit Motor-Encoder
En conjunto con Mauricio Chaparro (encargado del pañol de la universidad), se realizó
un kit compuesto por un motor de CC acoplado por un eje flexible a una masa y un encoder
de alta resolución como un aporte a la carrera de Ingeniería en Automatización y Control.
Este es un modelo teórico típico de control, que puede usarse en otras materias para
modelarlo, identificarlo y probar distintas técnicas de control. En este informe sólo usaremos
un control PID que como veremos nos otorga una respuesta muy deficiente ya que es un
sistema relativamente complejo para este tipo de control.
Un modelo de este sistema es el siguiente:
X 1 = ϕ 1− ϕ 2
X 2 = ω 1/ω 0
X 3 = ω 2 /ω 0
k ( j1 + j 2)
ω 0 =
j1. j 2
0 1 1 0 0
X
.
= ω 0 . α − 1 − β 1 . X + γ .u + δ . v
β 1
0
β 2 − β 2
0
0
Y = [0 0 ω 0]X
.
j1
α =
j1 + j 2
d
β 1 =
j 1 .ω 0 d Factor de amortiguamiento viscoso
d k1 Constante de corriente del motor
β 2 = j1 Momento de inercia 1
j 2 .ω 0
j2 Momento de inercia 2
k1
γ = v Torque de perturbación en j1
j 1 .ω 0
1
δ =
j 1 .ω 0
11
12. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
Esta es una imagen de la planta terminada:
En la imagen se aprecian las 3 placas que componen el control.
La primer placa es la que recibe la señal del encoder y obtiene el sentido de giro al pasar por
un 74LS175 (Hex-Quad D Flip-Flops with Clear) y por tres 74LS161 (DECADE COUNTER 4-
BIT BINARY COUNTER) para disminuir la frecuencia de pulsos.
La segunda placa es la etapa de potencia, el ella se encuentra un L298 (Puente H) que
permite al microcontrolador indicar el sentido de giro del motor. Este es un diagrama de la
conexión del puente H.
La tercer placa es en la que se aloja el microcontrolador y en donde se encuentra el control
del sistema. Esta placa tiene un terminal RJ11 que permite la conexión a la PC por medio del
una conexión RS232.
12
13. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
El programa que se comunica con el microcontrolador es el de la siguiente figura:
Con este programa se le puede indicar al microcontrolador que tipo de control se desea
hacer: posición o velocidad. Además se puede seleccionar 5 set point predefinidos y
observar la evaluación del sistema en una pantalla grafica que grafica los últimos 60
segundos de la posición real de la masa M2. Se observa en la parte inferior de la pantalla
grafica unos valores relevantes de la evolución, como ser el promedio, máximo, mínimo y
excursión de la señal. Otra de las opciones es poder modificar las constantes Kp, Ki, Kd del
control PID.
13
14. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
4.3 Detalles del programa
Una de las primeras llamadas que hacemos es a la librería <MC68HC908JK3.h>, en esta
librerías se encuentran definidos los registros y las direcciones del microcontrolador, así en
la siguiente programación solo se llamara al PTD como Puerto D, al ADR como registro del
analógico digital, y así con los demás registros.
Estas son las patas del microcontrolador que usamos para interactuar con la planta, leer la
posición de la masa M1 y controlar el PWM.
// IRQ1 entrada cuenta los pulsos del encoder
// PTB4 entrada indica el sentido de giro
// PTB5 entrada set_point 1
// PTB6 entrada set_point 2
// PTB7 entrada potenciometro indica máximo TON del PWM
// PTD2 salida sentido de giro y stop PWM
// PTD3 salida sentido de giro y stop PWM
// PTD4 salida PWM
// PTD6 TX RS-232
// PTD7 RX RS-232
Como resumen de las funcionalidades que utilizamos en el proyecto podemos mencionar:
• Interrupciones por hardware
• Interrupciones por software
• Entradas digitales
• Salidas digitales
• Entradas analógicas (conversor Analógico digital)
• Comunicación RS-232 con la PC
• Manejo del TIM (timer interface module)
• Generación de PWM
El tren de pulsos generados por el encoder se debe convertir a un numero que
represente el desplazamiento de la masa desde el origen. Se considera origen a la posición
cero que es en la que se encuentra el sistema en el momento en que energizamos el
microcontrolador o presionamos Reset. El mejor método es usar un acumulador de pulsos,
pero como este microcontrolador no dispone de un acumulador de pulsos o external clock
source tenemos que recurrir a las interrupciones, por eso entramos con el canal A del
encoder en la pata IRQ y de esta manera contamos los pulsos que indican la posición de la
masa M1.
El siguiente es el código utilizado para atender la interrupción por hardware generada por el
flanco desendente del pin asociado a IRQ, vemos que después de indicarle al micro que
aceptamos la interrupción se modifica el valor de una variable dependiendo de el sentido de
giro del motor que esta indicado en el pin 4 del puerto B.
14
15. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
#pragma TRAP_PROC
void IRQ_Interrupcion(void){
INTSCR_ACK1=1; // ACK interrupción
if(PTB_PTB4){
if(pos_encoder<32000) pos_encoder++;
}else{
if(pos_encoder>-32000) pos_encoder--;
}
}
La interrupción por software siguiente nos indica que el conversor analógico digital a
terminado de convertir la señal proveniente desde el potenciómetro conectado al pin PTB7.
Con esta entrada definimos la saturación de la señal de actuación, que traducido al tipo de
actuador que tenemos en este proyecto representa el máximo Ton (tiempo activo) de la
señal PWM.
#pragma TRAP_PROC
void ADC_Fin_Conversion(void){
pote_ADC7=ADR;
if(ipass<10000) ipass++;
}
Ahora veremos las funciones utilizadas en este proyecto con una breve descripción de su
funcionalidad.
void delay(unsigned int ms) Es un retardo utilizado para formar la trama en la
transmisión RS-232
void set_TON_PWM(int TON) Configura los parámetros del PWM
void set_Sentido(int Sentido) Configura las salidas 2 y 3 del Puerto D que
definen el sentido de giro
void send_byte(char byte) Envía un byte a la PC por Puerto serie
char rec_byte(void) Recibe un byte de la PC
void itochar(int inum,unsigned char cadena[5]) Convierte un entero en string
void send_pos(void) Envía la posición actual de la masa M1 a la PC
cada 1 segundo.
void analizar_entrada(unsigned char br) Actualiza los parámetros del control respecto a lo
que llega desde la PC
Sin embargo el corazón del programa se encuentra en la función <void main(void)> en la que
se encuentra el control propiamente dicho, en este caso en forma de PID (control
proporcional integral y derivativo). El programa contiene la inicialización de los módulos y un
if que selecciona el tipo de lógica para obtener la actuación según si estamos controlando
posición o velocidad.
15
16. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
Lo primero que se debe hacer al empezar el programa es configurar los registros del
microcontrolador para que funcionen los módulos que luego utilizaremos.
CONFIG1_COPD=1; // Deshabilitamos el monitor Wathdog
ADSCR = 0x67; // habilito ADC7 en modo ciclico con interrupciones
ADICLK = 0x80; // divido por 16 internal ADC clock
CONFIG2_IRQPUD=1; // disable pull-up en IRQ
TSC = 0x33; // limpio TIM y divido por 8 el clock
TMODH = 0x00; // periodo inicial del PWM
TMODL = 0xFF;
TCH0H = 0x00; // TON inicial del PWM
TCH0L = 0x80;
TSC0 = 0x1A; // selecciono PWM en canal 0
TSC_TSTOP = 0; // prendo el modulo TIM
DDRD = 0x8C; // configuro algunos pin como salida
Luego el if que define el tipo de control se administra así:
if(control_pos){ // CONTROL DE POSICIÓN
error = set_point - pos_encoder;
integral_error = integral_error + error; // integral
derivada_error = error - error_anterior; // derivada
if(integral_error>4000) integral_error=4000; // anti-windup
if(integral_error<-4000) integral_error=-4000;
actuacion = (int)( Kp*error // PID
+ Ki*integral_error/100
+ Kd*derivada_error );
error_anterior=error;
}else{ // CONTROL DE VELOCIDAD
if(pos_encoder<set_point/10){
if(actuacion<30000) actuacion++;
}else{
if(actuacion>-30000) actuacion--;
}
if(set_point==0) actuacion=0;
pos_encoder=0;
for(i=0;i<1000;i++){
br=rec_byte();
if(br>0) analizar_entrada(br);
}
}
Como vemos en la aplicación es necesario comunicarse con la PC por puerto serie, pero
este microcontrolador no tiene modulo SCI que es el que administra este tipo de conexiones.
Por lo tanto fue necesario manipular una entrada y una salida estándar del microcontrolador
para comunicarse con la PC. Para eso fue necesario para realizar una Interfase Serie
Asincrónica capaz de funcionar sobre cualquier pin I/O. Los requerimientos para que las
rutinas funcionen correctamente son mínimos, el problema es que poseen pequeños errores
de Timming (sincronismo) que fueron solucionados utilizando eco, esto significa que el
microcontrolador le envía a la PC lo que el entendió, entonces la PC decide si es necesario
reenviar el dato o no.
16
17. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
Los cálculos están basados en un cristal de 9.8304MHz lo que proporciona un
T=0.406901useg de bus y en base a esto debemos calcular el tiempo de bit utilizado en la
transmisión.
Tiempos de bit en RS-232
/******************************************************************************************************
Baudios Ancho_de_Bit (useg) Error de encuadre (X*T/Br)
57600 17.36 2.12
38400 26.04 1.56
19200 52.08 1.15
9600 104.2 1.05
4800 208.3 0.62
2400 416.7 0.46
******************************************************************************************************/
Se desarrollaron 3 funciones principales: send_byte, rec_byte y delay
Transmisión: se realiza con la función send_byte, es la mas simple puesto a que una vez
que comienza la transmisión con el bit de start solo se trata de cambiar el estado lógico del
bit TXD configurado como salida hasta contar los 8 bits del byte y al final concluir con un bit
de stop. El formato de transmisión estándar NRZ n,8,1 y el orden de los bits es el siguiente:
bit START – bit 0 – bit 1 – bit 2 – bit 3 – bit 4 – bit 5 – bit 6 – bit 7 – bit STOP
Recepcion: es la más difícil de programar, ya que en la recepción es donde se debe
considerar el ruido debido a la línea de transmisión y al sincronismo. La función rec_byte
verifica el estado de la entrada RXD, si la entrada esta en uno la función devuelve un cero,
pero si la entrada esta en cero indica que estamos en el bit de start y que la PC esta
transmitiendo un byte por eso en este caso se debe prestar absoluta atención a esta entrada
y evaluar en intervalos correspondientes al tiempo de bit el valor de la entrada que
representa el byte correspondiente.
Para convertir la señal TTL del microcontrolador en niveles de tensión CMOS
correspondientes a la norma RS-232 usamos un MAX232. Del cual solo nos sirve un canal
de salida y un canal de entrada.
17
18. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
5– TEMAS QUE ABARCA EL PROYECTO
Programación en lenguaje de alto nivel en el software de control (Visual Basic).
Programación en lenguaje de bajo nivel en el microcontrolador (C).
Redes y Protocolos.
Diseño de circuitos electrónicos.
Desarrollo de hardware.
Fundamentos de control.
6– ARCHIVOS ADJUNTOS
Se entrega el informe adjunto a los códigos fuente utilizados en la programación del
microcontrolador y el programa con el que se cambian los parámetros desde la pc.
También están incluidos en los datos adjuntos los datasheet de los componentes
utilizados en las placas de electrónica asociada al microcontrolador.
18
19. Proyecto Final de Materia
Sistemas Digitales
Programación en C de un microcontrolador Motorola JK3
7 - CONCLUSIÓN
En esta colusión evaluaremos dos aspectos principales.
El primero es la programación del microcontrolador, esta familia de microcontroladores
posee un entorno de desarrollo (CodeWarrior) muy bien logrado. Al momento de escribir el
programa resulta muy sencillo utilizar los módulos y registros del micro ya que se muestran
como objetos desplegables de amplia versatilidad. También provee herramientas de testeo
por soft y en circuito que aceleran notablemente la detección de errores.
Con respecto al microcontrolador elegido, nos encontramos con muchas limitaciones a la
hora de pretender un uso intensivo. La falta de un acumulador de pulsos y un modulo SCI de
comunicación serie nos limitó en la optimización del control. Para lograr un control del
sistema con una fluida comunicación con la PC es imprescindible usar un microcontrolador
que disponga de estos módulos. Aunque en el transcurso de este proyecto se emularon
estos módulos, nos vimos desbordado de interrupciones y eso repercutía en la perdida de
referencia (posición cero) que obligaron a usar divisores de frecuencia y baja tasa de
transmisión de datos.
19