STM32——ADC

声明:本文参考了B站野火的教程

功能框图理论部分

ADC要测量外部模拟量(所以要规定一个电压范围),因为stm32的io口最高3.3v。
ADC的输入电压的大小的决定因素是VREF-<VIN<VREF+,除了这两个还有VDDA,VSSA是决定电压范围的,所以电路上我们要把VSSA和VREF-接地,把VREF+和VDDA接3.3v,这个时候可以得到输入电压范围是3.3v
超出3.3v怎么办?
只能把高的电压降低,低的太高,所以会有一个电路用于分压分流的,最后那个电路输出0-3.3v,可以用最后输出的电流去反推出原来的电流(个人认为这一块不是很重要,就简略说一下)


ADC输入通道,每个ADC都有18个通道,其中外部通道16个(通道16.17一般都和内部的元件连接,如内部VSS等,所以用不了),剩下的基本都能和外部gpio相连,可以在数据手册里看


信号通过输入通道输入后进入注入通道(最多四个,可以在ADC里面随便挑四个)和规则通道(最多16个),注入通道就是突然插入的通道,和我们平时用的中断程序很像,一般不用


因为会用到多通道,我们难免会考虑通道转换顺序,到底是哪个先转换,这个是由规则序列寄存器决定的(SQR寄存器),注入序列寄存器JSQR只有一个,最多支持四个通道,具体多少个是由JSQR的JL决定的,看寄存器的解释

接下来说一下触发源,先打开ADON这个是启动由模拟信号转数字信号的一个操作,软件触发由两个寄存器位控制,一个是SWSTART(规则通道),一个是JSWSTART(注入通道),这两个位都是ADC控制寄存器2里的,都是启动位。


外部事件的触发:可以是定时器或者外部的gpio,定时器如果是要用规则通道则是由EXTSEL控制去选择哪个触发源,之后还要EXTTRIG去控制打开触发,这两个都在ADC控制寄存器2里,注入通道的也是同理(由JEXTTRIG和JEXTSEL控制),我就不多描述了

转换时间:Tconv=采样时间+12.5个周期,由时钟树可以知道ADC最大14M(对于F103而言),在ADC预分频器之前的频率一般为72M(拿F103来说),然后我们可以选6分频(ADCPRE位,在时钟配置寄存器里)去将其弄成12M。在开ADC时钟之前要先开RCC_APB2ENR,它是用于访问寄存器
采样时间是在ADC采样寄存器里配的,是SMPx位配的,可以配成采样时间是多少个周期,之后可以利用ADC时钟去计算总的周期


规则组的转换数据存放在ADC_DR寄存器,注入组的在JDRx
ADC_DR规则数据寄存器的1-16位是为了存放单独使用ADC1/2/3转换的数据,对齐由ADC_CR2的ALIGN负责,多通道得用DMA,因为多通道可能会有覆盖的问题(ADC1先把数据放DR寄存器里,之后ADC2又放DR寄存器里,就会造成数据覆盖),可以利用DMA在有数据传入数据寄存器DR 的时候就去把数据放入自定义的数组里
ADC_DR注入数据寄存器有四个,所以不存在数据覆盖问题


ADC中断部分有三个标志位,一个是EOC规则通道转换完毕,一个是JEOC注入通道转换结束,还有一个是模拟看门狗事件(模拟看门狗里要配置最高阈值和最低阈值,因为我们ADC规定输入最大是3.3,但是我们可以设置在2.5v的时候就去中断服务函数预警)

ADC结构体介绍

接着我们看ADC初始化结构体

hal库配置(以F407为例,刚刚理论部分是以F103为例,所以时钟配置方面会有点不一样)

我们要将采集的数据用串口打印出来,首先配置时钟

之后选择一个串口配置成异步通信

之后配置时钟,记住APB2的时钟是多少兆(以f407为例),等一下方便算分频数

ADC最大承受的范围要看手册查询,F407最大是36MHZ,84/4=21M,所以最大是4分频

分辨率越大越好,选12bit

在只使用一个ADC的情况下扫描模式不用去使能,有它没它都一样,在多个ADC 的情况下就可以去使能他去设置扫描的顺序

连续采样模式要设置,如果不设置当它采集一次数据保存到数据寄存器之后就再也不使用了

DMA不用配置,因为是最简单的一种使用,暂时用不上

因为我们只用了一个ADC通道,所以选一个通道转换完这个就好,

打开ADC中断

这样就配置好了

编写中断服务函数

开启ADC中断

有效位数是12位,所以除以4096

再补上串口发送函数,加一个延时

接下来就可以编译烧录代码了~

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值