/* * bsp_adc.c * * Created on: 2024年11月29日 * Author: 123 */ #include "bsp_adc.h" #include "CONFIG.h" signed short RoughCalib_Value = 0; // ADC粗调偏差值 static tmosTaskID vbat_task_id = INVALID_TASK_ID; void VBAT_ADC_Init(void) { //ADC_CTRL GPIOA_SetBits(GPIO_Pin_0); GPIOA_ModeCfg(GPIO_Pin_0, GPIO_ModeOut_PP_5mA); //ADC初始化 /* 单通道采样:选择adc通道8做采样,对应 PA1引脚, 带数据校准功能 */ GPIOA_ModeCfg(GPIO_Pin_1, GPIO_ModeIN_Floating); // 采样率最高8M ADC_ExtSingleChSampInit(SampleFreq_8_or_4, ADC_PGA_1_2); RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中 PRINT("RoughCalib_Value =%d \n", RoughCalib_Value); ADC_ChannelCfg(8); ADC_ExcutSingleConver();//时间足够时建议再次转换并丢弃首次ADC数据 DelayMs(10); } uint16_t VBAT_ProcessEvent(uint8_t task_id, uint16_t events) { if (events & VBAT_EVT_START) { uint16_t adc_vbat = 0; float vbat = 0; ADC_ChannelCfg(8); adc_vbat = ADC_ExcutSingleConver() + RoughCalib_Value; PRINT("adc_vbat =%d \n", adc_vbat); vbat = (adc_vbat/1024.0-1)*1.05; PRINT("vbat =%f \n", vbat); tmos_start_task(vbat_task_id, VBAT_EVT_START, MS1_TO_SYSTEM_TIME(1000)); return (events ^ VBAT_EVT_START); } return 0; } void BSP_VBAT_Init(void) { VBAT_ADC_Init(); vbat_task_id = TMOS_ProcessEventRegister(VBAT_ProcessEvent); tmos_set_event(vbat_task_id, VBAT_EVT_START); }