【CH579M-R1】3. ADC 内部测温,外部通道及触摸按键 测试
本帖最后由 yanxinboy 于 2020-9-25 20:20 编辑<p>节前加月底,巨忙中!</p>
<p><img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/funk1.gif" width="53" /></p>
<p>CH579内部集成了一个12位的逐次逼近型模拟数字转换器ADC,最大16个通道,支持14个外部模拟信号源和2个内部信号源 - 内部温度检测通道和内部电池电压检测通道。</p>
<p>输入支持单端和差分输入,可选PGA增益(建议按手册的实际可用测量范围选择合适的PGA增益,提高准确度)。</p>
<p>ADC 时钟频率选择为CK32M的6,8,10,12分频,频率范围在2.67MHz~5.33MHz之间,采样速率为始终频率的1/16, 理解为16个始终周期完成一次采样。这个分辨率和速度,完全能满足一般的模拟量的采集应用。</p>
<p>下面是ADC的结构框图及寄存器列表供快速参考:</p>
<p>本此实验对ADC的单通道,内部温度检测,触摸按键检测进行了测试:</p>
<p> </p>
<p>硬件连接: 外部通道分别测试了ADC 通道9 - PA0, ADC 通道3 - PA13, 其中PA0接3.3V, PA13同样连接3.3V.</p>
<p>ADC 参考了库函数的数据校准功能,手册里面对PGA 增益的选择描述。 触摸按键使用了430BOOST-SENSE1. 连接至ADC通道2 - PA12. </p>
<p> </p>
<p>实验程序如下:</p>
<pre>
<code>int main()
{
UINT8 i;
signed shortRoughCalib_Value=0;
RB_CFG_RESET_EN;
DebugInit();
PRINT( "Start @ChipID=%02X\n", R8_CHIP_ID );
PRINT( "\n1.Temperature sampling...\n");
ADC_InterTSSampInit();
RoughCalib_Value = ADC_DataCalib_Rough();
for(i=0; i<20; i++)
{
abcBuff = ADC_ExcutSingleConver() + RoughCalib_Value;
}
for(i=0; i<20; i++)
{
PRINT("%u 'c ", ADC_GetCurrentTS( abcBuff ));
}PRINT("\n");
PRINT( "\n2.Single channel sampling...\n");
GPIOA_ModeCfg(GPIO_Pin_0, GPIO_ModeIN_Floating);
ADC_ExtSingleChSampInit( SampleFreq_3_2, ADC_PGA_0 );
GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_Floating);
RoughCalib_Value = ADC_DataCalib_Rough();
PRINT("=%d \n", RoughCalib_Value);
ADC_ChannelCfg( 9 );
for(i=0; i<20; i++)
{
abcBuff = ADC_ExcutSingleConver() + RoughCalib_Value;
ADC_DataCalib_Fine( &abcBuff, ADC_PGA_0 );
}
for(i=0; i<20; i++)
{
PRINT("%f V ", ((float)(abcBuff))/4096*3.3);
}PRINT("\n");
PRINT( "\n4.TouchKey sampling...\n");
GPIOA_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_Floating);
TouchKey_ChSampInit();
ADC_ChannelCfg( 2 );
for(i=0; i<20; i++)
{
abcBuff = TouchKey_ExcutSingleConver(0x20);
}
for(i=0; i<20; i++)
{
PRINT("%d ", abcBuff);
}PRINT("\n");
PRINT( "\n4.Single channel sampling in interrupt mode...\n");
GPIOA_ModeCfg(GPIO_Pin_13, GPIO_ModeIN_Floating);
ADC_ExtSingleChSampInit( SampleFreq_3_2, ADC_PGA_0 );
ADC_ChannelCfg( 3 );
NVIC_EnableIRQ(ADC_IRQn);
adclen = 0;
ADC_StartUp();
while(adclen < 20);
NVIC_DisableIRQ(ADC_IRQn);
for(i=0; i<20; i++)
{
PRINT("%f V ", ((float)(abcBuff))/4096*3.3);
}PRINT("\n");
while(1);
}
void ADC_IRQHandler(void)
{
if(ADC_GetITStatus())
{
abcBuff = ADC_ReadConverValue();
ADC_StartUp();
adclen ++;
}
}
</code></pre>
<p>实验数据串口输出如下, 其中触摸按键为非触摸状态和触摸状态的数值,感觉变化不大啊。沁恒的手册也没有过多的关于触摸的设置,PCB布局等的技术描述。这个可能只有项目需求时再与官方沟通获得更多的技术资料了。如果有触摸调试好用的同学麻烦指点下,目前的数据是否合理。<img height="47" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/puzzle.gif" width="53" /></p>
<p> </p>
<p>同时我们看到ADC在使用PGA增益校准后,实际效果并没有直接采样取得的数值准确。沁恒的参考程序,要求使用粗细调时,浮空ADC1, 目前收到的板子ADC1及PA5连接至USB部分,可能对采样有影响。 需要与官方沟通了解下。 这个校准怎么用,知道的同学指点下哦。<img height="47" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="47" /></p>
<p></p>
<p>总至,ADC内部温度采样可用, 外部采样速度和精度应该满足一般的使用。触摸按键上还需要与官方沟通获取其他一手的信息。 示例程序里面有差分采样, 暂时不方便未测试。</p>
<p> </p>
<p></p>
<p>继续调蓝牙中, 谢谢大家!</p>
<p>Thanks for watching! 中秋快乐,国庆快乐!<img height="47" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan58.gif" width="54" /></p>
<p> </p>
<p> </p>
<p><a href="https://bbs.eeworld.com.cn/thread-1140005-1-1.html" target="_blank">沁恒CH579M-R1开发板测评</a></p>
<p>汇总贴:<a href="https://bbs.eeworld.com.cn/thread-1140005-1-1.html">https://bbs.eeworld.com.cn/thread-1140005-1-1.html</a></p>
页:
[1]