Autor Tema: CONVERSION A/D Y ENVIO POR SERIE PWM DESDE PC  (Leído 2513 veces)

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

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
CONVERSION A/D Y ENVIO POR SERIE PWM DESDE PC
« en: 18 de Junio de 2004, 13:46:00 »
El programa consiste en enviar por teclado el duty del PWM ( desde 0 a 60, que seria el maximo) y a la vez cada vez que se envia esto, se hace una conversion A/D, y se manda por el puerto serie!!!
Tengo problemas, me sale el PWM, pero luego al hacer la conversion me envia por el puerto serie el .00, por que??tengi un potenciometro en la entrada, y la Vref es de 5 voltios, y el fondo de escala es de 5voltios tb; y el nº de bits es de 10!!
AQUI OS PONGO EL CODIGO gracias, y si me pudoerais ayudar mucho mejor!!!!

*****************************************************

#include <16f876.h>
#device  adc=10
#include <stdlib.h>

#fuses XT, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


main()
{
   float const resolucion=5.0/1024.0;

   char value;
   char string[10];               //9 caracteres (0-255) más el caracter de RETURN, admite flotantes, pero los redondea
   int duty;
   float dutyreal;
   float velocidad;
   int i;
   float dato;
   long value2;

   setup_ccp1(CCP_PWM);             //Se habilita el pwm
   setup_timer_2(T2_DIV_BY_16, 61, 1);   //Se establece el valor de la frecuencia
   duty = 0;
   set_pwm1_duty(duty);
   setup_adc_ports( ALL_ANALOG );   //todo el puerto analogico
   setup_adc( ADC_CLOCK_INTERNAL ); //convertidor con clock interno
   set_adc_channel( 0 );   //el canal 0

   while (1)
    {
        while(!kbhit());             //Espera la recepcion de un caracter
        value=getc();
        if (value=="s")
       {
           output_high(PIN_A0);       //Avisa llegada de la s
           while(!kbhit());
           output_low(PIN_A0);
           output_high(PIN_A1);     //Avisa llegada del Duty
           gets(string);             //Guarda el Duty (0-255) en la variable string
                             //y espera un RETURN (Ctrl 13)
           duty=atoi(string);          //Usa la función ATOI para pasarlo a entero

         //dutyreal=(duty*60)/100;

         //dutyreal=duty*0.6;

           set_pwm1_duty(duty);       //El caracter ascii recibido pasado a entero
                                //establecido como ciclo de trabajo
           output_low(PIN_A1);

         //velocidad=duty*80;   //deseo saber cual es la velocidad del motor segun sus caracteristicas

         //puts("La velocidad del motor es:   ";
         //puts(velocidad);

         //convertidores A/D


         delay_ms(5);   //delay de 5ms, frecuencia de adquisicion 200Hz como mucho
         value2 = read_adc();
         dato = value2*resolucion;
         printf("%1.2f voltios",dato);

      }
    }
}

PD: Gracias otra vez y saludos, por favor necesito ayuda!!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: CONVERSION A/D Y ENVIO POR SERIE PWM DESDE PC
« Respuesta #1 en: 19 de Junio de 2004, 11:06:00 »
Quizá me equivoque, pero en el PIN A0 ¿qué tienes? La entrada analógica de un potenciómetro o lo usas como salida digital. Viendo el programa pararece que lo uses para las dos cosas a la vez.

Otra cosilla, en comentarios tienes que:

//dutyreal=(duty*60)/100;

//dutyreal=duty*0.6;

//velocidad=duty*80; //deseo saber cual es la velocidad del motor segun sus caracteristicas

¿Podrías explicar como calculas la velocidad del motor?

El potenciómetro en A0 ¿qué simula?

Un saludo

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: CONVERSION A/D Y ENVIO POR SERIE PWM DESDE PC
« Respuesta #2 en: 20 de Junio de 2004, 05:25:00 »
Solo son comentarios, que no tienen ninguna funcion en el programa principal; pero si quieres saberlo, se calcula con las caracteristicas del motor de intensidad y voltage y revoluciones nominales.

En cuanto a mi problema, en AN0 solo quiero que sea entrada analogica, y tengo un potenciometro, la patilla que varia metiendola a AN0, y los extremos del potenciometro a masa y a 5V.

Por favor haber si podeis ayudarme!!
PD: Lo del calculo de la velocidad no tiene importancia, simplemente era para probar unas cosas!!!
Saludos y gracias!!!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: CONVERSION A/D Y ENVIO POR SERIE PWM DESDE PC
« Respuesta #3 en: 20 de Junio de 2004, 10:50:00 »
Te lo vuelvo a repetir:

- Tienes definido AN0 como entrada analógica y de hecho tienes conectado a este pin un potenciómetro.

- Sin embargo en el programa haces:

   output_high(PIN_A0);

y también al finalizar:

   output_low(PIN_A0);

Con lo cual es lógico que recibas en el hiperterminal un 0, ya que este "cerapio" (0),  es lo que está capturando el conversor A/D.

Un saludo

Desconectado Xa2

  • PIC12
  • **
  • Mensajes: 58
RE: CONVERSION A/D Y ENVIO POR SERIE PWM DESDE PC
« Respuesta #4 en: 21 de Junio de 2004, 05:13:00 »
Muchas Gracias POCHER!!!
aHORA TENGO OTRA DUDA, que habria que sumar al codigo para que convertiera 2 entradas analogicas a la vez y enviara los resulatdos por el puerto serie???
Claro , sin cambiarlo solo me leeria la entrada AN0, pero y si quiero leer tb la entrada AN1???
Gracias de nuevo y Saludos!!!
PD: Como seria  la simulacion en Proteus con el MAX232?? Claro, por que ahora yo simulo directamente desde el Hiperterminal Virtual a PIC, pero en la practica tendria que poner el MAX232!! Si me pudieris ayudar os lo agradeceria mucho!!
Saludos de nuevo foreros!!!

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: CONVERSION A/D Y ENVIO POR SERIE PWM DESDE PC
« Respuesta #5 en: 21 de Junio de 2004, 10:08:00 »
Simplemente en el while cuando vayas a usar el canal0 haces:

set_adc_channel( 0 );
valuecanal0 = read_adc();
datocanal0 = valuecanal0*resolucion;
printf("%1.2f voltios",datocanal0);

y a continuación para tomar datos del canal1:

set_adc_channel( 1 );
valuecanal1 = read_adc();
datocanal1 = valuecanal1*resolucion;
printf("%1.2f voltios",datocanal1);

¡A que es más sencillo de lo que parecía!

La otra pregunta:

Como bien dices en PROTEUS no hace falta poner el MAX232, la simulación funciona igual. Si lo quieres poner no hay ningún problema, conecta la salida RC6 del PIC con T1IN del MAX y T1OUT del MAX con R1IN de otro MAX y R1OUT de este último con RXD del Terminal Virtual.

Para las conexiones en el otro sentido pués igual:

TXD de VTERM con T1IN del 2º MAX, T1OUT de este con R1IN del primer MAX y R1OUT de este con RC7 del PIC.

Estas son las conexiones que tendrás que hacer luego físicamente, emplea cable cruzado para conexionar el MAX externo con el del PC, o bien cable sin cruzar y haz el cruce en la placa.

Un saludo


 

anything