目录
一、前言
二、采集模式
三、详细步骤
3.1 引脚选择
3.2 代码实现
3.2.1 导入库文件
3.2.2 模式选择
3.2.3 bypass模式
3.2.4 attenuation模式
3.2.5 代码配置
四、效果展示
一、前言
使用单片机面对数据采集时,往往设计到模拟量的采集,因此,掌握ADC采集同样可以说是必备技能。那么本文将使用ST17H66进行ADC采集数据的任务,本文涉及的开发所使用的例程依然是基于[ BLE4.0 ] 伦茨ST17H66开发-OSAL系统中添加自己的Task任务文章的工程源码,实现的具体功能为将采集到的ADC数据打印到串口。
二、采集模式
在ST17H66为我们提供的ADC采集手册中,该芯片支持单端采集和双端采集模式。同时还有采集声音信号的PGA。
那么单端输入和差分输入的定义是什么?手册中也给出了解释。
本文所实现任务采用单端输入模式,这基本上满足市面上大多出传感器的采集要求。
三、详细步骤
3.1 引脚选择
首先,选择一个引脚作为ADC采集引脚,连接传感器或需要测量的电压点。
查阅ADC帮助手册,发现官方提供10个引脚可使能ADC。
其中对单端输入模式、差分输入模式和PGA模式的引脚还有细分。
此处,我们选择单端输入模式P11引脚。
3.2 代码实现
下面,我们打开之前创建的任务例程,开始添加代码。
3.2.1 导入库文件
在SimpleBlePeripheral工程中,是没有ADC采集的库的。我们需要导入adc.c和adc.h。导入方式可以参考:Keil5添加.c文件与.h文件的方法-导入支持库-添加导入文件
导入完成后,准备初始化结构体adc_Cfg_t,配置相关参数。
3.2.2 模式选择
经过查阅手册,可以发现adc_Cfg_t有四个属性,分别是通道、工作方式、工作模式和分辨率。
那么前三个属性比较好理解,那么什么是bypass模式和attenuation模式?
3.2.3 bypass模式
该模式适用于面对与高精度的采集,但其采集电压范围为0~0.8V,当采集电压为0.8V内,可以直接使用高精度模式,而如果电压较大,还需要使用高精度模式时,则需要外部分压。具体如下:
3.2.4 attenuation模式
该模式量程范围0~3.2V,如果被测电压大于3.2V,那么同样需要外接分压电阻。
3.2.5 代码配置
打开工程,在Mytask.c文件中,创建并初始化adc_Cfg_t结构体。注意需要在Mytask.h文件中引入adc.h。
通道定义参考adc.c文件内定义。
随后我们如果使用ADC,需要在main.c中的hal_init函数中完成对ADC的初始化。
创建ADC处理函数,对返回的数据进行计算,并打印出电压值。
static void adc_evt(adc_Evt_t* pev)
{
LOG("\npev->ch%d\n",pev->ch);
float val = hal_adc_value_cal(ADC_CH1N_P11,pev->data,pev->size,0,0);
uint8 data[15]={'\0'};
sprintf((char *)data,"Value=%.3f",val);
LOG("\n%s\n",data);
osal_start_timerEx(Mytask_id,MyTask_StartADC_EVT,1000);//再次采集
}
四、效果展示
将程序烧写进去,可以看到打印的电压值。使用万用表测量真实值后与打印数值比较,误差不超过10mv(非高精度模式)。
资源:simpleBlePeripheral-NewTask-ADC.zip资源-CSDN文库