Cómo combinar ADRESH y ADRESL en un ADC de 12 bits.
MICRO: PIC18LF47K42
compilador: XC8
aplicación: MPLABX
Estoy intentando combinar los valores de un ADC de 12 bits. Van en ADRESH y ADRESL. Mi ADC está configurado para justificar a la derecha, lo cual tiene el siguiente formato:
ADRESH:(—-MSB,x,x,x) ADRESL: (X,X,X,X,X,X,X,LSB)
Al inspeccionar el valor en mi registro de resultado, puedo decir que no tengo una gran resolución. Estoy bastante seguro de que se debe a cómo estoy combinando ADRESH y ADRESL. ¿Cómo podría hacer esto?
#include "myIncludes.h"
volatile unsigned char ZCDSoftwareFlag = 0;
volatile unsigned char switchValue = 0;
void main(void) {
portInit();
triac = 0;
unsigned char result;
adcInit();
while(1) {
_delay_us(4);
ADCON0bits.GO = 1; // Iniciar conversión
while (ADCON0bits.GO); // Esperar hasta que la conversión termine
result = ADRESH;
result = result << 8;
result = result | ADRESL;
}
}
Y aquí está la función de inicialización del ADC:
void adcInit(void) {
ADCON0bits.FM = 1; //justificar a la derecha
ADCON0bits.CS = 1; //Reloj ADCRC
ADPCH = 0x00; //RA0 es el canal analógico
ADCON0bits.ON = 1; //Encender ADC
ADCON0bits.GO = 1; //Iniciar conversión
}
davy.ai
Para combinar correctamente los valores de 12 bits del ADC de
ADRESH
yADRESL
en el modo de justificación a la derecha, puedes modificar el cálculo deresult
desplazandoADRESH
a la izquierda por 8 bits y luego realizando una operación OR conADRESL
, de la siguiente manera:Esto concatenará los 8 bits más significativos de
ADRESH
con los 4 bits menos significativos deADRESL
para formar un único valor de 12 bits enresult
.Cabe señalar que la resolución del ADC está determinada por la tensión de referencia utilizada y el número de bits en el registro de resultado del ADC. Si no estás obteniendo la resolución deseada, es posible que debas ajustar la tensión de referencia o verificar la configuración de tu hardware.