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号