CH572ADC采集供电电压
前言:
该方法可以采集给到芯片供电引脚的电压,代码配置模式,需要配置CMP_N为CMP_VERF。
CMP_Init( cmp_sw_3, cmp_nref_level_800 );// CMP_P0(PA7),CMP_N(CMP_VERF)计算公式:1023/采集值 = V供/800mv //800mv是比较器负端参考电平
可以计算出V供值,即供电电压。

代码:
基于peripheral例程添加ADC采集供电电压,并通过蓝牙将数据发送出来。
uint16_t adc_data[4] = {0,0,0,0}; char adc_data_str[20]; char adc_data_str1[20]; /********************************************************************* * @fn ADC_8bit_Sample * * @brief PWM模拟8位ADC采样,采样脚(PA2)采样范围(0 ~ (VDD-800)mV) * * @return 采样值,对应电压的计算公式为:(采样值*VDD/512) */ uint32_t ADC_8bit_Sample() { uint32_t vref=0; uint32_t cmp_count=1; /* 配置GPIO */ GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA); // PA4 - PWM4 PWM_16bit_CycleDisable(); PWMX_CLKCfg(1); // cycle = Fsys PWMX_CycleCfg(PWMX_Cycle_256); CMP_Init( cmp_sw_3, cmp_nref_level_800 );// CMP_P0(PA7),CMP_N(PA2) CMP_Enable(); vref = 128; while(1) { uint8_t cmp_out=0; uint8_t cmp_out_1ast=0; PWMX_ACTOUT(CH_PWM4, vref, High_Level, ENABLE); DelayUs(760); cmp_out_1ast = CMP_ReadAPROut(); while(1) { DelayUs(20); cmp_out = CMP_ReadAPROut(); if(cmp_out == cmp_out_1ast) { break; } cmp_out_1ast = cmp_out; } if(cmp_count==128) { if (cmp_out) { return (vref*2-1); } else { return (vref*2+1); } } else { cmp_count<<=1; if (cmp_out) { vref -= 128/cmp_count; } else { vref += 128/cmp_count; } } } } uint32_t ADC_9bit_Sample() { uint32_t vref=0; uint32_t cmp_count=1; /* 配置GPIO */ GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA); // PA4 - PWM4 PWMX_CLKCfg(1); // cycle = Fsys PWM_16bit_CycleEnable(); // 16位宽使能 PWMX_16bit_CycleCfg(CH_PWM4, 512); // 16 数据宽度时的PWM时钟周期 CMP_Init( cmp_sw_3, cmp_nref_level_800 );// CMP_P0(PA7),CMP_N(PA2) CMP_Enable(); vref = 256; while(1) { uint8_t cmp_out=0; uint8_t cmp_out_1ast=0; PWMX_16bit_ACTOUT(CH_PWM4, vref, High_Level, ENABLE); DelayUs(230); cmp_out_1ast = CMP_ReadAPROut(); while(1) { DelayUs(20); cmp_out = CMP_ReadAPROut(); if(cmp_out == cmp_out_1ast) { break; } cmp_out_1ast = cmp_out; } if(cmp_count==256) { if (cmp_out) { return (vref*2-1); } else { return (vref*2+1); } } else { cmp_count<<=1; if (cmp_out) { vref -= 256/cmp_count; } else { vref += 256/cmp_count; } } } } if(events & ADC_CAP_EVT) //周期采集 { adc_data[0] = 511*800/ADC_8bit_Sample(); //计算公式:1023/采集值 = V供/800mv //800mv是比较器负端参考电平 //此处实际采集是9bit adc_data[1] = 1023*800/ADC_9bit_Sample(); //此处实际采集是10bit PRINT ("ADC_8bit_Sample %d, %dmv\n",ADC_8bit_Sample(),adc_data[0]); PRINT ("ADC_9bit_Sample %d, %dmv\n",ADC_9bit_Sample(),adc_data[1]); tmos_start_task(Peripheral_TaskID, ADC_CAP_EVT, 800); return (events ^ ADC_CAP_EVT); } static void performPeriodicTask(void) //蓝牙发送数据 { sprintf(adc_data_str, "%d", adc_data[0]); sprintf(adc_data_str1, "%d", adc_data[1]); uint8_t notiData[SIMPLEPROFILE_CHAR4_LEN] = { adc_data_str[0],adc_data_str[1],adc_data_str[2],adc_data_str[3],',', adc_data_str1[0],adc_data_str1[1],adc_data_str1[2],adc_data_str1[3],'/','/','/'}; adc_data[0] = 0; adc_data[1] = 0; peripheralChar4Notify(notiData, SIMPLEPROFILE_CHAR4_LEN); }
采集值:

通过char4 noti方式将采集值发送出来,如图是2477/2472mv,分别用的9bit/10bit。
可以用打印观察,但是如果供电电压较低,串口工具可能不工作,因此建议用蓝牙的方式将日志发送出来。
浙公网安备 33010602011771号