【BLE 5.3无线MCU CH582】8、adc采样(内部bat、内部温度,外部输入)
[复制链接]
系列文章:
【BLE 5.3无线MCU CH582】1、初识CH582开发板(开箱)
【BLE 5.3无线MCU CH582】2、MounRiver IDE初体验
【BLE 5.3无线MCU CH582】3、非阻塞方式点灯
【BLE 5.3无线MCU CH582】4、串口不定长数据接收
【BLE 5.3无线MCU CH582】5、硬件I2C驱动0.96吋OLED
【BLE 5.3无线MCU CH582】6、pwm呼吸灯
【BLE 5.3无线MCU CH582】7、按键——GPIO外部中断
1、ch582的ADC
1路ADC,14个通道,其实是16个通道,还有两个内部通道,一个连接到温度传感器,一个连接到VBAT。
2、ADC采样限制
选择的增益不同,实际能采集到的最大值不同。
3、代码实现
void AdcInit(void)
{
GPIOA_ModeCfg( GPIO_Pin_4 , GPIO_ModeIN_Floating ); //选择adc通道0做采样,对应 PA4(AIN0)
}
void AdcPolling(void)
{
static uint32_t tick=0;
if(SystemGetTick()-tick>1000)
{
signed short RoughCalib_Value = 0; // ADC粗调偏差值
UINT16 result;
UINT32 vbat=0;
UINT32 v0=0;
ADC_InterBATSampInit();
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到变量 RoughCalib_Value中,注意这个变量需要定义为有符号变量
ADC_ChannelCfg( 14 ); //0Eh:电池电压 VBAT;
result=ADC_ExcutSingleConver() + RoughCalib_Value;
vbat=(result/512-3)*1.05*1000;
printf( "channel 14=%d ,%d mV\n", result,vbat );
ADC_InterTSSampInit();
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到变量 RoughCalib_Value中,注意这个变量需要定义为有符号变量
ADC_ChannelCfg( 15 ); //0Fh:内置温度传感器 TS
result=ADC_ExcutSingleConver() + RoughCalib_Value;
printf( "channel 15=%d ,%d°\n", result ,ADC_GetCurrentTS(result));
ADC_ExtSingleChSampInit( SampleFreq_3_2 , ADC_PGA_0 );
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中
ADC_ChannelCfg( 0 );
result=ADC_ExcutSingleConver() + RoughCalib_Value;
v0=result*1000/2048*1.05;
printf( "channel 0=%d ,%d mV\n\r\n", result, v0);
tick =SystemGetTick();
}
}
基本的流程就是,初始化通道,获取偏差值,配置通道,转化读取数据。
4、测试
内部电压采样,使用的是-12dB模式;
通道0使用的是0dB模式,采样值与实际值偏差不大;
内部温度,直接使用的官方提供的函数,不过计算出来,温度偏低。
|