TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: vinnymoy en 28 de Enero de 2009, 00:28:47
-
Hola, yo soy realmente nuevo en esto de los pic's y estoy bastante confundido.
Tengo que hacer un programa en el cual controle un motor dc de 12V que tiene como max 3200 RPM, como el pic solo saca 5 V es obvio que voy a tener que hacer un amplificador de voltaje y de corriente.
Estoy usando el modulo PWM para el control de la velocidad.
La cosa es que por RA0 entra un voltaje y usando el adc obtengo el valor del duty que usa el PWM. Ahora este valor debo enviarlo a la computadora por la hiperteminal y a un lcd.
Ahora bien tengo varios problemas:
1) Tengo que mostrar el valor de las revoluciones por minuto y no del ADC, como lo hago? Además suponiendo que por RA0 entre 5V (q es el maximo) cuanto me devuelve el ADC? me devuelve 255? porque en el lcd me sale 127.....
2)Como hago para enviar por rs232 y como se hace con la hiperterminal?
Este es mi programa:
#include <16F877A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B0,rcv=PIN_B1,bits=8)
#include <lcd.c>
int valor;
int aux=0;
void main()
{
lcd_init();
port_b_pullups(TRUE);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
// Inicio
lcd_putc("\f Micros...");
delay_ms(500);
lcd_putc("\f");
for(;;){
// Adquisicion del dato del ADC RA0
set_adc_channel(0);
delay_us(100);
valor=read_adc();
delay_ms(10);
if(aux!=valor){
//Configuración del PWM
set_pwm1_duty(valor);
//Envio al lcd
lcd_putc("\f");
lcd_putc("Valor=");
printf(lcd_putc,"%d",valor);
//Envio al PC
delay_ms(20);
}
aux=valor; //Esto hago para que no se borre el lcd siempre sino solo cuando hay nuevos valores...
}
}
Ayuda por favor!!!!!!!!!!!!!!!!!!
-
Hola, vas por buen camino...
Te comento que para que te muestre el valor de la revoluciones, tienes que hacer una regla de tres sencilla (solo si tu sensor de revoluciones es lineal), es decir, si 1 voltios son 300 RPM entonces 3 voltios serán X RPM, si sabes ya has leído de la CA/D del 16f877a te darás cuenta que 0 voltios es un 0 en decimal y 5 voltios son 255 en decimal (de 0x00 a 0xFF), multiplica y divide, lo cargas a una variable y lo muestras, HAGO DE NUEVO LA ACLARACIÓN, solo si tu sensor es lineal, deberías decirnos cual estas utilizando.
Ahora para lo de enviarlo por RS232, sencillamente tu pic tiene que preguntar cada X tiempo si el PC esta intentando enviarle algo, lee un poco en el foro sobre comunicación rs232 encontras tu respuesta rápidamente...
-
Hola!!!
Mira lo que dice vinnymoy es correcto y la lcd temuestra el valor 127 porque debes declarar la variable como int16 o long int a mi tambien me sucedia eso y el porcentaje para imprimir es %Lu si no tiene signo y %Ld si tiene signo para imprimir....
Espero te sirva de algo la informacion....
salu2....