Cómo utilizar la conversión AD en el microcontrolador STM8S
Introducción a la estructura A/D del microcontrolador STM8S:
Con ADC1 ADC2 (algunos modelos no tienen ADC2), proporciona hasta 16 canales de conversión, y cada canal de A La conversión /D se puede ejecutar una vez y el modo de conversión continua.
1. Voltaje 0 a Vdda;
2 Hay un Vref independiente en los paquetes de 64 y 80 pines, y el Vref en otras formas de paquete está conectado a Vdda<. /p>
3. Continuar con el formulario de conversión;
4. Tiempo 14 ciclos de reloj;
Precisión de conversión de 5,10 bits;
6. interrupción de fin de conversión;
p>
Puntos de conocimiento a tener en cuenta durante la programación:
Encienda el ADC configurando el bit ADON en el registro ADC_CR1. El ADC se despierta del modo de bajo consumo cuando se establece por primera vez el bit ADON. Para iniciar la conversión, se debe utilizar un segundo comando de escritura para configurar el bit ADON en el registro ADC_CR1. El ADC permanecerá encendido al final de la conversión y el usuario solo necesita configurar el bit ADON una vez para iniciar la siguiente conversión.
Si el ADC no se utiliza durante un período prolongado, se recomienda cambiar el módulo ADC al modo de bajo consumo de energía para reducir el consumo de energía. Esto se puede lograr borrando el bit ADON. Después de encender el módulo ADC, el módulo de salida del puerto de E/S correspondiente al canal seleccionado se desactiva. Por lo tanto, se recomienda seleccionar el canal de conversión ADC apropiado antes de encender el ADC.
Si el modo de disparo único está en modo de conversión única, el ADC solo completa una conversión en el canal seleccionado por CH[3:0] del registro ADC_CSR. Este modo se inicia configurando el bit ADON del registro ADC_CR1 cuando el bit CONT es 0.
Una vez que se completa la conversión y los datos convertidos se almacenan en el registro ADC_DR, el indicador EOC (fin de conversión) que se establece generará una interrupción.
El código es el siguiente:
#include "adc.h"
u16 TempADC;
void ADC_Config(void)
{
ADC_CR1 |= 0x01; //La inicialización debe iniciarse una vez
//Escribe 1 por primera vez, ADC se activa por bajo consumo de energía , escriba 1 por segunda vez 1. Inicie la conversión de ADC
//ADC_CR1 |= 0x20; //Habilite la interrupción de finalización de la conversión, el método de consulta utilizado en este ejemplo.
}
uint16_t Get_ADCCH_Value(ADC1_Channel_TypeDef ADC_Channel)
{
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,ADC_Channel, ADC1_PRESSEL_FCPU_D2,
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE);
//También puede utilizar el código de operación de registro de la siguiente manera, pero no ha sido verificado.
#if 0
ADC_CR2 = 0x00; // Los datos del resultado A/D están alineados a la izquierda
CLK_PCKENR2 |= 0x08 // Habilitar conexión fMASTER y ADC
ADC_CR1 = 0x00; // Reloj ADC = reloj principal/2 = 8MHz, modo de conversión única
ADC_CSR = 0x01 // Selecciona el canal 2
ADC_TDRL; = 0x01; // Deshabilitar la función de activación Schmitt
ADC_TDRH = 0x01;
ADC_CR1 = 0x03; //División por 2, conversión continua, iniciar ADC
ADC_CR2 = 0x31; //Los eventos externos están reservados, los datos están alineados a la derecha, el modo de escaneo está deshabilitado,
ADC_CSR|= 0x01; //Seleccione el canal 1
#endif
ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel,ADC1_ALIGN_RIGHT);
ADC_CR1 |= 0x01; //Iniciar conversión
while(!(ADC_CSR & 0x80)); //Esperar conversión termina
return ADC1_GetConversionValue(); //Devuelve el resultado de ADC
}
//Este código de inicialización es muy importante y no se puede omitir. ejecutado cada vez que se cambia de canal. ¡Necesita inicializarse una vez!
Simplemente llámelo directamente en la función principal:
TempADC=Get_ADCCH_Value(ADC1_CHANNEL_1); //Obtenga el valor de conversión de AD
WetADC=Get_ADCCH_Value(ADC1_CHANNEL_3; //Obtener valor de conversión de AD