TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cmontoya en 09 de Marzo de 2015, 22:14:32
-
Hola amigos
Tengo el codigo que maneja PWM y lo muestra en LCD hasta hay voy bien, pero se me solicito en la practica mostral tambien las RPM.
para ello frecuencia=1/T y RPM=Frecuencia*60
Amigos del foro como hago para que este codigo me muestre las RPM ........agradesco mucho su correciones
#include <16F877.h>
#fuses XT, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NOWRT, NODEBUG
#use delay(clock=4000000)
#use fast_io(a)
#define use_portb_lcd TRUE //definir portb lcd
#define LCD_ENABLE_PIN PIN_B2
#define LCD_RS_PIN PIN_B0
#define LCD_RW_PIN PIN_B1
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7
#include <lcd.c> //libreria manejo lcd
void main()
{
int8 duty = 127; // Iniciar a la mitad el ciclo activo del PWM
int8 frecuencia,RPM;
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_16, 124, 1);
setup_ccp1(CCP_PWM);
setup_adc_ports(NO_ANALOGS);
set_tris_d(0x0F);
lcd_init();
while (true)
{
RPM=(1/duty)*60;
if(input_state(PIN_D1)==1)
{
duty ++;
delay_ms(50);
if (duty >=245){duty = 245;} // No permitir que duty supere 245
}
if (input_state(PIN_D2)==1)
{
duty --;
delay_ms(50);
if (duty == 255){duty = 0;} // No permitir el desborde del conteo
}
RPM=(1/duty)*60;
lcd_gotoxy(1,1);
printf(lcd_putc,"DIGITAL: %03u",duty);
lcd_gotoxy(1,2);
printf(lcd_putc,"RPM: %03u",RPM);
set_pwm1_duty(duty/2);
}
}
-
si hablamos de RPM imagino que es de un motor.. por lo cual deberias de tener un sensor que te de un pulso cuando de una vuelta.
Luego podes usar algun timer con entrada externa que te permita contar los pulsos en cierta cantida de tiempo, de esa forma lo llevas a RPM.
-
Si claro se supone,,,,,,,,,,,,,,, pero como lo controlamos con PMW omitimos este sensor para solo manejarlo en esa actividad asi.............la cuesties es saber cuantas RPM hay en el PWM=240 por ejemplo
-
No vas a tener una relacion directa. Los RPM van a depender de la carga y corriente que le estes suministrando. No veo como podes asegurar un valor que no estas midiendo. Podes variar la tension y corriente que pase por el motor pero va a depender de la carga tambien.
Con lo cual mantener un motor con un PWM de 50% de duty sean 1000 RPM para una carga y 800 RPM para otra y en vacio otra. un PWM al 50 en un motor puede ser 1800 RPM y en otro 400 RPM. No hay una relacion directa (al menos creo yo).
Si es una carga fija podrias medir a distintos porcentajes de duty ( o dentro de los cuales te manejas ) y tratar de re crear una formula que se aproxime a tus datos.
De esa forma te queda una formula RPM( duty ) que ante cambios en la carga terminaria siendo erroneo lo indicado
.
Sino leyendo con algun sensor es lo mas seguro. o si es brushless imagino que podria ser de otra forma.
Ademas no se que motor es, pero imagino que un motor de DC. Y por utilizar PWM no te ahorras ese sensor.. tal ves dejando de alimentar y leyendo el ADC pero espero que la carga tenga una buena inercia para que haga varias vueltas a la misma velocidad :)
PD: Si lo hay estaria bueno ver la matematica involucarada tras de la misma.