本帖最后由 gs001588 于 2018-1-26 03:10 编辑
STEVAL-IDB007V1 ADC测试1
本次评测和挑战赛主要是检测电池电量,那么必须用到了ADC转换。 通过对比三个ADC样例程序DMA、PDM、Polling,觉得Polling就可以满足要求,单次转换。因此本贴仅介绍与分析Polling样例程序。 测试工程路径“BlueNRG-1_2 DK 2.5.0\Project\BlueNRG1_Periph_Examples\ADC\Polling\MDK-ARM\BlueNRG-1\Polling.uvprojx”,使用Keil工程。
打开Keil工程。我们只关心“User”下的两个文件“ADC_Polling_main.c”、“BlueNRG1_it.c”。“ADC_Polling_main.c”是主程序,“BlueNRG1_it.c”是中断服务程序,其它统统不用管。
“BlueNRG1_it.c”下就一个滴答时钟中断服务,比较简单。用于主程序中的延时。
打开主程序“ADC_Polling_main.c”。包含头文件、定时延时全局变量、定义ADC初始化结构体、(基于滴答时钟的)毫秒延时函数、ADC配置。
系统初始化、平台识别、LED1初始化(程序中闪灯用)、串口配置(串口打印ADC信息)、滴答基准时钟定时1ms初始化、ADC配置及主循环。下面着重看看ADC部分。
看看函数“ADC_Configuration()”。ST一贯的风格,要进行外设操作,先开相应时钟。接下来5个参数设置什么意思呢,结合注释与数据手册来看看。
“ADC_OSR_200”——好吧,没得选,直流采集只能用这个。
“ADC_Input_AdcPin12”——差分采集,消除共模干扰;也可能通过串联毫欧采样电阻,来测试回路电流。
“ADC_ConversionMode_Single”——没错,单次采集就够了,不需要循环采。
“ADC_ReferenceVoltage_0V6”——采样参考基准电压0.6V “ADC_Attenuation_9dB54”——由于采集范围0到3.6V,因此Attenuation需要设置9.54
“ADC_Init()”初始结构体参数赋值到寄存器,“ADC_Calibration(ENABLE)”、“ADC_AutoOffsetUpdate(ENABLE)”AD校准和自动偏置更新暂时不去管它,只管用就是了。 - [/font][/align][align=left][font=宋体] ADC_Init(&xADC_InitType);[/font] [/align][font=宋体] /* Enable auto offset correction */
- ADC_Calibration(ENABLE);
- ADC_AutoOffsetUpdate(ENABLE);[/font][font=宋体]
复制代码
“ADC_Cmd(ENABLE)”函数开始一次新的ADC转换,只管用。判断转换完成标志,如果转换完成则读取ADC数据,数据输出打印到串口,闪灯,延时,开始下一次转换。
喜欢ST的风格,样例程序比较简单,注释比较足。
程序仿真全速跑。
用串口检控ADC数据
试试测试一下几个点的电压
串口打印显示各点电压值。对比万用表实测的值为3.298V、1.370V、1.928V,BlueNRG-1的ADC转换精度已经很可以了,线性度也还不错,还要啥自行车。
到此,ADC简单测试完成。
那么再了解一下ADC的数值与电压转换是什么样的,这也是BlueNRG-1比较有意思的一点,似乎整复杂了。分为了5种情况。
对照数据手册,
挑战赛的法拉电容电压测量,ADC需要使用“ADC_ConvertBatterySensor”模式。
|