【BLE 5.3无线MCU CH582】8、adc采样(内部bat、内部温度,外部输入)
<p>系列文章:</p><p><a href="https://bbs.eeworld.com.cn/thread-1195192-1-1.html" target="_blank">【BLE 5.3无线MCU CH582】1、初识CH582开发板(开箱)</a></p>
<p><a href="https://bbs.eeworld.com.cn/thread-1195464-1-1.html" target="_blank">【BLE 5.3无线MCU CH582】2、MounRiver IDE初体验</a></p>
<p><a href="https://bbs.eeworld.com.cn/thread-1196099-1-1.html#pid3126477" target="_blank">【BLE 5.3无线MCU CH582】3、非阻塞方式点灯</a></p>
<p><a href="https://bbs.eeworld.com.cn/thread-1196188-1-1.html" target="_blank">【BLE 5.3无线MCU CH582】4、串口不定长数据接收</a></p>
<p><a href="https://bbs.eeworld.com.cn/thread-1196777-1-1.html" target="_blank">【BLE 5.3无线MCU CH582】5、硬件I2C驱动0.96吋OLED</a></p>
<p><a href="https://bbs.eeworld.com.cn/thread-1196846-1-1.html" target="_blank">【BLE 5.3无线MCU CH582】6、pwm呼吸灯</a></p>
<p><a href="https://bbs.eeworld.com.cn/thread-1196850-1-1.html" target="_blank">【BLE 5.3无线MCU CH582】7、按键——GPIO外部中断</a></p>
<p> </p>
<p><span style="font-size:26px;">1、ch582的ADC</span></p>
<p></p>
<p>1路ADC,14个通道,其实是16个通道,还有两个内部通道,一个连接到温度传感器,一个连接到VBAT。</p>
<p> </p>
<p><span style="font-size:24px;">2、ADC采样限制</span></p>
<p> 选择的增益不同,实际能采集到的最大值不同。</p>
<p><span style="font-size:26px;">3、代码实现</span></p>
<pre>
<code>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();
}
}</code></pre>
<p>基本的流程就是,<strong>初始化通道,获取偏差值,配置通道,转化读取数据</strong>。</p>
<p> </p>
<p><span style="font-size:26px;">4、测试</span></p>
<p></p>
<p> 内部电压采样,使用的是-12dB模式;</p>
<p>通道0使用的是0dB模式,采样值与实际值偏差不大;</p>
<p>内部温度,直接使用的官方提供的函数,不过计算出来,温度偏低。</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
好久以前,我就给eeworld提到这个绝对温度的较正,但是现在还没有给个固定的回复,个人猜想,他们自己还没有弄明白。 lugl4313820 发表于 2022-3-16 20:39
好久以前,我就给eeworld提到这个绝对温度的较正,但是现在还没有给个固定的回复,个人猜想,他们自己还没 ...
<p>手册上也没说,只能等待官方人员解答了。</p>
fly007008009 发表于 2022-3-17 22:27
已经自己搞定;
此人不可信,言而无信;不想发就直接说 【不想发送】
我都没有QQ邮箱,哪 ...
<p>什么情况。。。</p>
fly007008009 发表于 2022-3-17 22:27
已经自己搞定;
此人不可信,言而无信;不想发就直接说 【不想发送】
我都没有QQ邮箱,哪 ...
<p>是不是回复错了?</p>
页:
[1]