TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ElComandanteFort en 12 de Noviembre de 2016, 17:16:27
-
Hola soy nuevo aqui , quiero hacer modulacion por ancho de pulso para variar la velocidad de un motor de 12v con este codigo pero en el proteus como que no varia la velocidad y se prende y apaga cada cierto tiempo
#include <16f877A.h> // Utilizamos el PIC 16F877A
#device adc=10 // Usa resolución de 10 bits
#use delay(clock=4M) // Cristal a utilizar
#fuses XT,NOWDT,NOPROTECT
#define lcd_rs_pin pin_D0
#define lcd_rw_pin pin_D1
#define lcd_enable_pin pin_D2
#define lcd_data4 pin_D4
#define lcd_data5 pin_D5
#define lcd_data6 pin_D6
#define lcd_data7 pin_D7
#include <lcd.c>
#use standard_io (B)
#use standard_io (D)
void main (void)
{
float th,tl,medicion,porcentaje;
lcd_init(); // Inicia LCD
lcd_putc(" Control de velocidad\n"); // Saca texto
lcd_putc(" de un motor DC"); // Saca texto
delay_ms(2000);
lcd_putc("\f"); // Limpia pantalla
lcd_putc("Duty\n"); // Saca texto
lcd_putc("= "); // Saca texto
lcd_gotoxy(14,2); // Acomoda cursor LCD
lcd_putc("%");
while (1)
{
// lcd_gotoxy(8,2); // Acomoda cursor LCD
// lcd_putc(" "); // Limpia ese sector de pantalla
//lcd_gotoxy(8,2); // Acomoda cursor LCD
//********************************************************//
setup_adc (adc_clock_internal);
setup_adc_ports (all_analog);
set_adc_channel (0); // Elige canal a medir RA0
delay_us (20);
medicion=read_adc (); // Hace conversión AD
setup_adc (adc_off); // Apaga ADC
th=medicion*(0.01953125);
tl=20-th;
porcentaje=th*(5);
output_high(pin_B0);
delay_ms(th);
output_low(pin_B0);
delay_ms(tl);
// Pasa binario a °C
//**********************************************************//
// printf(lcd_putc,"%02.1f",porcentaje); // xx.x
}
}
Como ven uso periodo total de 20ms y el alto depende del adc
no entiendo cual es el error me podrian decir
-
No veo error, solamente una par de cosas:
Todos los setup_xxx irian fuera del while(1), Al ADC lo activas una ves y lo dejas activo para siempre. el set_adc tambien afuera. ya que siempre lees una entrada, no es necesario estar continuamente cambiando a la misma entrada, es mas , no tiene sentido hacerlo. Distinto si tuvieras 2 entradas analogicas.
Las rutinas del LCD, si los pones DENTRO del while entonces vas a tener problemas, ya que estas tardan un tiempo en completarse, arruinando tu PWM.
Al igual que esa multiplicacion, es algo que tarda tiempo y se va a ver en la salida.
Por si tu idea es crear un PWM, deberias comenzar a usar los modulos que tienen los PICs, en el que solamente cargas tu duty y ya la salida cambia sola. Como es por hardware los problemas que ocurren al ocupar el tiempo en otras cosas como lo del LCD y la multiplicacion no te afectarian
-
No veo error, solamente una par de cosas:
Todos los setup_xxx irian fuera del while(1), Al ADC lo activas una ves y lo dejas activo para siempre. el set_adc tambien afuera. ya que siempre lees una entrada, no es necesario estar continuamente cambiando a la misma entrada, es mas , no tiene sentido hacerlo. Distinto si tuvieras 2 entradas analogicas.
Las rutinas del LCD, si los pones DENTRO del while entonces vas a tener problemas, ya que estas tardan un tiempo en completarse, arruinando tu PWM.
Al igual que esa multiplicacion, es algo que tarda tiempo y se va a ver en la salida.
Por si tu idea es crear un PWM, deberias comenzar a usar los modulos que tienen los PICs, en el que solamente cargas tu duty y ya la salida cambia sola. Como es por hardware los problemas que ocurren al ocupar el tiempo en otras cosas como lo del LCD y la multiplicacion no te afectarian
uff bro en realidad si habia un error que no se puede poner variables directamente en el delay _ms , ya funciona pero como dices por las multiplicaciones en el proteus me sale un error de aprox 5 ms( extra a tiempo de nivel bajo ) y pues ya malogro el pwm , sabes como hacer mas optimo el programa ?
-
Pense que CCS permitia el uso de variables dentro del delay_ms().
Usando el module CCP del PIC ( puesto como PWM ), En esto no te puedo proveer nada, pero de seguro que podes encontrar muchos ejemplos en el foro o por internet.