TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: jorgeestrella2021 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;
}
-
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:
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.
-
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?
-
Normalmente los hilos terminan con el comentario del autor si pudo resolverse (o no) el problema.
Saludos.