Este proyecto lo hice en Marzo del 2009 pero por ser un trabajo pagado no pude publicarlo en ese entonces. Sin embargo, lo redacte (un viernes 27 de ese tiempo) y todo listo para ser publicado... hasta hoy, asi que ahi va
Hace 3 dias un amigo me dijo que hiciera un proyecto que involucrara un PICTeMoL (xD) y bueno, ayer lo termine y oy lo publico.
La idea era que se pudiera controlar la velocidad del motor con el teclado y que se mostrara en el LCD y asi. Bueno, en si, lo que hace alfinal de cuentas es: Controla la velocidad de giro del motor (RPM) con PWM, siendo esta modificable atravez del teclado (tb el giro), y en el lcd se muestra los RPM, el PWM actual, y el sentido del motro (horario u antihorario).
El pic, lcd y demas, enconcreto que he usado son: PIC18F4550 a 48mhz (entrada 4 mhz), LCD 16x2, Teclado matricial 4x4, 2 relays de 12v y un motor DC DMM-F019A0-F01 de 24V KITASHIBA que viene con un encoder (H9700).
Mas detalles sobre el motor y el encoder:
AQUI y
AQUIEl esquema, echo en proteus 7.2 SP0

Aglunas imagenes:

Un videito:
Y como no! el frimware del pic echo en CCS 4.023
#INCLUDE <18F4550.h>
#FUSES XTPLL, NOMCLR, PLL1, CPUDIV1, NOUSBDIV, PUT, NOBROWNOUT, NOWDT, NOVREGEN, NOPBADEN, NOLVP, PROTECT
#USE DELAY (CLOCK = 48 000 000)
#USE FAST_IO(D)
#INCLUDE "INC\kbd_lib.c"
#DEFINE LCD_DB4 PIN_B2
#DEFINE LCD_DB5 PIN_B3
#DEFINE LCD_DB6 PIN_B4
#DEFINE LCD_DB7 PIN_B5
#DEFINE LCD_RS PIN_A3
#DEFINE LCD_RW PIN_A2
#DEFINE LCD_E PIN_A1
#INCLUDE "INC\flex_lcd.c"
#DEFINE NumeroDeRejillasDelEncoder 100
#DEFINE SumarBoton 10
#DEFINE RestarBoton 10
#DEFINE MSTiempoDeEspera 600
#DEFINE MSMuestreoLCD 250
#DEFINE B0 0
#DEFINE B1 110
#DEFINE B2 210
#DEFINE B3 310
#DEFINE B4 410
#DEFINE B5 510
#DEFINE B6 610
#DEFINE B7 710
#DEFINE B8 850
#DEFINE B9 1023
int16 B[10] = {B0, B1, B2, B3, B4, B5, B6, B7, B8, B9};
char StrGiro[3][13] = {"Horario\0", "Antihorario\0", "-\0"};
int8 Giro = 2;
int8 segundos = 0, minutos = 0;
int16 ms = 0, ms2 = 0;
int1 HayPulsoNuevoYSinProcesar = false, HayPulsosDelSensor = false;
int16 veces_desbordado = 0, periodo_alto_en_ticks = 0, TMR1_NumVecsDesbordado = 0;
int16 ValPWM = 0;
float const SegPorCadaTick = 0.00000008333;
void main (void)
{
char mitecla = 0;
float PeriodoDelPulsoEnS = 0;
int16 RPM = 0;
disable_interrupts(GLOBAL);
delay_ms(300);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
set_timer1(0);
ext_int_edge(L_TO_H);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_32);
set_timer0(28036);
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 255, 1);
kbd_init();
lcd_init();
delay_ms(100);
lcd_putc("\f");
delay_ms(100);
enable_interrupts(INT_TIMER0);
enable_interrupts(Int_Ext);
enable_interrupts(Int_Timer1);
enable_interrupts(GLOBAL);
while(true)
{
if (ms >= MSMuestreoLCD)
{
ms = 0;
printf(lcd_putc, "\fRPM:%04LuPWM:%04Lu\nGiro:%s", RPM, ValPWM, StrGiro[Giro]);
}
set_pwm1_duty(ValPWM);
mitecla = kbd_getc();
switch (mitecla)
{
case '+':
if (ValPWM != 1023)
{
if (ValPWM > (1023 - SumarBoton))
{
ValPWM = 1023;
}
else
{
ValPWM += SumarBoton;
}
}
else
{
ValPWM = 0;
}
break;
case '-':
if (ValPWM != 0)
{
if (ValPWM < (RestarBoton))
{
ValPWM = 0;
}
else
{
ValPWM -= RestarBoton;
}
}
else
{
ValPWM = 1023;
}
break;
case 'S':
output_toggle(PIN_A0);
break;
case 'C':
ValPWM = 0;
output_toggle(PIN_A0);
break;
case 'H':
break;
case 'E':
break;
case '\0':
break;
default:
ValPWM = B[mitecla - 48];
break;
}
if (HayPulsoNuevoYSinProcesar)
{
PeriodoDelPulsoEnS = (SegPorCadaTick * ((65536 * TMR1_NumVecsDesbordado) + periodo_alto_en_ticks));
RPM = (int16)(60 / (PeriodoDelPulsoEnS * NumeroDeRejillasDelEncoder));
HayPulsoNuevoYSinProcesar = false;
}
else
{
if (ms2 >= MSTiempoDeEspera)
{
RPM = 0;
Giro = 2;
}
}
}
}
#INT_TIMER0
void Contador(void)
{
set_timer0(28036);
output_toggle(PIN_C0);
ms += 100;
ms2 += 100;
}
#INT_TIMER1
void InterrupcionTimer1(void)
{
veces_desbordado++;
}
#INT_EXT
void Encoder(void)
{
periodo_alto_en_ticks = get_timer1();
TMR1_NumVecsDesbordado = veces_desbordado;
set_timer1(0);
veces_desbordado = 0;
Giro = input(PIN_B1);
HayPulsoNuevoYSinProcesar = true;
HayPulsosDelSensor = true;
ms2 = 0;
}
Quemado al PIC a travez del MPLAB 8.0 y el ICD2.
Y bueno, tb dejo todo adjuntado en un .RAR donde esta el hex, librerias y eso

Agradecer a
LA PAGINA DE REDPIC y al mismo Redpic porque de ahi me he basado en hacer el teclado 4x4 que nunca habia usado y a Cryn que en un
TEMA ANTIGUO menciona este motor diciedno todo su nombre completo del motor, ya que en el que yo tenia no se veia bien.
Agregar tb, que compatibilice este codigo para un PIC16F877 y un PIC18F452 pero con resultados malos debido a la fuente y que estos PIC's no tienen la posibilidad de quitar el hardware del MCLR por software que, en unos fallos anteriores con el 18F4550, eso daba problemas pero lo resolvi quitando el MCLR. Bueno, nose si el problma sera ese pero en el 18F4550 funciona bien.
Bueno, creo que eso es todo, espero no olvidarme de nada. Ojala les sirva de algo, cualquier duda, preguntar y sugerencia sobre filtros (porque es poca mi experiencia en motores y muchos los ruidos que causa) o lo que sea darlas porfavor

Un saludete.
Todo eso es lo que escribi en ese entonces, espero le resulte de gran ayuda a alguien.
salu2.