uControl
Junio 20, 2013, 02:25:17 *
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]   Ir Abajo
  Imprimir  
Autor Tema: CCS - Canales A/D  (Leído 6539 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Ariel
Global Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 10288



WWW
« : Septiembre 29, 2008, 07:50:06 »

Hace un momento me preguntaban por mail como configurar dos canales A/D....

Este trozo de código puede ayudar a entender el problema:

Código:
#include <16f877A.h>
#device adc=8//La resolución del módulo A/D es de 8 bits.
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)

   #define antirebotes           50     // Tiempo para los delays antirebotes, en ms
   #define TIEMPO_ENTRE_LECTURAS 10     //ms entre una y otra lectura.


//Leo el valor del ejeX -> AN0 ------------------------------------//
 int Leo_EjeX (void){
  set_adc_channel(0);
  delay_ms(1);
  a_ejeX=read_adc();
  delay_ms(1);
  return a_ejeX;
 }

//Leo el valor del ejeY -> AN1 ------------------------------------//
 int Leo_EjeY (void){
  set_adc_channel(1);
  delay_ms(1);
  a_ejeY=read_adc();
  delay_ms(1);
  return a_ejeY;
 }

//Leo el valor del ejeZ -> AN2 ------------------------------------//
 int Leo_EjeZ (void){
  set_adc_channel(2);
  delay_ms(1);
  a_ejeZ=read_adc();
  delay_ms(1);
  return a_ejeZ;
 }


//Efectúa el ensayo completo, guardando datos en la EEPROM---------//
realizar_ensayo(void){
   int i;

      a_ejeX = Leo_EjeX ();
      a_ejeY = Leo_EjeY ();
      a_ejeZ = Leo_EjeZ ();


      delay_ms(TIEMPO_ENTRE_LECTURAS);
   }

}




//-----------------------------------------------------------------//
// Programa Principal ---------------------------------------------//
//-----------------------------------------------------------------//
void main() {
   int i;
  set_tris_a(0xFF);      // Puerto A todo entradas
  port_b_pullups(FALSE); // Resistencias de polarización
  set_tris_b(0x38);      //
  set_tris_c(0x00);      // Puerto C todo salidas
  set_tris_d(0x00);      // Puerto D todo salidas

  //Configuro los canales del ADC
  SETUP_ADC_PORTS(AN0_AN1_AN2_AN3_AN4);
  SETUP_ADC(ADC_CLOCK_DIV_8 );
  SETUP_VREF(VREF_HIGH | 6 );


  //Habilito interrupciones
  enable_interrupts(int_rda);
  enable_interrupts(global);

  realizar_ensayo();
 }


Saludos!
En línea

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert
ESAU
PIC10F
*
Desconectado Desconectado

Mensajes: 8


« Respuesta #1 : Septiembre 30, 2008, 10:37:54 »

Hola Ariel como estas??

Estuve checando tu mail.. pero como que aun no termino de entender ciertas partes del codigo que propones..... mira te voy a presentar mi codigo para que lo cheques sale??

#include <18f4550.h>       //PIC utilizado
#device ADC = 8            //Configuracion de ADC de 8 bits

#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN
#use delay (clock=48000000)

   void main(void)
   {
      int value,i;
      setup_adc_ports( AN0_TO_AN1 );
      setup_adc(ADC_CLOCK_INTERNAL );
      set_adc_channel(0);
           
      DO
      {
            delay_us(10);
            value = read_adc();
            output_b(value);
      }
      while(1);

   }

En este caso, quiero usar 2 pines analogicos (RA0 y RA1).... y asi como tengo el codigo si cambio en la funcion set_adc_channel(x), DONDE x es 0 o 1, funciona el circuito solo para un solo canal....

Pero deseo que sean los dos..... y lei que uno debe de esperar cierto tiempo para cambiar de canal...

Basicamente mi aplicacion es sensar una variable por RA0 y filtrar esta señal para que la señal filtrada entre por el canal RA1 .....Es por eso que necesito tener habilitados los dos canales....

Espero y me puedas sacar de esta duda.. cUIDATE 
« Última modificación: Septiembre 30, 2008, 10:47:57 por ESAU » En línea
Ariel
Global Moderator
dsPIC
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 10288



WWW
« Respuesta #2 : Septiembre 30, 2008, 11:07:24 »

Mmmm...parece estar bien.


Yo hago asi para leer y pasar de un canal a otro:
Código:
//Leo el valor del ejeX -> AN0 ------------------------------------//
 int Leo_EjeX (void){
  set_adc_channel(0);
  delay_ms(1);
  a_ejeX=read_adc();
  delay_ms(1);
  return a_ejeX;
 }

//Leo el valor del ejeY -> AN1 ------------------------------------//
 int Leo_EjeY (void){
  set_adc_channel(1);
  delay_ms(1);
  a_ejeY=read_adc();
  delay_ms(1);
  return a_ejeY;
 }

Deberias checar el contenido de 18f4550.h para ver exactamente que significa (y en la hoja de datos, claro!) setup_adc_ports( AN0_TO_AN1 );

¿Lo estas probando en un circuito real o en un simulador?

Saludos!

//Leo el valor del ejeZ -> AN2 ------------------------------------//
 int Leo_EjeZ (void){
  set_adc_channel(2);
  delay_ms(1);
  a_ejeZ=read_adc();
  delay_ms(1);
  return a_ejeZ;
 }
En línea

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert
ESAU
PIC10F
*
Desconectado Desconectado

Mensajes: 8


« Respuesta #3 : Octubre 01, 2008, 08:56:55 »

GRacias por la respuesta Ariel.... aunque tu programa lo basas varios metodos... y como que yo lo quiero hacer mas simple.... de hecho ya estuve intentando con agragarle a la intruccion:
                      set_adc_channel(i);
la variable i la manejo para que en el momento dado que la requiera y se establezca el cambio de canal... pero aun no me convence como que le falta algo mas........

Y es que como necesito dos canales por el que pasa una señal del sensor y otra de un filtro.. se necesita tener presentes las dos señales..... en el ADC

De todas maneras tu idea me ayudo para masomenos establecer esta aplicacion.. gracias de todos modos Ariel... haber si me das otro consejillo al respecto....

Y por el momento estoy en la simulacion coin el proteus...... Cuidate
En línea
ronny22
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 279



WWW
« Respuesta #4 : Octubre 13, 2008, 10:18:03 »

hola q tal,te ayudo un poco con esto,esta es la manera de como yo trabajo el convertidor A/D  del pic.

setup_adc (adc_clock_div_32); //Enciende ADC

setup_adc_ports (all_analog); //con esta opcion fue que hice funcionar las 4 entradas A/D en
                                         //conjunto,en realidad no estoy muy seguro su funcion,creo
                                         //que activa todas las entradas A/D del pic utilizado,ya que
                                         //probe de distintas maneras y esta fue la ganadora.

set_adc_channel (0); //Elige canal a medir RA0
delay_us (20);
medicion=read_adc (); //Hace conversión AD
set_adc_channel (1); //Elige canal a medir RA1
delay_us (20);
medi=read_adc ();  //Hace conversión AD
set_adc_channel (2);  //Elige canal a medir RA2
delay_us (20);
TCJ=read_adc (); //Hace conversión AD
setup_adc (adc_off); //apaga el A/D del pic

(medicion,medi y TCJ) son variables,les puedes dar el nombre q tu quieras.
Ademas de esto utilizo en la pata RA3 q tambien tiene A/D la tension de referencia de 5v, es decir, estoy utilizando 4 entradas analogicas/digitales sin ningun problema.bueno espero te sirva esto.

Si tienes una duda avisas a ver que se puede hacer,bueno saludos y suerte.
En línea
Páginas: [1]   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.153 segundos con 31 consultas. (Pretty URLs adds 0.008s, 3q)
loggkey