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

STM32F103ADC的工作模式和触发方式的探索与理解,结合自我.....  

[复制链接]
拼命三郎 发布时间:2015-1-6 22:43
STM32F103ADC的工作模式和触发方式的探索与理解,结合自我探索分享。
; K: O3 w2 v9 d3 r5 l& ~. W& {6 e5 G
: D) C  r0 j- m; C! I% z' k- w4 K
前段时间做开发用到了STM32规则通道的ADC,因为需要定时采集,所以使用了外部触发方式。初次接触到STM32的ADC感觉还可以驾驭,但随着开发的推进,发现自己对于STM32ADC的不知之处还有好多,现将开发过程中的心得与大家分享。- A& Z8 {9 b% @8 d7 q& W# w  X
1、STM32F103中不足100脚的芯片ADC参考电压在芯片内部接到Vadd管脚上,这个是无论如何都不能通过设置寄存器更改的。那么STM32内部有没有参考电压呢,答案是否定的,参考电压是没有的,参照倒是有一个1.2V的。说实话,一开始我也以为这个参照电压就是参考电压,但是随着学习的跟进,发现这个参照电压的作用仅仅是可以”参照“而已,前面也讲了参考电压Vref已经接到Vadd上了,那么这个参照电压和Vref不是一回事了。只是用于修正你所读到的ADC值而已。举个例子吧:假设Vref=Vadd=3.3,在AD采集的时候要一次读取ADC通道的值和通道17即参照电压的值,假设此时读到的AD值为2000,读到通道17的值为1500。此时如果参照电压是准的,Vadd是波动的,那么Vref实际的值应该是4095*1.2/1500=3.27V,那么AD值2000对应的电压应该为2000/4095*3.27V=1.597V。这样大家就可以理解参照电压的作用了,如果大家还不满足内部参照电压的精度的话,可以再开辟一个AD通道,外接外部基准电压芯片。AD采集之后的计算方式与内部参照电压是相同的。4 L0 F0 K7 ^) j9 J$ Y) I; l
2、STM32F103ADC通道转换模式的问题:
( u. d4 D1 \; G" pSTM32的ADC有单次转换和连续转换2种模式,这两种模式又可以选择是否结合扫描模式。
9 @* l5 U$ k4 t4 {# v1 S2 R: uCONT=0,SCAN=0    单次转换模式(Single conversion mode)单次扫描1通道6 L7 O" N. S: E" K8 x8 f
CONT=1,SCAN=0    连续转换模式(Continuous conversion mode) 连续扫描1通道0 x! k7 D& l# Q0 R
CONT=0,SCAN=1    扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后停止。(单次扫描组). _9 e2 A9 E, `9 ]8 U; g, w' E0 i
CONT=1,SCAN=1    扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后,再从第一个通道循环。连续扫描一组" h' H8 Q5 |; ~. s# C& ~# K$ R
- {& C7 b! H( F1 R) d! B- v) _
需要注意的是,如果你的转换序列当中有超过一个通道需要转换的话,那么必须要开启扫描模式,否则的话,始终只转换第一通道。8 ^4 G; U) P+ p0 u, U% C5 w9 @
% Y5 N8 a, M' c! t  _
: E+ p" K$ z) Q$ }  |; J& g0 Q
用ADC1,Regular通道的顺序为Ch0,Ch1,Ch2,Ch3,启动Scan模式' }3 m+ F! p  B  d6 u3 ~  L" m8 a5 z
在单次转换模式下:
( |( t, Y4 z( @( s+ n9 t启动ADC1,则
9 t- X" A/ y  C5 D5 d1 x7 w4 H1. 开始转换Ch0; J, h* E* x5 B' b1 J0 r2 j6 {: \+ Q
2. 转换完成后自动开始转换Ch1
; \6 o% J5 p1 o6 \3. 转换完成后自动开始转换Ch2
! H0 n; @  g' `) @. V0 `4. 转换完成后自动开始转换Ch36 X$ K' {( G; C4 E  h' l4 B5 X
5. 转换完成后停止,等待ADC的下一次启动。下一次ADC启动从第一步开始1 @! M% `, w) r' {% |
在连续转换模式下:
4 _; ~5 h. F0 `$ v8 @, B启动ADC1,则
0 d# B  I( j  {* G1 B! V1. 开始转换Ch0/ W+ ~4 p" M1 D7 |; P
2. 转换完成后自动开始转换Ch1
0 f7 g. J0 ]: I( v* ?3. 转换完成后自动开始转换Ch28 M; H0 c& M9 x# B
4. 转换完成后自动开始转换Ch3
+ a+ j& X* r/ t2 p& o5. 转换完成后回到第一步& s/ Z5 [6 ?, G% z/ L' Z
如果没启动Sacn模式则上述过程中没有2、3、4这三个步骤% A) V( u% [/ G2 Q) B
上述前提是Discontinuous模式没有启用。
! A6 w$ H; n$ V; [+ @
, f1 M7 W8 d" D. n& Q) P4 I1 V9 N( |! u" E  ]2 o9 J2 T
关于这个扫描模式,着实让我纠结了好久,一开始,根据中文手册上的来。咱玩包含两个通道的规则通道采集,完了还不带DMA的。

手册中对规则通道转换的描述

手册中对规则通道转换的描述
,手册说了每一个规则通道转换完毕都置位EOC,那就是每转换一个通道都可以进中断喽,那这样的话,咱还用啥DMA啊,直接中断吧,好吧。就这么办,程序写好了,跟踪调试发现,中断虽然进了,但是只有第二组数据。为什么不行呢,手册中讲的好好的,怎么就不行了呢,带着这个疑问,楼主开始了探索之旅+ K% S, S. ?( w& h8 B6 g6 d* R
首先继续不用DMA,在主函数中采用以下语句读取ADC数据。
& h# A# V; R5 O; V, g7 ?" l    while (1)
# V/ ]" y6 y8 ~& T+ i    {
) @, y8 \( k' e2 ^; Y                if((ADC1->SR)&0x02)//读取判断EOC位
9 c3 ?& x8 ^# G) p' q6 }                {  w- ^6 E  r2 G
                        adcx = ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
" u4 M& j+ u" W; u                        Filter_Table[ Filter_Tab_Count++ ] = adcx;
" z4 f( B1 }: ]2 T. N                }
2 L  A! c9 Z6 r$ j! C  u' r9 C% o    }
- z: k$ e* y/ e2 k1 {" X% E: y, h还是只有最后一组数据。好吧,那这样好了:* b. S; {$ q7 g1 l  e/ b4 c( F$ \8 S) w
    while (1)8 K# `9 d, x+ B% b
    {7 b" r. W2 a) |4 y1 z1 \1 w
                adcx = ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果  }/ Y8 p  |' N# F) U
                Filter_Table[ Filter_Tab_Count++ ] = adcx;! _- M2 z% t+ X7 [: K0 b
    }8 H7 `7 m) \/ S# P, v& g- j
终于凑效了,可以在跟踪的时候,在不同时间停下的时候读到第一组和第二组数据了,这是为什么呢,这说明第一通道也是在转换的,只是在转换完毕的时候没有置位EOC罢了,当然也就不能触发ADC中断了。- W$ }& L! n/ [5 ?2 |

7 [8 w9 m4 T& s$ s/ Z
5 O3 c& k: K. |/ _: ?) ~
看来又被手册忽悠了,多个通道用中断的方式是不行的。PS:手册中的一个规则通道应该指的是一个规则通道组。
* M) D, j% P) z( R. V% r
" J- H) ^4 _1 E8 X- _! \9 K5 Q好吧,那启用DMA好了,那么问题来了,手册扫描模式中讲到

手册中对规则通道扫描模式的描述

手册中对规则通道扫描模式的描述
,EOC置位后DMA才来搬运数据,那么岂不是要丢好多数据!当然中文手册也讲了,以英文手册为准,既然有疑问,那咱翻翻英文手册好了 3.jpg 英文手册中讲到,在ADC_DR寄存器每次更新后,DMA才会搬运数据。总结:ADC在采用规则通道组采集的时候必须启用扫描模式,并且启用DMA传输支持。$ ?5 h: c( J* y" D
5 b: Q  T: }4 @: P1 _( y

3 c/ c+ `6 |# R4 h" `好了,终于写的差不多了,由于个人能力有限,有表达不清的地方还请斧正,我一定更改,这么晚了,洗洗睡去了。% k; O/ Y$ X- K4 `6 E; ~8 g0 X( p

; ~, \7 X3 @! S  U: {& ]0 y8 o) S# S; O# T, t' z# B
1 收藏 6 评论85 发布时间:2015-1-6 22:43

举报

85个回答
默罕默德.ST 回答时间:2015-1-7 19:18:48
u16 TestAdc(void) , M' {. \1 G$ r! c+ T5 y
{
6 j/ M5 [8 _2 E) U  y8 Y6 |& ]1 du16 adc;
$ Z+ A7 q1 n$ ]1 cwhile(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)==RESET); //检查制定ADC标志位置1与否 ADC_FLAG_EOC 转换结束标志位
/ r* L6 u- E0 R, X9 Hadc=ADC_GetConversionValue(ADC1);7 A+ E: i) P; L) }+ ]
8 z; ]; t0 V+ a
returnadc;//返回最近一次ADCx规则组的转换结果
6 T6 s/ e# p1 L}查询方式获取AD值
拼命三郎 回答时间:2015-1-7 21:43:33
山东大哥 发表于 2015-1-7 18:213 r  s; Z# b9 S; J; n
STM32的定时器功能石灰厂强大的,当然学习起来也是很难的,当时跳ADC的时候也走了很多的弯路,而官方这方面 ...

9 f& E- G) U: r* ]7 F% p$ I- v: bSTM32的定时器理解起来确实很费脑细胞
a93749 回答时间:2018-3-1 11:23:28
你没开启间断模式吧,所以eoc不能每次都更新。8 m; P3 U- ~6 ~/ f% v" Z9 p
对于规则通道组,间断模式下每转换一个通道,EOC就会置位一次。因此不必像SCAN模式那样必须采用DMA来搬运数据。
拼命三郎 回答时间:2015-1-6 22:50:53
自己顶上去,睡觉了。
天好蓝 回答时间:2015-1-7 08:46:20
学习了,研究下。
拼命三郎V5 回答时间:2015-1-7 08:54:26
最近正在做ADC采集,学习了。
625058882 回答时间:2015-1-7 09:08:10
中文手册仅供参考,请以英文手册为准,说实话我也上过当
拼命三郎 回答时间:2015-1-7 09:37:39
ADC.zip (2.78 KB, 下载次数: 239)
大秦正声 回答时间:2015-1-7 09:52:26
分辨率实际效果如何谢谢
拼命三郎 回答时间:2015-1-7 17:21:04
大秦正声 发表于 2015-1-7 09:52
" G- z" Q2 L; S4 `( U9 b# E分辨率实际效果如何谢谢

" w( M0 X* j$ u, F9 v) j6 V4 c还没有研究过分辨率
我是酱油哥 回答时间:2015-1-7 17:27:00
103有十二位的ADC 其分辨率是不是1/4096?
kxj116 回答时间:2015-1-7 17:36:36
应该是4095分之一,分辨率和采集速度设置什么的没什么关系
guomenhaolaogon 回答时间:2015-1-7 18:08:33
哈哈,狗曲折的,中文版的手册太旧太狗血了。纸上得来终觉浅,绝知此事要躬行。
山东大哥 回答时间:2015-1-7 18:21:57
STM32的定时器功能石灰厂强大的,当然学习起来也是很难的,当时跳ADC的时候也走了很多的弯路,而官方这方面的支持貌似很不足。
台湾华瑞 回答时间:2015-1-7 18:47:21
做技术,就是苦逼,唯有不断的探索才能成功。
拼命三郎 回答时间:2015-1-7 19:21:45
默罕默德.ST 发表于 2015-1-7 19:18
$ c, P5 P+ H  i6 Fu16 TestAdc(void) 1 t2 B. d' g: L/ f; o  ^, h
{
  ~2 S! S1 z% F9 ?& Mu16 adc;

: P2 b- s2 H; u6 w了解了,有时间交流下

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版