Académique Documents
Professionnel Documents
Culture Documents
Integrantes
Diego Armando Amaris Moreno
José Luis Hernández Lozano
Curso E069
6° semestre Tecnología en electrónica
Profesor
Eduardo San Miguel
Año 2010
Funcionamiento
2- Procesamiento de información.
Esta parte es dirigida por el microcontrolador MC9S08JM60 de Freescale, el
cual está montado sobre un modulo auto programable desarrollado por la
empresa Octoplus de Bucaramanga.
Se encarga de capturar, procesar y generar una señal PWM de control, las
señales que captura son:
HMI Teclado matricial
Realimentación análoga (generador)
Realimentación digital (encoder)
Esta información es procesada por el microcontrolador para generar la señal
de control PWM (modulación por ancho de pulso) de 5V.
3- Control de potencia.
Esta parte inicia con un optoacoplador, se encarga de transmitir la señal de
control PWM, al circuito de control de potencia, por medio de luz, para aislar y
proteger al microcontrolador del voltaje de operación del motor (24V DC).
Luego por medio de un transistor Mosfet se cambia la amplitud de de la señal
PWM de 5V a 24V para aplicarla en los terminales del motor y así poder
controlar la velocidad del motor por medio del ancho de pulso de la señal, el
cual se cambia desde el microcontrolador, por medio del teclado o las
realimentaciones.
4- Realimentación.
El sistema cuenta con dos tipos de realimentación:
Realimentación análoga: usando un motor adicional acoplado al eje
del motor principal se genera un voltaje de 0.3V a 1.5V dependiendo de
la velocidad a la que valla el motor principal. Para saber que velocidad
representaba cada voltaje se tomaron muestras del voltaje generado por
el motor y el valor decimal del conversor análogo/digital del micro (ver
figura1), luego con estos datos se logro hacer al algoritmo para
realimentación análoga,
el cual consiste en procesar el valor del registro ADCR del micro para
obtener su equivalente real en rpm y luego compararlo con el valor rpm
que el usuario ingreso por medio del teclado, si el valor equivalente
obtenido a partir del ADCR, es menor que el valor ingresado en el
teclado el programa aumentara el valor del registro TPM1C3V para
aumentar el ancho de pulso de la señal PWM que sale del
microcontrolador y por lo tanto aumentar la velocidad del motor, y si el
valor equivalente es mayor que el ingresado desde el teclado el
programa disminuirá el valor de TPM1C3V para disminuir el ancho de
pulso de la señal PWM y así disminuir la velocidad del motor, todo esto
con el fin de mantener la velocidad ingresada desde el teclado.
PROCESAMIENTO CONTROL DE
DE INFORMACION POTENCIA
HMI
Teclado Optoacoplador
Microcontrolador
MC9S08JM60 Mosfet
5V Motor
REALIMENTACION
Análoga (generador)
Digital (encoder)
Características de funcionamiento:
Tecla Función
0-9 Configura magnitud de velocidad
A Aceptar
B Borrar
C Activar realimentación análoga (motor-generador)
D Activar realimentación digital (encoder)
* Capturar ó cambiar velocidad
# Activar control de velocidad para el motor, sin pulsarlo normalmente
controla la velocidad de la rueda.
Funcionamiento del teclado:
Diagrama eléctrico del sistema
Circuito impreso con PCB Wizard
Programa que contiene el microcontrolador
Lenguaje de programación: C.
Software utilizado: Code Warrior 10
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include <stdio.h>
/********************************************************/
/*------- Espacio para declaracion de constantes ------*/
/********************************************************/
/********************************************************/
/*--- Espacio para declaracion de variables globales --*/
/********************************************************/
/********************************************************/
/********************************************************/
/*-------------- Espacio para funciones ---------------*/
/********************************************************/
/////////RETARDO1//////////
void retar(void){
for(time=0;time<255;time++){
asm nop
}
}
/////////RETARDO2//////////
void retar2(void){
for(time2=0;time2<75;time2++){
asm nop
}
}
//////////BCD A BINARIO///////
/////////bin a bcd///////////
void bin_a_bcd(void){
uni=0;
dec=0;
cen=0;
umil=0;
while(dato2>=1000){
umil++;
dato2=dato2-1000;
}
while(dato2>=100){
cen++;
dato2=dato2-100;
}
while(dato2>=10){
dec++;
dato2=dato2-10;
}
uni=dato2;
}
/////////PROCESO//////////////
void proceso(void){
tecla=tabla2[tecla];
if(tecla==0x0a){
bcd_a_bin();
TPM1C3V=dato; //al variar el valor de este registro se modifica el ancho de pulso de
la señal PWM
}
if(tecla==0x0b){
uni=0;
dec=0;
cen=0;
umil=0;
tecla=0;
TPM1C3V=0;
real_analog=0;
real_digi=0;
cambiar_velocidad=0;
control_en_motor=0;
}
if(tecla==0x0c){ // Realimentacion con convesor A/D motor generador
real_analog=1;
real_digi=0;
cambiar_velocidad=0;
if(tecla==0x0e){
control_en_motor=1; // activa control de velocidad para el motor
dato4++;
if(dato4==2){
control_en_motor=0; // activa control de velocidad para la rueda
dato4=0;
}
void control_por_muestreo_rueda(void){
if(dato==150){ // 150 rpm
if(ADCR<446){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>446){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==200){
if(ADCR<563){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>563){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==250){
if(ADCR<731){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>731){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==300){
if(ADCR<818){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>818){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==350){
if(ADCR<984){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>984){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==400){
if(ADCR<1038){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1038){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==450){
if(ADCR<1286){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1286){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==500){ // Hasta 500 rpm (en la rueda)
if(ADCR<1429){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1429){
TPM1C3V=TPM1C3V-error;
}
}
}
void control_por_muestreo_motor(void){
if(dato==500){ // desde 500 rpm
if(ADCR<435){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>435){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==550){
if(ADCR<453){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>453){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==600){
if(ADCR<520){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>520){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==650){
if(ADCR<532){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>532){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==700){
if(ADCR<554){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>554){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==750){
if(ADCR<619){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>619){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==800){
if(ADCR<687){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>687){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==850){
if(ADCR<698){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>698){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==900){
if(ADCR<728){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>728){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==950){
if(ADCR<758){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>758){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1000){
if(ADCR<787){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>787){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1050){
if(ADCR<800){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>800){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1100){
if(ADCR<842){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>842){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1150){
if(ADCR<886){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>886){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1200){
if(ADCR<895){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>895){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1250){
if(ADCR<948){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>948){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1300){
if(ADCR<1007){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1007){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1350){
if(ADCR<1045){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1045){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1400){
if(ADCR<1088){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1088){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1450){
if(ADCR<1102){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1102){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1500){
if(ADCR<1182){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1182){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1550){
if(ADCR<1195){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1195){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1600){
if(ADCR<1204){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1204){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1650){
if(ADCR<1282){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1282){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1700){
if(ADCR<1312){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1312){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1750){
if(ADCR<1417){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1417){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1800){
if(ADCR<1458){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1458){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1850){
if(ADCR<1531){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1531){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1900){
if(ADCR<1598){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1598){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==1950){
if(ADCR<1636){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1636){
TPM1C3V=TPM1C3V-error;
}
}
if(dato==2000){ // Hasta 2000 rpm (en le
motor)
if(ADCR<1645){
TPM1C3V=TPM1C3V+error;
}
if(ADCR>1645){
TPM1C3V=TPM1C3V-error;
}
}
}
void r_an(void){
if(real_analog==1){
if(control_en_motor==0){
control_por_muestreo_rueda();
dato2=ADCR/2.8;
}
if(control_en_motor==1){
control_por_muestreo_motor();
dato2=ADCR*1.19;
}
bin_a_bcd();
}
}
/////////MOSTRAR EN DISPLAYS///////////
void mostrar_en_displays(void){
var=uni;
deco();
PTCD_PTCD4=1;
retar();
PTCD_PTCD4=0;
var=dec;
deco();
PTCD_PTCD2=1;
retar();
PTCD_PTCD2=0;
var=cen;
deco();
PTCD_PTCD0=1;
retar();
PTCD_PTCD0=0;
var=umil;
deco();
PTCD_PTCD1=1;
retar();
PTCD_PTCD1=0;
}
///////////// IRQ/////////////////////
interrupt void IRQ(void){
if(real_digi==1){
vueltas++;
if(dato<v_x_min_rueda){
TPM1C3V=TPM1C3V-1;
}
if(dato>v_x_min_rueda){
TPM1C3V=TPM1C3V+3;
}
}
IRQSC_IRQACK=1;
}
///////////TECLADO/////////////////////
/********************************************************/
/********************************************************/
/*------------ Espacio de codigo principal -------------*/
/********************************************************/
void main(void) {
SOPT1 = 0x20; //Deshabilita el modulo COP (WDT)
///////////INICIO DE PROGRAMA//////////
// EnableInterrupts;
for(;;)
{
}
}
//*******************************************************
/*Dummy ISR */
interrupt void Dummy_ISR(void)
{
}
void Bootloader_Main(void);
void _Entry(void) {
PTGD = 0x00;
PTGDD = 0xF0; //PTG0-3 used for KBI input
PTGPE = 0x0F; //Pull-up enable
// Flash clock
FCDIV=0x4E; // PRDIV8=1; DIV[5:0]=14, flash clock should be 150-200kHz
// bus clock=24M, flash clock=fbus/8/(DIV[5:0]+1)
// bus clock=24M, flash clock=fbus/8/(DIV[5:0]+1)
if(!PTGD_PTGD0)
{
SOPT1 = 0x20; // disable COP only if bootloader mod is requested
// PTG0 is pressed
USBCTL0=0x44;
USBCTL0_USBVREN=1;
Bootloader_Main(); // Bootloader mode
}
else
asm JMP _UserEntry; // Enter User mode
}