本次实验利用CH549内部的ADC模块采集芯片内部温度检测通道的数值,然后将采集到的数据通过沁恒USB转串口模块通过UART0发送至PC端,并利用串口调试助手进行显示。
一、实验资源
1、CH549EVT学习开发板;
2、Keil v5.28.0.0;
3、CH549开发资料汇总.rar;
4、WCHISPTool v2.70;
5、CH549EVT其它相关文档;
6、沁恒USB转串口模块;
7、串口调试助手SSCOM51 v5.13.1;
二、实验准备
1、CH549的ADC资源。CH549内部提供了一个12位的ADC模块,具有16个外部模拟信号输入通道和 4 个内部输入通道(参考电压),可以分时采集,支持0到VDD模拟输入电压范围。从系统图上看还是挺复杂的,毕竟与ADC相关的还有“TouchKey”及电压比较器“CMP”。
2、与ADC相关的寄存器。寄存器比较多,下面是简单的了解。
ADC控制和状态寄存器(ADC_CTRL)中与ADC有关的有两位:ADC转换完成中断标志“bADC_IF”以及ADC 启动控制位“bADC_START”;
ADC配置寄存器(ADC_CFG)中的低两位决定了ADC模块的时钟频率,ADC采样时钟的选用与工作电压、信号源内阻、信号源并联的电容等参数有关,就根据具体的环境不同进行选择;
ADC模拟信号通道选择寄存器(ADC_CHAN)比较好理解,通过对其配置可选择内部或者外部采样通道,本次实验选用的就内部通道“3”的温度传感器TS;
ADC数据寄存器(ADC_DAT)中包括了“ADC_DAT_H”和“ADC_DAT_L”,从下表中可以看出“ADC_DAT_H”只用到了低4位,ADC的12位数据的低8位存放于“ADC_DAT_L”中,这应该是传说中的“右对齐”;
三、本次实验
本次ADC采集实验利用了上次调试的UART0配合进行,并且把时钟Fsys配置成了24MHz。ADC模块的配置按照手册给出的步骤进行,实验代码参考了官方DEMO程序,工程中引入了“DEBUG.C”及“DEBUG.H”。
void TS_ADC_Config(void)
{
ADC_CFG |= bADC_EN; //开启ADC模块电源
ADC_CFG = ADC_CFG & ~(bADC_CLK0 | bADC_CLK1); //选择ADC参考时钟 750KHz
ADC_CFG &= ~bADC_AIN_EN; //关闭外部通道
ADC_CHAN = ADC_CHAN &~MASK_ADC_I_CH | (3<<4); //内部通道3为温度检测通道
ADC_CTRL |= bADC_IF; //清除ADC转换完成标志,写1清零
}
UINT16 TS_Vol;
void main()
{
CfgFsys();
mDelaymS(5);
UART0_Config();
TS_ADC_Config();
printf("\nWCH CH549EVT ADC TEST\n");
while(1)
{
ADC_CTRL |= bADC_START; //启动ADC转换
TS_Vol = ADC_DAT;
printf("TS = %d\n",TS_Vol);
mDelaymS(1000);
}
}
四、实验结果
五、实验总结
本次实验利用CH549的ADC模块并配合UART0进行了内部单一通道的数据采集,过于简单了点,但是通过此次实验对CH549的ADC模块有了感性认识,为后面对ADC进一步的学习创造了条件。
此内容由EEWORLD论坛网友lising原创,如需转载或用于商业用途需征得作者同意并注明出处
引用: RCSN 发表于 2019-7-4 09:27 楼主评测内容很不错,期待后续
谢谢表扬!继续学习。
引用: 我芯永恒 发表于 2019-7-4 10:42 楼主测评很实在,所谓的简单不轻视,困难要重视!期待期待后续
谢谢表扬!继续学习分享。