stm32内部adc基准电压范围(我在高职教STM32ADC电压采集与光敏电阻)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助头条平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分享出来,如果您正是一名单片机爱好者或是一名同行,欢迎点赞 关注,各位的支持是本人持续输出的动力,多谢多谢!#30天学会STM32##STM32单片机##单片机#

从我们已经学到的知识可以了解到,单片机是一个典型的数字系统。数字系统只能对输入的数字信号进行处理,其输出信号也是数字的。但是在工业检测系统和日常生活中的许多物理量都是模拟量,比如温度、光照、压力、速度等等,这些模拟量可以通过传感器变成与之对应的电压、电流等电模拟量。为了实现数字系统对这些电模拟量的检测、运算和控制,就需要一个模拟量和数字量之间相互转换的过程。本项目我们就要学习这个相互转换的过程和用来做这类转换的一类传感器——光敏电阻。

【学习目标】

  1. 了解ADC的主要技术指标;
  2. 了解ADC的工作原理及结构;
  3. 掌握STM32的ADC库函数配置方法;
  4. 结合光敏电阻,掌握ADC操作过程。

与STM32 ADC有关的信息量不小,为了不让篇幅太长,本章打算分五个部分来讲解,本文是第五部分。

六、双通道ADC采集实验

上一个实验只采集了光敏电阻这一个通道的电压,如果我们想把内部温度传感器所在通道一起采集,就变成了独立模式(都是ADC1)下的双通道采集。我们只需要在前一个工程的main.c里稍作修改,即可实现如图9所示的效果。

图9 双通道ADC采集实验效果

6.1 main.c源码修改

由于增加了一路通道的数据,因此在主程序里添加了与之对应的变量和语句,见如下代码清单11。

代码清单11 修改后的主程序源码

6.2 对多通道采集的一点补充

对比单通道和多通道这两个实验的代码,不知你是否有如下几个疑问:

1. 明明是多通道采集,那为什么ADCx_Init()函数的初始化配置还是单通道模式?通道数还是配置为1?

adc_initstruct.ADC_ScanConvMode = DISABLE;

adc_initstruct.ADC_NbrOfChannel = 1;

2. 对于ADC_GetConversionValue()这个库函数并没有指定那个通道,如果多个通道同时使用ADC时怎么获取每个通道的值?

u16 ADC_GetConversionValue(ADC_TypeDef* ADCx);

3. 获取这两个通道数据的函数里都调用到了ADC_RegularChannelConfig()这个用来配置规则通道转换顺序和采样时间的库函数。那为什么都是按顺序1执行?不分谁先谁后吗?

ADC_RegularChannelConfig(ADCx,ch,1,ADC_SampleTime_239Cycles5);

要回答以上几个问题,可以看图10,一个ADC转换器每次只能选择转换一个通道。而且,在前面“3.7 数据寄存器”小节中还提到,规则数据寄存器仅有一个,为应付多个转换通道,该寄存器采用覆盖数据的方法,将新的转换数据替换掉旧的转换数据。

图10 ADC转换器与通道对应关系

如此看来,本实验不算严格意义上的多通道采集,顶多算是不同通道的分时采集。倘若我们改成多通道模式,且转换顺序有先后,那么两个通道的数据就会依次交替的送上来,而且后来的数据会把前面的数据覆盖,那么按照当前的算法取10次数据的平均值,毫无疑问结果肯定是错的。

然而,在实际应用中,多通道和顺序转换才是普遍做法,但通常会搭配DMA一起来做,单个通道转换完成后,把它的数据搬到内部存储器里,再继续下个转换,保证数据不出错。由于DMA这部分知识尚未涉及,所以就先不展开了,感兴趣的同学可以自己查阅学习。

(第五部分完,全文结束)

,

© 版权声明
THE END
喜欢就支持一下吧
分享