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

【实战经验】STM32 F1系列 DAC的示例详解

[复制链接]
zero99 发布时间:2016-6-21 18:02
STM32 F1系列 DAC的示例详解
7 A9 \+ h: \" d
  X$ S% N! @5 z/ O$ y. b* n
前言
$ C& T1 \# W* k1 m- p8 {9 Z0 g/ p基于学习的目的,详细讲解关于Cube库中的DAC的功能。本次介绍DAC。  ^, k( }2 A7 ]: u7 ^; V6 |
" u, w+ Q# T6 U2 W
一、示例详解. K& L) n8 B$ h$ B" a7 A
基于硬件平台:STM32F10C-EVAL,MCU的型号是STM32F107VCT6。
! N4 Q  @' e3 z' b# ]' j3 w5 p" K软件则是其Cube库,路径:STM32Cube\Repository\STM32Cube_FW_F1_V1.3.0\Projects\STM3210C_EVAL\Examples\DAC\DAC_SignalsGeneration。- Z0 m, |1 m1 F/ S
1、主程序
# ~1 n4 b# U7 F0 W. B, Q1 L0 \+ N5 m  `软件配置,运行程序可以发现,系统时钟设置为72MHz,定时器使用到的是TIM6;/ x! D) u6 V3 ^
11.jpg # M: o9 M% F* c2 `5 J5 N
12.jpg 1 w$ h, @/ k# Q
根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM6的时钟源来自APB1的分频。/ `: R1 X% Y$ ^. Q
13.jpg
/ {" g, D, I6 L; [
14.jpg " ~7 |# S' e  Y* A- D1 {, L  N
15.jpg 2 [0 C3 C: m! A. p, A
AHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,即/1,所以HCLK就是72MHz;
. F; r' g+ |) x- z; ]APB1的prescaler的系数是PPRE1:0x4,HCLK divided 2,即/2,APB1CLK为36MHz;由于APB1的prescaler系数部分频,即/4,所以倍频器起作用,即为上图中的TIMxCLK = 72Mhz。9 K+ T3 i/ a- x& I4 L: A% }
2、 定时器Tim6
  ^- M# }+ ~2 J1 N2 a) L/ u
16.jpg ( H+ [7 i( d2 a' L
17.jpg
- ?7 U; g: E" O# j" C8 N( E设置的是向上计数,周期是0x7FF(2047),从0开始计数到2047,所以该定时器的更新周期:(2047+1)/72 = 28us,' [- U3 w' O0 G/ a: I- {1 O: O. T3 _
18.jpg 5 k# a! G  c6 m! q$ P4 S: i+ d
所以传输的6个数值:2 Q5 V3 ?' O+ M( D9 h
19.jpg
% l5 P9 o# B) l& a% k& ]5 v. k对于8位的DAC,程序中设定的是右对齐,
2 w( r+ q8 ]" j/ u
20.jpg ) p! [% P" \* m/ ^
所以,对应的DOR分别为; ~. K5 w. m0 s( d, G6 `
0x000(0), 0x330(816), 0x660(1632), 0x990(2448), 0xCC0(3264), 0xFF0(4080) ;: z7 K9 x' y+ u) O' w3 Z9 Y  D
而Vref = 3.3V, 所以:( o) e5 W7 B1 f) `& I8 o. {: E
Vdac 分别等于:也是约在0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V之间;2 R' b5 `( |9 e# [: T
3、阶梯波形
& E% D9 r6 m8 l% |; T
21.jpg / t" s- w' I, Z# s
22.jpg $ A! g! y' U5 W, _  @0 i
对于阶梯波形比较简单:$ I7 a+ b. \, p: V  C! ?
就是上述的6个数值每个28us触发DMA传输一次到DOR的寄存器;% Y: F" y$ U3 P7 c3 s1 Z" l
所以测得的实际波形(6个梯阶,电压分别0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V; 周期28*6 = 168us);8 ?2 E1 ]4 s. O4 c: K; i+ C
验证的波形如下:9 d' {; J; ]/ X' U2 s. R+ y
23.jpg 6 k% Z- I  O8 F- u; C" Z
对于阶梯波形的产生,WAVE设置的是0x00;即:wave generation disable;1 S3 x; q5 v$ Y
24.jpg
7 V5 A) v. ^, E3 V7 E4、三角波 7 X; F: U  k0 _$ [8 H
25.jpg
  c# J! i1 p) i/ o% K产生三角波的主要代码如上,其实也就是下面的这一段代码:
1 ^0 U8 u5 X1 E7 T- w. [
26.jpg ! ]0 }% h5 t+ s1 @+ ^) ~6 I' D! G
其实也就是设置下面的寄存器的比特位;2 X/ e: r* \( k  b# g
27.jpg 3 t) S  H# Y( |7 d7 R* y+ H- l# M+ K
最大的振幅是3.3V,即对应的是4095,
8 ^5 D1 O- l! k0 O5 i. u" S! s软件里面设置的2047,所以振幅是大约1.65V
/ b, ]6 w8 W' l% g+ L  _
28.jpg
1 h5 S8 N4 O1 V+ j该三角波的产生是由单片机的硬件产生的,软件控制的是:振幅和周期;
5 ]7 P& T/ Q  ]2 H' J振幅通过上述寄存器中的MAMP1来控制;8 m! e5 L2 g. ~
周期则是定时器Tim6的触发事件?
8 R/ |2 P. w4 F5 H8 q但是这里的周期并不是128us啊?
2 J( w  t2 ]+ p& u) T# j4 N改变幅值也会改变三角波的周期的,( S7 k" e5 k9 r, M* Y2 Z5 \$ U
那么这幅值和周期以及定时器之间三者的关系如何呢?
+ x7 E9 T( ^' a# {) g0 v答案: ' D2 h$ H2 I; R
29.jpg
8 v! }$ u# H' M( a) e- k9 d
30.jpg
; j1 N% T% z1 V; f2 p2 ?  n符合推论。9 n/ c: ]0 ^1 ?5 H0 |9 Y# |
设置的波形控制模式:WAVE1 = 0x02,即产生三角波;4 M2 ^; Y  t5 A
31.jpg ! T) ]& i6 J; J
对于三角波的产生器,还有一段函数代码的作用是什么意思呢?
) A* K, @! E- T0 `7 U7 K
32.jpg
1 C3 L# B4 K+ z& _% h0 L, U. t
33.jpg
  M6 N# z* n% W# I, f3 i  C' G即其中的代码:6 h) Z' }$ e  W# v0 ^1 s9 a
34.jpg
  @" r: a" B: B! C* Z" `) {是什么作用呢?
! w' w9 P# x/ J/ C; Q( L产生的波形:/ N7 m0 i3 Y5 B0 f$ H
35.jpg 3 o; @/ l& j% s" }# \, K# t  F
36.jpg 8 O% N7 D" N3 D+ B
在加了函数之后:. W# A  f3 e- B2 r$ F
37.jpg & Y0 j8 [- Z. w' G1 N& u- d& ~
38.jpg
8 x0 F0 z* c! p( A0 L/ u' ~' h! d从波形上来看,当参数数值不为0时,波形更像三角波,; t- a* v& E, W
那这个参数影响的是什么呢?
& X% j, K: F+ }4 C) w
39.jpg 7 J# ^. e! J1 S. s# x
参数的tmp的值,位于0x200004A4处,初始值为0,运行到:
; j9 N) a5 X! V3 {: _# r
40.jpg
7 L& N  b7 z, W8 H" `& U% c" T1 d后tmp的值为0x40007400,该值是解释得通的:DAC外设的基地址(0x40007400)3 M" I; ?3 `- b3 L9 z
41.jpg ' M) r' ~' v* z0 I- N
执行完语句之后:由于传递的参数是#define DAC_ALIGN_12B_R    ((uint32_t)0x00000000) # V) G, W8 s) V  q2 l( ~
42.jpg
5 ~- P* S# L8 a' r; z0 A9 x得到的结果是(注意上图中虽然断点停在了DAC_DHR12R2_ALIGNMENT处,但是程序是DAC_CHANNEL_1,所以最终执行的还是下面的语句)* x# ~8 _  I5 @$ v$ m% t4 e
43.jpg
2 W( V+ q+ w  Q$ p所以最终产生的效果就是:
2 P, c/ d+ _7 L+ J/ F
44.jpg
6 N, y; r% D( D4 [7 y7 M地址为0x40007408的寄存器赋值,即下面寄存器赋值:
5 R* L/ l$ v$ ?: h3 x
45.jpg
% @  z& Q# C3 g5 p& B6 J但是这寄存器的作用是什么呢?holding data?4 F0 s- F$ q: T1 s" b$ X: j
Holding data寄存器,可以简单的理解为:
! d) b% ]( U1 T+ v' Q2 x/ e9 O设置影响DAC的直流分量(直流分量还是根据下面的公式计算出来的):
! T% d3 @) V$ d0 |; {0 A
46.jpg 2 m$ u9 @, ^' t! g% O
当传递的参数设置为0是,DACoutput即三角波的最低电平为0:
5 G/ R$ M2 W/ [  P( M/ @当传递的参数设置为2047,DACoutput即三角波的最低电平为1.65V2 E8 i7 y1 L6 v4 l) |2 h
47.jpg ; s4 P0 S" p8 @. u
如果传递的参数设置为1024,DACoutput即三角波的最低电平为0.82V;/ _- C, L0 M( c6 j. j$ |. Q
48.jpg
/ N1 T  B% z3 e( n如果传递的参数设置为3000,DACoutput即三角波的最低电平为2.42V;
! @) [1 Q  h5 n( z8 R  \8 a
49.jpg
4 ^- q9 _, z, b5 d
50.jpg - Q5 I0 U- i" @* e# q, W
5、噪声产生器
5 v; t7 \" M& `3 ?主要函数的代码如下:
$ @+ l2 k! V. [" I
3 _! G  i3 H& P$ j3 o
51.jpg $ K! C: X3 d* ]' S
52.jpg
" n$ m7 o, B0 P. i9 G$ N0 _% n* r2 N' P, j6 A
由于一般的认为噪声是随机性的,所以可以认为只是修改幅值,对于其周期不可控
7 e  H6 X( K' ~1 j
  A. x) x# k! K
" G( P9 ~+ T6 K

  b; _4 ]/ g7 ?4 ~" s9 i9 J文档下载地址:
) N2 f9 {& Y, c  \# |. lhttps://www.stmcu.org.cn/document/detail/index/id-2171391 S6 \! E: W" E; u3 u7 ]: Z/ I# T; X
2 t8 G8 y0 O* t1 N( i  T) D
实战经验汇总:4 b5 e# |( u( u" N  `
https://www.stmcu.org.cn/module/forum/thread-576401-1-1.html
4 N* j- H: K& D% Q2 @: S
0 V" E9 N3 H5 o: ]4 D
收藏 3 评论6 发布时间:2016-6-21 18:02

举报

6个回答
yuxin-366840 回答时间:2016-6-23 17:47:33
学习学习
加拿大 回答时间:2016-6-23 19:16:13
,谢谢,学习一下!
moyanming2013 回答时间:2016-6-23 21:20:15
学习学习
豆包必胜 回答时间:2016-9-18 16:44:02
楼主很棒呀
gl542400 回答时间:2017-1-12 19:20:56
谢谢,学习一下!
弱电电人 回答时间:2018-2-19 12:50:06
谢谢发帖,辛苦!辛苦!

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版