uControl
Mayo 22, 2013, 08:30:02 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2 3   Ir Abajo
  Imprimir  
Autor Tema: ADC dspic30f4013 en CCS  (Leído 4064 veces)
0 Usuarios y 1 Visitante están viendo este tema.
ing_barreto
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 48


Novel en el manejo de Microcontroladores


« : Junio 12, 2012, 12:03:28 »

Hola saludos desde Colombia soy nuevo en el foro.

Estoy tratando de configurar el ADC del dspic30f4013 en CCS y tengo una inestabilidad en la última cifra en el rango de 0 a 5 dígitos, estoy confundido si es error de programación o ruido de la señal.
coloco el código para descartar algún error.

// configuración de los fuses
#include <30F4013.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS2_PLL16                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PR_PLL                      //Primary Oscillator
#FUSES NOCKSFSM                 //Clock Switching is disabled, fail Safe clock monitor is disabled
#FUSES WPSB16                   //Watch Dog Timer PreScalar B 1:16
#FUSES WPSA512                  //Watch Dog Timer PreScalar A 1:512
#FUSES PUT64                    //Power On Reset Timer value 64ms
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV47                   //Brownout reset at 4.7V
#FUSES LPOL_HIGH                //Low-Side Transistors Polarity is Active-High (PWM 0,2,4 and 6)
   //PWM module low side output pins have active high output polar
#FUSES HPOL_HIGH                //High-Side Transistors Polarity is Active-High (PWM 1,3,5 and 7)
   //PWM module high side output pins have active high output polarity
#FUSES NOPWMPIN                 //PWM outputs drive active state upon Reset
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOCOE                    //Device will reset into operational mode
#FUSES ICSP1                    //ICD uses PGC1/PGD1 pins
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#device adc=12                 //ADC 12 bits

#use delay(clock=120000000)

//código

#define LCD_ENABLE_PIN  PIN_F4                                    ////
 #define LCD_RS_PIN      PIN_F6                                    ////
 #define LCD_RW_PIN      PIN_F5                                    ////
 #define LCD_DATA4       PIN_D2                                    ////
 #define LCD_DATA5       PIN_D8                                    ////
 #define LCD_DATA6       PIN_D1                                    ////
 #define LCD_DATA7       PIN_D0   
 

 
 #include <lcd.c>
 #include <math.h>
 #include <stdlib.h>

 float voltaje;
 float Lect_adc;

void main()
{
 
 Lect_adc=0;//  valor adc
 voltaje=0;
 
 lcd_init();
 setup_adc_ports (sAN2|VREF_VREF);
 setup_adc(ADC_CLOCK_DIV_32|ADC_TAD_MUL_2);  //especificamente configurado a 120
     
 while(true)
 {
   set_adc_channel(2);
   Lect_adc = read_adc();
   delay_ms(20);
 
   voltaje=((5.0*Lect_adc)/4095);
 
   lcd_putc("\f");
   
   lcd_gotoxy(0,1);
   printf(lcd_putc,"Voltaje = %f ",voltaje);
   
   lcd_gotoxy(0,2);
   printf(lcd_putc,"ADC = %f",Lect_adc);
   delay_ms(500);
 
 }
 
}


Por el momento me interesa que funcione como multimetro.
agradezco cualquier sugerencia.
Los voltajes de referencias por el momento para pruebas son tierra y 5 voltios.
En línea

Luis Angel Hernández Barreto
VelazquezBio
"...La Felicidad solo es completa, cuando es compartida..."
Amigo de uControl
PIC18F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 1455


Alea Iacta Est...


« Respuesta #1 : Junio 12, 2012, 12:21:24 »

Bienvenido al foro!

Lect_adc no debe ser.float sino Int16.

Veamos la resolucion de tu Adc en 12 bit. Con tensiones de ref. 0 a 5v. Vamos a los milivot... 5000/4096 Y obtendras el paso de tu adc. Es decir que tendras como resolucion maxima sera 5000/4095... Es decir 1.03 mV... Apriximadamente.

El ultimo digito del que hablas... Va a variar dalo por hecho.

Saludos.
En línea

No será fácil y no sera corto el camino, pero se que seré feliz mientras lo transite.
el_vpi
Moderador
PIC18F
*****
Desconectado Desconectado

Mensajes: 1122



« Respuesta #2 : Junio 12, 2012, 07:32:33 »

tambien veo que tenes un clock de 120Mhz  shocked

#use delay(clock=120000000)

fijate que quiza ese te de algun warning, o produciendo algun problema de telctura anticipada.
Y dalo por seguro lo que puso velazquezbio, vas a tener unas cuantas cuentas de ruido con un ADC de 12 bits.

Saludos, Daniel.
En línea
E_Blue
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 2132


Electric Blue


« Respuesta #3 : Junio 12, 2012, 09:30:20 »

Es ruido, ¿Estas usando algún OP para "bufferear" la entrada y/o algún filtro de paso bajo?
El PCB también es importante, ¿De cuantas capas es?  ¿Rellenaste el PCB con un plano de masa(GND)?

¿Filtros en AVDD y en la alimentación de la referencia de tensión?

Por otro lado, siendo que lo querés usar como multímetro/polímetro deberías tener en cuenta que usualmente los multímetros refrescan la pantalla 3 o 4 veces por segundo, en el tiempo intermedio se dedican a integrar la señal que están midiendo.
Tu deberías hacer lo mismo, en vez de tomar un muestra, mostrarla, esperar medio segundo y volver al inicio podrías aprovechar el tiempo muerto para tomar muestras, por ejemplo cada 50mS y almacenarlas en un buffer de 8 posiciones, luego lo que mostrarías seria el promedio.

Para eso deberías crear una variable int16 Buffer[8] e iterar mediante, por ejemplo, un for 8 veces tomando muestras cada 50mS.

Es solo una idea básica para tener una lectura mas estable, aunque también seria bueno usar un filtro de paso bajo en la entrada y un buffer con OP que adapte impedancias, como dije antes.
« Última modificación: Junio 12, 2012, 09:32:39 por E_Blue » En línea

Procesando...
Si escribes para la (censurado) solo ella va a leerte.

Si quieres ayuda con tu proyecto recuerda agregar información del mismo, y no seas haragán y esperes tener todo servido, esto es un foro, no una bolsa de trabajo.
Suky
**----- ^^ ------**
Moderador
dsPIC
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5345


Con Qt...


WWW
« Respuesta #4 : Junio 12, 2012, 10:36:49 »

tambien veo que tenes un clock de 120Mhz  shocked

#use delay(clock=120000000)

Es correcto... 120 MHz/4 = 30 MIPS  Wink

Lect_adc no debe ser.float sino Int16.

Eso no genera ningún inconveniente.  Wink

Estoy con E_Blue, para mejorarlo podes colocarle un filtro pasabajos y además promediar los valores, va a mejorar bastante (en teoría) pero igual vas a tener una oscilación.


Saludos!
En línea

E_Blue
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 2132


Electric Blue


« Respuesta #5 : Junio 12, 2012, 10:59:37 »

tambien veo que tenes un clock de 120Mhz  shocked

#use delay(clock=120000000)

Es correcto... 120 MHz/4 = 30 MIPS  Wink

Si con esos se sorprende debería ver los de 80MHZ/80MIPS, si, una instrucción por ciclo de reloj, es como un PIC "regular" con un clock de 320MHz  Baba y ademas con instrucciones mas potentes y de 32bits  Baba, eso para los "zapallos" que despotrican los PICs diciendo que es solo para hobbystas, evidentemente se quedaron en el pasado, les decís PIC y se imaginan un 16F84. Idiota

En línea

Procesando...
Si escribes para la (censurado) solo ella va a leerte.

Si quieres ayuda con tu proyecto recuerda agregar información del mismo, y no seas haragán y esperes tener todo servido, esto es un foro, no una bolsa de trabajo.
el_vpi
Moderador
PIC18F
*****
Desconectado Desconectado

Mensajes: 1122



« Respuesta #6 : Junio 12, 2012, 11:54:09 »

gracias suky, siempre se sale aprendiendo algo nuevo.
Corre a 30 MIPS  Cry
En línea
Suky
**----- ^^ ------**
Moderador
dsPIC
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5345


Con Qt...


WWW
« Respuesta #7 : Junio 12, 2012, 12:58:52 »

Si con esos se sorprende debería ver los de 80MHZ/80MIPS, si, una instrucción por ciclo de reloj, es como un PIC "regular" con un clock de 320MHz  Baba y ademas con instrucciones mas potentes y de 32bits  Baba, eso para los "zapallos" que despotrican los PICs diciendo que es solo para hobbystas, evidentemente se quedaron en el pasado, les decís PIC y se imaginan un 16F84. Idiota

Esto es un off-topic, pero vale aclarar que no solo la velocidad de ejecución hay que tener en cuenta, sino inmunidad al ruido, periféricos, precios, y un largo etc. Dadas las características del desarrollo uno debe ver cual elegir  Wink


Saludos!
En línea

ing_barreto
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 48


Novel en el manejo de Microcontroladores


« Respuesta #8 : Junio 18, 2012, 12:59:25 »

Hola saludos gracias a todos por las respuestas son de gran ayuda.
Considero que la programación del dsPIC es correcta las pruebas las estoy realizando en protoboard asi que como es lógico el ruido ahí es mucho  Grin.

Ahora quiero realizar la transmisión vía serial del valor adc entre 2 pic.
Maestro el dspic30f4013 y esclavo el pic18f4550.
En línea

Luis Angel Hernández Barreto
ing_barreto
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 48


Novel en el manejo de Microcontroladores


« Respuesta #9 : Junio 20, 2012, 03:48:12 »

 Hola de nuevo desde colombia  Grin Ahora tengo nuevos problemas.
 Quiero enviar el valor del adc leído por el dsPIC30f4013 a un pic18f4550 vía Serial USART.

 el problema es que solo puedo enviar 8 bits por lo tanto he tratado de realizar operaciones de corrimiento de bits en CCS no lo he logrado. anexo el código del maestro para que me ayuden a solucionar el error.  Cry Cry

//código Maestro
#include <30F4013.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS2_PLL16                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for
#FUSES PR_PLL                      //Primary Oscillator
#FUSES NOCKSFSM                 //Clock Switching is disabled, fail Safe clock monitor is disabled
#FUSES WPSB16                   //Watch Dog Timer PreScalar B 1:16
#FUSES WPSA512                  //Watch Dog Timer PreScalar A 1:512
#FUSES PUT64                    //Power On Reset Timer value 64ms
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV47                   //Brownout reset at 4.7V
#FUSES LPOL_HIGH                //Low-Side Transistors Polarity is Active-High (PWM 0,2,4
#FUSES HPOL_HIGH                //High-Side Transistors Polarity is Active-High (PWM 1,3,5
#FUSES NOPWMPIN                 //PWM outputs drive active state upon Reset
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOCOE                    //Device will reset into operational mode
#FUSES ICSP1                    //ICD uses PGC1/PGD1 pins
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#device adc=12                 //ADC 12 bits

#use delay(clock=120000000)

#use rs232(baud=9600,bits=8,parity=N,UART1)  //xmit=PIN_F3 = TX ,rcv=PIN_F2 = RX

 #define LCD_ENABLE_PIN  PIN_F4                                    ////
 #define LCD_RS_PIN      PIN_F6                                    ////
 #define LCD_RW_PIN      PIN_F5                                    ////
 #define LCD_DATA4       PIN_D2                                    ////
 #define LCD_DATA5       PIN_D8                                    ////
 #define LCD_DATA6       PIN_D1                                    ////
 #define LCD_DATA7       PIN_D0   
 
 #include <lcd.c>
 #include <math.h>
 
 
 float voltaje;
 int16 Lect_adc;
 int8 mayores;
 int8 menores;
 
 //función que calcula el voltaje
 void CalcularVoltaje()
 {
   float adc=0;
   adc= (float)Lect_adc;
   voltaje=((5.0*adc)/4095);
 }
 
 //funcion enviar serial
 void EnviarSerial()
 {
   mayores=Lect_adc>>8;
   menores=Lect_adc;
 
   putchar('*');
   putc(mayores);
   putc(menores);
 }

 //funcion leer adc
 void LeerAdc()
 {
  set_adc_channel(2);
  Lect_adc = read_adc();
  delay_ms(20);
 }

 void main()
{
 
 voltaje=0;
 Lect_adc=0;
 mayores=0;
 menores=0;

 lcd_init();
 setup_adc_ports (sAN2|VREF_VREF);
 setup_adc(ADC_CLOCK_DIV_32|ADC_TAD_MUL_2);
 
 while(true)
 {
 
  LeerAdc();
  EnviarSerial();
  CalcularVoltaje();
   
   lcd_putc("\f");
   
   lcd_gotoxy(0,1);
   printf(lcd_putc,"mayor= %u %Lu",mayores,Lect_adc);
   
   lcd_gotoxy(0,2);
   printf(lcd_putc,"men %u %f",menores,voltaje);
   delay_ms(1000);
 }
}


El problema lo tengo en la función EnviarSerial().
por ejemplo para las pruebas que he realizado la variable Lect_adc=4095.
mi idea sobre lo que considero que almacena esta variable es (ni idea si estoy equivocado)
Lect_adc=4095=0000111111111111  los 12bits del adc y como la variable es de 16 bits considero que se rellena con ceros  Grin.
entonces la instrucción mayores=Lect_adc>>8; me realiza un corrimiento de 8 bits a la derecha. por lo tanto mayores=00001111 que en decimal es igual a 15. es correcto esto?
bueno me funciona Huh?.
el problema lo tengo en   menores=Lect_adc; yo pensaría que la variable se trunca es decir se guardan los primeros 8 bits de la izquierda es decir menores=11111111 lo cual en decimal es 255. Pero no Cry .
Ni idea necesito su ayuda por que me muestra es menores=1111111111111111 decimal 65535.
Ni idea señores agradezco cualquier sugerencia o solución para el error.
En línea

Luis Angel Hernández Barreto
Suky
**----- ^^ ------**
Moderador
dsPIC
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5345


Con Qt...


WWW
« Respuesta #10 : Junio 20, 2012, 04:20:35 »

Es cierto lo que comentas, menores solo toma los primeros 8-bits y mayores los próximos 8. O sea, así como lo haces esta bien.

Que recibes en el 4550?
En línea

el_vpi
Moderador
PIC18F
*****
Desconectado Desconectado

Mensajes: 1122



« Respuesta #11 : Junio 20, 2012, 04:44:12 »

para segurarme leer bien los 8 bits menos significativos aplicaria un cast a la funcion.

Tenes:
menores=Lect_adc;

Lo cambiaria por:
menores=(int8)Lect_adc;

saludos, Daniel.
En línea
E_Blue
PIC24F
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 2132


Electric Blue


« Respuesta #12 : Junio 21, 2012, 10:15:53 »

para segurarme leer bien los 8 bits menos significativos aplicaria un cast a la funcion.

Tenes:
menores=Lect_adc;

Lo cambiaria por:
menores=(int8)Lect_adc;

saludos, Daniel.

Concuerdo con el_vpi, lo que no se es si será necesario agregarle una mascara 0XFF o se filtrara al hacer el casteo. duda

Código:
menores=(int8)(Lect_adc&0xFF);

¿Será redundante? duda

En CCS tenes la función make8(), pero si querés hacer el código portable a otros compiladores mejor no la uses.
« Última modificación: Junio 21, 2012, 10:18:39 por E_Blue » En línea

Procesando...
Si escribes para la (censurado) solo ella va a leerte.

Si quieres ayuda con tu proyecto recuerda agregar información del mismo, y no seas haragán y esperes tener todo servido, esto es un foro, no una bolsa de trabajo.
Suky
**----- ^^ ------**
Moderador
dsPIC
*****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5345


Con Qt...


WWW
« Respuesta #13 : Junio 21, 2012, 11:07:44 »

En realidad hacer menores=Lect_adc; es suficiente. Como menores es de 8-bits solamente toma los 8-bits bajos de Lect_adc, otra cosa rara no puede hacer  shocked Seguramente el cast no genera ningún código adicional, y hacer un AND 0xFF sería redundante.

Saludos!
En línea

ing_barreto
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 48


Novel en el manejo de Microcontroladores


« Respuesta #14 : Junio 21, 2012, 10:23:12 »

Amigos del foro SUKY,  E_Blue.
printf(lcd_putc,"men %u %f",menores,voltaje);
en esta línea muestro los menores y el voltaje y me muestra
menores=1111111111111111 16 bits decimal 65535 aqui es donde tengo el error   cabezaso a la pared
el sábado coloco el código del esclavo pic18f4550.

Lo del casteo ya lo intente y me dio el mismo resultado. (E_Blue)
En línea

Luis Angel Hernández Barreto
Páginas: [1] 2 3   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.18 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.084 segundos con 28 consultas. (Pretty URLs adds 0.032s, 3q)
loggkey