es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para combinar correctamente los valores de 12 bits del ADC de ADRESH y ADRESL en el modo de justificación a la derecha, puedes modificar el cálculo de result desplazando ADRESH a la izquierda por 8 bits y luego realizando una operación OR con ADRESL, de la siguiente manera:

    result = (ADRESH << 8) | ADRESL;
    

    Esto concatenará los 8 bits más significativos de ADRESH con los 4 bits menos significativos de ADRESL para formar un único valor de 12 bits en result.

    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.

Comments are closed.