[size=13.6364px]、硬件原理
1)硬件原理图
由上图可知通过PB1口采集电压,其中采集的电压为锂电池经过分压后的电压。 锂电池电压范围为3V~4.2V。
2)采集电压引脚的通道
其中ADC12_IN9,是指可以是ADC1的第9通道,也可以是ADC2的第9通道。
[size=13.6364px]五、[size=13.6364px]基础知识
[size=13.6364px]1、stm32f103c8t6的ADC是如何的?
答:
stm32f103c8t6这款芯片一共有2个ADC,每个ADC有18个通道,每个通道有12bit。
[size=13.6364px]最大的转换速率为1MHz(转换时间1us),时钟不要超过14M,否则准确度会下降。
[size=13.6364px]2、什么是规则通道组和注入通道组?
[size=13.6364px]答:规则通道组是普通的ADC组,而注入通道组具有优先级更高的抢占式权利,能随时打断规则通道组的ADC通道,获得ADC转换的优先权。
[size=13.6364px]类似于我们在买票时,规则通道组是普通老百姓,而注入通道组是老人、军人,他们可以任意插队……
[size=13.6364px]六、实验步骤
[size=13.6364px]1、编写ADC的驱动
3、工程中添加自己写的驱动1)工程中添加GUA_ADC1.c和GUA_Battery_Check.c
[size=13.6364px]
2)在MDK设置中添加驱动源文件路径
4、添加库的驱动 1)添加库的驱动文件
2)添加库的驱动头文件(stm32f10x_conf.h 中)
[cpp] view plain copy
- #include "stm32f10x_adc.h"
5、在应用层中调用
1)添加驱动头文件(main.c中) [cpp] view plain copy
- #include "GUA_Battery_Check.h"
2)添加驱动初始化代码(main.c的main函数中)
[cpp] view plain copy
- //电源电量采集
- GUA_Battery_Check_Init();
3)添加测试代码
①写测试代码(main.c中) [cpp] view plain copy
- //******************************************************************************
- //name: GUA_Test
- //introduce: 测试代码
- //parameter: none
- //return: none
- //author: 甜甜的大香瓜
- //email: 897503845@qq.com
- //QQ group 香瓜单片机之STM8/STM32(164311667)
- //changetime: 2016.12.29
- //******************************************************************************
- static void GUA_Test(void)
- {
- U16 nGUA_Battery_Check_Value = 0;
-
- while(1)
- {
- //读取电量
- nGUA_Battery_Check_Value = GUA_Battery_Check_Read();
- }
- }
②调用测试代码(main.c的main函数中)
[cpp] view plain copy
七、实验结果
仿真并查看测试代码中电量读取情况,如下图 上图可知读取到的电量数值为2760,由于adc的精度是12bit(4096)、参考电压为3.3V,因此实际读出的电量值为2760*3.3/4096=2.2236328125V 由于该采集电压是经过分压后的,代入公式“Vbat*75/(51+75)=2.2236328125”后,可计算出Vbat=3.735703125V。 用万用表实测锂电池电压为3.7V(200V档)。
|