STM32固件库(标准外设库)入门学习 第七章 ADC数模转换(二)

STM32固件库(标准外设库)入门学习 第七章 ADC数模转换(二)



前言

本学习教程,参考B站江科大自化协STM32视频,型号为STM32F103C8T6。


一、硬件电路

在这里插入图片描述
左图为电位器产生可调电压的电路;

中图为传感器输出电压的电路,含光敏电阻、热敏电阻、红外接收管、麦克风等。这个电阻N1阻值无法测量,就需要和一个固定电阻串联分压,来得到一个反应电阻值的电压的电路。传感器N1 N1阻值变大,下拉作用变弱,输出端受上拉电阻R1作用电压就会升高。固定电阻R1可以选择与传感器阻值相近的一个电路,这样就可以得到一个位于中间电压区域比较好的输出。

右图为电压转换电路。比如想测一个05V的VIN电压,但是ADC只能接收03.3V的电压,那就可以搭建一个这样的简易转换电路,使用电阻进行分压,上面电阻17k,下面电阻33k,共50k,根据分压公式,中间电压就是VIN/50k*33k,得到的电压范围就是0~3.3v了,就可以进入ADC转换。10V也可以采用此电路,但是高电压采集最好使用一些专用的采集芯片,比如隔离放大器等等,做好高低电压的隔离,保证电路安全。

二、AD单通道

电位器就是滑动变阻器,用电位器产生一个0-3.3V连续变化的模拟电压信号,接到PA0,然后用STM32内部的ADC读取电压数据,显示在屏幕上。STM32的ADC是12位的,所以AD结果最大值为4095,也就是212-1。使用ADC之后,可以对高低电平之间的任意电压进行量化,最终用一个变量表示,读取这个变量就可以知道引脚具体电压,所以ADC可以看作是一个变压表。
在这里插入图片描述
根据引脚定义表,PA0到PB1这10个引脚是ADC的10个通道,可任意选。其他引脚非ADC通道,不可接模拟电压。

(1)封装AD.c与AD.h文件
(2)对AD模数转换进行初始化
在这里插入图片描述
参考上面的框图,具体步骤如下:

第一步开启RCC时钟,包括ADC和GPIO的时钟,ADCCLK的分频器也要配置;

第二步配置GPIO,把需要用的GPIO配置成模拟输入的模式;

第三步配置多路开关(黄颜色部分),把左边的通道接入到右边的规则组列表里;

第四步配置ADC转换器,库函数中用结构体来配置,包括单次转换还是连续转换、扫描还是非扫描、通道数量、触发源、数据对齐方式(左对齐or右对齐)。若需要模拟看门狗,会有几个函数配置阈值和检测通道。若想开启中断,就在中断输出控制里用ITConfig函数开启对应的中断输出,然后再在NVIC里,配置一下优先级,就可以触发中断了;

第五步调用ADC_Cmd函数,开启ADC。

注:开启ADC后,根据手册建议,可以对ADC进行校准,减小误差。在ADC工作时,如果想要软件触发转换,那会有函数可以触发;如果想读取转换结果,那也会有函数可以读取结果。

1 ADC常用函数分析

打开rcc.h文件,拖到最后,配置预分频器函数。可以对APB2的72MHz选择2、4、6、8分频,输入到ADCCLK。
在这里插入图片描述
打开adc.h文件,拖到最后。
(1)常见的ADC结构体初始化配置;
在这里插入图片描述
(2)给ADC上电;
在这里插入图片描述
(3)开启DMA输出信号,若使用DMA转运数据,就要调用这个函数;
在这里插入图片描述
(4)中断输出控制,控制中断能否通往NVIC;
在这里插入图片描述
(5)复位校准、获取复位校准状态、开始校准、获取开始校准状态;
在这里插入图片描述
(6)ADC软件开始转换控制,用于软件触发的函数,触发控制。ADC获取软件开始转换状态,判断转换是否正在进行,但是不能判断转换是否结束,此函数返回值与转换是否结束无关系;
在这里插入图片描述
(7)判断转换是否结束,获取标志位状态,参数给EOC的标志位,判断EOC标志位是不是置1,置1即转换结束;
在这里插入图片描述
(8)配置间断模式,第一个函数是每隔几个通道间断一次,第二个函数是是否启用间断模式;
在这里插入图片描述
(9)ADC规则组通道配置,此函数比较重要,作用为给序列的每个位置填写指定的通道,即填写点菜菜单的过程,第三个参数Rank就是序列几的位置,第四个指定通道的采样时间;
在这里插入图片描述
(10)ADC外部触发转换控制,就是是否允许外部接触触发转换;
在这里插入图片描述
(11)ADC获取转换值,比较重要,就是获取AD转换的数据寄存器,读取转换结果就要使用这个函数;
在这里插入图片描述
(12)ADC获取双模式转换值,这个是双ADC模式读取转换结果的函数;
在这里插入图片描述
(13)这些函数都带了Injected,就是注入组的意思,所以这一大批函数都是对ADC注入组进行配置;
在这里插入图片描述
(14)对模拟看门狗进行配置,第一个函数是是否启用模拟看门狗,第二个是配置高低阈值,第三个是配置看门的通道;
在这里插入图片描述
(15)ADC温度传感器、内部参考电压控制,用来开启内部的两个通道,如果用这两个通道,就要调用此函数,开启一下,要不然读不到正确结果;
在这里插入图片描述
(16)分别为获取标志位状态、清除标志位、获取中断状态、清除中断挂起位。
在这里插入图片描述

2 第一步开启RCC时钟

在这里插入图片描述

3 第二步配置GPIO

在这里插入图片描述

4 第三步选择规则组的注入通道

在这里插入图片描述

5 第四步用结构体初始化ADC

在这里插入图片描述

6 第五步开启ADC电源

在这里插入图片描述

7 第六步对ADC进行校准

在这里插入图片描述

8 第七步写一个函数获取ADC结果

在这里插入图片描述
注:如果想对值进行判断,再执行一些操作,例:光线的AD值小于某一阈值就开灯,大于某一阈值关灯。会存在这一情况,比如光线逐渐变暗,AD值逐渐变小,由于波动,AD值会在判断阈值附近来回跳变,即关灯开灯关灯,此时可以使用迟滞比较的办法,低于下阈值时开灯,高于上阈值时才关灯,避免输出抖动问题,与之前讲的GPIO施密特触发器一个原理。若觉得数据跳变厉害,还可以采用滤波的方法,让AD值平滑一些,比如均值滤波,读取10个或20个值,取平均值,作为滤波的AD值。还可以裁剪分辨率,把数据的尾数去掉,减少数据波动

9 主函数

在这里插入图片描述
若修改为连续转换非扫描模式
在这里插入图片描述

三、AD多通道

接了光敏电阻、热敏电阻、反射式红外传感器三个模块,把AO模拟电压输入端,分别接在A1、A2、A3引脚,加上电位器一共四个通道,测出来的4个AD数据分别显示在屏幕上。
在这里插入图片描述

1 程序分析

多通道需要采用扫描模式,利用列表,把4个通道都填进去,然后触发转换即可实现多通道。但是此处涉及数据覆盖的问题,如果想用扫描模式实现多通道,最好配合DMA来实现。可能会有一个疑问就是,一个通道转换完成后,手动把数据转运出来,为啥要用DMA来转运呢,这个方案在操作时有以下几个问题:

(1)在扫描模式下,启动列表后,里面每一个单独的通道转换完成之后,不会产生任何标志位,也不会触发中断,即不知道某一个通道是不是转换完了,只有在整个列表都转换完成后才会产生一次EOC标志位,才能触发中断,此时前面的数据就已经覆盖丢失了;
(2)AD转换是非常快的,转换一个通道大概只有几μs,如果不能在几μs的时间把数据转运走,数据就会丢失。

本节利用单次转换,非扫描模式实现。只需要在每次触发转换之前,手动更改列表第一个位置的通道即可。
程序中修改为这样:
在这里插入图片描述
这样我们在调用AD_GetValue进行转换时,只要指定一个转换的通道,返回值就是我们指定通道的结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

AD单通道与多通道程序编写

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZRob

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值