Autor Tema: Cual es el error en mi codigo en C ?  (Leído 1611 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ElComandanteFort

  • PIC10
  • *
  • Mensajes: 13
Cual es el error en mi codigo en C ?
« 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
Basta chicos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Cual es el error en mi codigo en C ?
« Respuesta #1 en: 12 de Noviembre de 2016, 19:29:40 »
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

Desconectado ElComandanteFort

  • PIC10
  • *
  • Mensajes: 13
Re:Cual es el error en mi codigo en C ?
« Respuesta #2 en: 12 de Noviembre de 2016, 20:23:15 »
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 ?
Basta chicos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Cual es el error en mi codigo en C ?
« Respuesta #3 en: 12 de Noviembre de 2016, 22:59:47 »
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.


 

anything