Autor Tema: Dos entradas analogicas con pic12f675  (Leído 969 veces)

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

Desconectado jorgeestrella2021

  • PIC10
  • *
  • Mensajes: 2
Dos entradas analogicas con pic12f675
« en: 23 de Julio de 2021, 18:00:26 »
Hola buenas tardes a todos, mi problema es que no puedo leer dos entradas analogicas y poder compararlas de alguna manera para realizar una tarea como por ejemplo la variacion del ancho de pulso de un pwm para mantener un cierto nivel de iluminancia, para medir el nivel de iluminancia utilizo un LDR y para elegir o modificar el nivel de iluminancia que quiero tener utilizo un potenciometro (que actua como seteo), luego segun corresponda actuo sobre un pwm por software, este pwm esta conectado mediante potencia a la entrada de una lampara led de 14 W de alterna, modificada para poder controlar el nivel de iluminancia con la salida pwm del pic. A cotinuacion envio un sketch para ver si podia hacer la comparacion entre la entrada del potenciometro y la entrada del LDR, pero solo me muestra un estado alto a la salida que deberia ser del pwm. El programita es el siguiente (utilizo MPLAB X xc8 como entorno de desarrollo):

#include <xc.h>
#include <PIC12F675.h>
#define _XTAL_FREQ 4000000
// CONFIG
#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

int potenciometro = 0;
int LDR = 0;
int conversion = 0;
char canal;
short LED;

int getCAD(canal){
    ADFM = 1;
    VCFG = 0;
    switch(canal){
        case 0:
            ADCON0 = 0b00000000;
            ANSELbits.ADCS =0b001;
            ADCON0bits.ADON = 1;
            ADCON0bits.GO = 1;
            while(ADCON0bits.GO == 1){
                ;
            }
            potenciometro = ADRESH << 8;     //Leemos los dos bits altos del conversor
            potenciometro = potenciometro + ADRESL; //concatenamos los bits bajos
            break;
        case 1:
            ADCON0 = 0b00000100;
            ANSELbits.ADCS =0b001;
            ADCON0bits.ADON = 1;
            ADCON0bits.GO = 1;
            while(ADCON0bits.GO == 1){
                ;
            }
            LDR = ADRESH << 8;     //Leemos los dos bits altos del conversor
            LDR = LDR + ADRESL; //concatenamos los bits bajos
            break;
    }
   
    /*ANSELbits.ADCS =0b001;
    ADCON0bits.ADON = 1;
    ADCON0bits.GO = 1;
    while(ADCON0bits.GO == 1){
        ;
    }
    switch(canal){
        case 0:
            potenciometro = ADRESH << 8;     //Leemos los dos bits altos del conversor
            potenciometro = potenciometro + ADRESL; //concatenamos los bits bajos
            break;
   
        case 1:
            LDR = ADRESH << 8;     //Leemos los dos bits altos del conversor
            LDR = LDR + ADRESL; //concatenamos los bits bajos 
            break;
    }*/
}


void main(void) {
    TRISIO = 0b00000011;
    while(1){
        potenciometro = getCAD(0);
        __delay_ms(10);
        LDR = getCAD(1);
        __delay_ms(10);
       
        if(potenciometro > 600){
            LED = 1;
        }
        else{
            LED = 0;
        }
    }
   
   
   
    return;
}

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 946
Re:Dos entradas analogicas con pic12f675
« Respuesta #1 en: 23 de Julio de 2021, 22:44:27 »
Dentro de getCAD  guardás la lectura en 'potenciometro' y 'LDR'  pero volvés de la función con total desparpajo sin ningún return xxxx ;

Como detalle, cuando se cambia de canal se debe esperar un tiempo antes iniciar la conversión, en tu caso son unos 20us.

El switch debió ser:
Código: [Seleccionar]
        switch(canal){
        case 0:
            ADCON0 = 0b00000000;
            break ;
       
        // mas case si mas canales

        default:
            ADCON0 = 0b00000100;
    }
    ANSELbits.ADCS =0b001;
    ADCON0bits.ADON = 1;
    __delay_us(20);                 // <<<--- Para estabilizacion
    ADCON0bits.GO = 1;
    while(ADCON0bits.GO == 1) ;
    return (ADRESH<<8) + ADRESL  ;  // <<<--- Hay que devolver esto


En el bucle principal, para activar 'LED'  comparás con 600,  pero eso corresponde a un voltaje casi 0  pues de la manera que estás leyendo el rango es entre 0 (0V) y 65472 (5V)   --> compará con 32000 (~2.5V) por ejemplo.

« Última modificación: 23 de Julio de 2021, 23:04:41 por Eduardo2 »

Desconectado jorgeestrella2021

  • PIC10
  • *
  • Mensajes: 2
Re:Dos entradas analogicas con pic12f675
« Respuesta #2 en: 24 de Julio de 2021, 05:22:13 »
Muchas gracias Eduardo2, con tus indicaciones mas otros detalles pude resolver que funcionara y lea al menos un canal, le hice las modificaciones que me recomendaste y funciono. Disculpa si cometo errores groseros, pero es que recien estoy aprendiendo lo que es pic y sobre todo en lenguaje C. Me diste una gran ayuda en mi proyecto. Haora como tendria que hacer para cerrar el tema? o si tengo que valorar tu respuesta?

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 946
Re:Dos entradas analogicas con pic12f675
« Respuesta #3 en: 24 de Julio de 2021, 08:47:14 »
Normalmente los hilos terminan con el comentario del autor si pudo resolverse (o no) el problema.

Saludos.


 

anything