你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的ADC采样与多通道ADC采样

[复制链接]
STMCU-管管 发布时间:2020-9-3 10:44

一 单通道采样


$ n+ O6 U4 R6 B' G5 L参考资料:

《STM32库开发实战指南》 刘火良,杨森著

/ Y2 A* A% F. b, w6 w/ R8 i7 W

原理性质的东西还是少讲,因为上面那本书里面讲解的很详细了,直接来看硬件电路图


, l  s3 p( B8 n

+ L3 `+ X, ]$ C7 {0 h; x9 Q

这里使用的是3362电位器(10K),即用STM32来测量PB0和GND两端的电压,这样的电路设计比较简单也容易理解,但是存在一定的弊端,下面给出《STM32库开发实战指南》上面配套的硬件电路图


5 B+ q) p* t$ u4 d9 r: j1 O3 X


1 h! C) ]; w7 l9 j) a! F& u

, C% ?0 o( s% }* o

( y, U" R$ ?' C9 d7 E, G/ Z( b6 ?# \8 B. ^9 x5 c

如果设计电路图的话,可以参考这种思路。


1 \2 L& K3 w5 k+ _: a

我的收获

# C; o2 F' H8 c- M4 ]3 N
1 引脚初始化的时候需要注意! b# N% C( c1 B. T2 X


0 C  M' s( X, v. B- F# U8 y2 W

# d& z1 ~8 D- H- c4 e' S* R

+ F" V% {; D$ e! O& b+ O  c6 }1 ]7 `9 a# x

每一个ADC通道都对应一个GPIO引脚,看图中的ADC123_IN10,表示这个引脚(PC0)可以配置为ADC1的通道10,或者是ADC2的通道10,或者是ADC3的通道10,这个地方非常重要,涉及到后面ADC初始化时函数的调用。

比如当我们使能ADC时,我们调用的函数是

  1. ADC_Cmd();
复制代码

+ a! }; _2 c5 @" G' T: C7 x

如果我们使用的是ADC1,那么上面函数的写法就应该是

  1. ADC_Cmd(ADC1,ENABLE);
复制代码
! ^2 B5 ?# R% y1 V

相应的如果是ADC2,那么上面函数的写法就是

  1. <font face="" "="">ADC_Cmd(ADC2,ENABLE)</font>;
复制代码
5 a& N3 o: }. s' z+ j& \# }

另外需要注意的是,我们这里的ADC使用了DMA,所以如果你使用的是ADC1,那么对应的DMA就应该是DMA1的通道1


1 Q( g1 k2 h3 I( M" X. a


0 c5 o+ w9 ?8 {) K6 h

如果使用的是ADC2或者是ADC3就需要自己去查找手册,看看对应的是哪个DMA的那个通道。

在后面上传的程序中可以看到DMA初始化的时候有这么一条语句

  1. <p style="line-height: 26px;"><font face="" "=""><font style="font-size: 18px" color="#000000">4 y7 N! @0 M! r- |3 U) o( E3 n6 m
  2. </font></font></p><font color="#000000">DM<font face="" "="">A_Init</font>(DMA1_Channel1)[color=rgb(136, 0, 0) !important]<font face="" "=""><i>;</i></font></font>
复制代码

6 }8 L5 t4 M% y

这就是初始化DMA1的通道1

相应的


* j2 {( \! s9 F, f

  1. DM<font face="" "="">A_Cmd</font>(DMA1_Channel1,ENABLE)[color=rgb(136, 0, 0) !important]<font face="" "=""><i>;</i></font>
复制代码

# H3 V  F0 [, B, M% V4 e

就是使能DMA1的通道1

( v" H' L! U1 Q; b3 t; E

总结一句,配置的IO口不同,对应ADC和DMA就不同。

在单通道的ADC采样中,注意上面这一个点就可以了,但是多通道采样还需要注意其他的一些地方


0 l3 S# [1 P/ s


3 Z. D, B# U5 ^/ h- {$ C

二 多通道采样


6 ^4 O! |" e7 Z( r, \

- t* D/ H9 z% L; j7 s3 X

还是看上面的电路图


; S- d9 ?) Y3 H  ]- g  t& C

这里我们假设使用PB0和PC0端口来采集电压。


  P# S( F  c. [- s7 ~

stm32有三个ADC,每个ADC对应16个通道,这里我们只是用其中的两个通道来做说明。

4 V; z( V2 q: k

在程序中PB0设置为ADC1的通道8,PC0设置为ADC1的通道10。

, d. y8 K  C3 u  H

需要注意的几个点:

1 l2 N: N+ |% e8 s' U1 x. J4 K

1 引脚的配置,在上面已经说到

9 E6 H3 p# A* z% f

2 ADC模式的一些配置


1 b( N; t& ]' a- {* \

对ADC模式的配置主要是通过对ADC_InitTypeDef结构体成员的初始化来完成的。

  1. ADC_InitTypeDef ADC_InitStructure;
复制代码
  1. <font face="" "="">ADC_InitStructure.ADC_ScanConvMode</font>=[color=rgb(0, 153, 0) !important]<font face="" "="">ENABLE;</font>
复制代码

; m  q5 ]1 j" P

结构体的这个成员主要是用来设置ADC的扫描模式,我们使用通道8和通道10,当然要允许ADC进行通道的扫描


( c) z3 z: [( m: A# M8 Z- {

  1. <font face="" "="">ADC_InitStructure.ADC_NbrOfChannel</font>=[color=rgb(0, 153, 0) !important]<font face="" "="">2;</font>
复制代码
; \% O; s* X$ O4 |% `. }
% ?+ K1 h5 [+ k# A9 v
) S& T7 `- A/ w& Y7 r7 l* Q& {, ]

4 l* u5 t2 A: d" {% ?  N

这个结构体成员是用来表明要转换的通道数目,这里我们使用通道8和通道10两个通道,那么这个值必然是2。


8 g$ T* v% |- s1 u2 o

  1. <font face="" "="">ADC_RegularChannelConfig()</font>;
复制代码

7 S3 ]9 X& K  j0 A8 M

这是一个非常重要的函数

- B, G5 l( Z5 q0 [0 F9 ~% N1 w


1 E; C8 M! R1 e9 ^5 v: [5 G. S' z6 z, Q, [

这是从《stm32库函数使用手册》中截到的图,关于函数具体参数的使用可以去看该手册。


0 K; [1 `, M! S7 ^

下面结合程序来看一下这个函数的使用

( W$ H# D2 z2 @

7 u/ ?$ H# P2 _+ B7 m, U! m

函数的第三个参数是用来设置采样顺序的,看我们的程序,也就是说我们设置ADC1的通道8先进行采样,接着ADC1的通道10再进行采样。


- |6 j. M1 e. k% R/ S' f3 A/ t6 A$ X0 W% K
赞 收藏 评论2 发布时间:2020-9-3 10:44

举报

2个回答
小小超 回答时间:2020-9-3 11:14:42
感谢分享!!!
genghongbo 回答时间:2020-9-3 19:18:24
好文。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版