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

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

[复制链接]
zero99 发布时间:2016-6-21 18:02
STM32 F1系列 DAC的示例详解
6 k% S+ z. e5 j

. ?7 x) }5 g6 N前言/ |; e/ O/ y5 v! T
基于学习的目的,详细讲解关于Cube库中的DAC的功能。本次介绍DAC。
6 b! S( u6 m9 w2 d/ W& W8 w( T' R) u. m
一、示例详解) Z" Q8 u9 n5 C/ B8 `
基于硬件平台:STM32F10C-EVAL,MCU的型号是STM32F107VCT6。1 S; Y! x% o2 ]
软件则是其Cube库,路径:STM32Cube\Repository\STM32Cube_FW_F1_V1.3.0\Projects\STM3210C_EVAL\Examples\DAC\DAC_SignalsGeneration。' _/ Q% X: V9 v5 d- T8 _
1、主程序% J, |8 p& m& `- I
软件配置,运行程序可以发现,系统时钟设置为72MHz,定时器使用到的是TIM6;
& l4 _/ C7 n5 [  Y' [# _
11.jpg
# ]# D$ h( k3 _! {8 w3 b9 G) @
12.jpg
" ?# F2 H  h) ?$ y2 g4 D4 V根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM6的时钟源来自APB1的分频。6 P6 r' V' ~8 ]0 m! A9 u+ V
13.jpg 4 m$ I3 w9 [' K9 A7 s' y3 o/ O5 i
14.jpg
5 U. s0 J6 P. |* q' B% r' @
15.jpg
6 X' `4 R2 m1 e5 I( W! g0 g: WAHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,即/1,所以HCLK就是72MHz;. g& r' q- \# O0 v% D
APB1的prescaler的系数是PPRE1:0x4,HCLK divided 2,即/2,APB1CLK为36MHz;由于APB1的prescaler系数部分频,即/4,所以倍频器起作用,即为上图中的TIMxCLK = 72Mhz。- z. p7 e" t& L2 a
2、 定时器Tim6
$ E5 c+ Y! d9 I
16.jpg
1 z' r/ T& h& O. x) p1 L
17.jpg   b+ S; T1 P5 [) X, W0 ?3 c1 i  I& H! F
设置的是向上计数,周期是0x7FF(2047),从0开始计数到2047,所以该定时器的更新周期:(2047+1)/72 = 28us,
4 ^. h7 Z1 _( T: P3 F$ v5 D
18.jpg
+ z/ [+ |+ R. v! C3 H所以传输的6个数值:, \  u. ]1 w% z% v! w/ d/ d: N
19.jpg 1 A5 ?9 j- e: t8 Y, \- X$ D  @  E
对于8位的DAC,程序中设定的是右对齐,
0 y5 Y; Z# t. [+ \- i# _& H4 a
20.jpg * n0 i6 l" p8 @9 i: y8 n
所以,对应的DOR分别为/ N8 ?' {5 r! ~0 ]. y! P( l1 I
0x000(0), 0x330(816), 0x660(1632), 0x990(2448), 0xCC0(3264), 0xFF0(4080) ;5 V7 _2 X$ l/ k( g8 Z8 i
而Vref = 3.3V, 所以:! K0 |. r  w8 N- C6 T/ O
Vdac 分别等于:也是约在0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V之间;
3 [7 Z2 }- Z6 v7 I7 a3、阶梯波形 ( O% g# Y2 s( G8 M
21.jpg
  p: |8 ^+ H+ C" J
22.jpg
. ~5 h& q* u* T对于阶梯波形比较简单:( l% r  `& R4 ^1 g
就是上述的6个数值每个28us触发DMA传输一次到DOR的寄存器;
0 P6 ?. k, V$ L- m6 ?所以测得的实际波形(6个梯阶,电压分别0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V; 周期28*6 = 168us);7 i1 Q3 R5 n, o
验证的波形如下:% q- i4 _/ U6 N4 V$ B  T8 F/ q
23.jpg 5 e! [/ O0 @1 |0 a1 A: h- K
对于阶梯波形的产生,WAVE设置的是0x00;即:wave generation disable;
; k% t" x5 a. T5 \7 B
24.jpg " ]8 A7 Y5 X' d& ]3 z
4、三角波 * g+ ^, k# Z0 _1 N' B
25.jpg
: o2 @9 b$ x) [# S7 M  y6 F' W产生三角波的主要代码如上,其实也就是下面的这一段代码:
- Q, I* y# ]- Y- ~& W  H
26.jpg , f) v% G% s& [- S
其实也就是设置下面的寄存器的比特位;- |3 ~" \0 N# D# o' U3 v0 G7 _, c
27.jpg 0 q2 y( `) M) E, E" ]
最大的振幅是3.3V,即对应的是4095,- A4 ^! Z5 m7 s
软件里面设置的2047,所以振幅是大约1.65V6 `2 @  I6 K4 |! U
28.jpg ' d2 h5 ]2 A) `( d
该三角波的产生是由单片机的硬件产生的,软件控制的是:振幅和周期;
: U  H4 W! J" u4 P2 C, L振幅通过上述寄存器中的MAMP1来控制;  I* ]4 ~6 K1 B" m& ?4 X( e7 R2 p4 {% y
周期则是定时器Tim6的触发事件?
9 V, p! \/ c) Z但是这里的周期并不是128us啊?
; E+ m6 G; u/ R+ v& H改变幅值也会改变三角波的周期的,
3 `! d0 j6 ^% C, }& q4 F9 F1 J- H那么这幅值和周期以及定时器之间三者的关系如何呢?
8 F1 E/ W7 }) R; i$ B  I6 K& b答案: & ]0 Y/ ]! D- x2 ^3 ]' [# d
29.jpg # Z( h6 B& Y- y5 e9 H* D
30.jpg
  U; X$ \& `: z: x6 B& K符合推论。
* [9 G5 m2 i8 u5 m7 F7 G) {0 r设置的波形控制模式:WAVE1 = 0x02,即产生三角波;$ j; a" q. W" T
31.jpg
9 B( Y" W* K/ R6 R) Z' V对于三角波的产生器,还有一段函数代码的作用是什么意思呢?1 b0 \; }4 Y5 I1 z# m
32.jpg
( |; W' K/ K$ L2 U+ k: U
33.jpg % o3 O4 k+ o2 V/ ?3 R/ K" H4 O
即其中的代码:
) ?1 C$ D# w5 a5 G8 z  l
34.jpg 0 S/ |- n: L4 ?; F. g: \( Q
是什么作用呢?: \9 r$ d$ x& E( ?' C& l4 f
产生的波形:
* ^" A* q+ X. `
35.jpg " V' b; p5 i( U1 P) i% R
36.jpg / `- z" b1 q9 O6 b$ ]
在加了函数之后:
& J* E! r3 `# O! S/ C& m, K* }
37.jpg
8 x$ f0 r' e. U0 s8 A& A8 }
38.jpg 6 u& ]9 o0 O7 @" W9 N3 l* ~/ _
从波形上来看,当参数数值不为0时,波形更像三角波,
+ s) M& f+ B: [那这个参数影响的是什么呢?( f: r  I$ r9 m" P& y
39.jpg , q/ Y* |$ Y2 ^* q' R
参数的tmp的值,位于0x200004A4处,初始值为0,运行到:* P: U* Z- }' W# \; S
40.jpg
+ X. S5 y# N' W' P3 j后tmp的值为0x40007400,该值是解释得通的:DAC外设的基地址(0x40007400)
+ x% L) ?2 i7 d3 ~
41.jpg
: t% [: i0 G, T1 F2 y执行完语句之后:由于传递的参数是#define DAC_ALIGN_12B_R    ((uint32_t)0x00000000) 0 |( e: Y3 E5 B7 ?
42.jpg ) O/ n: M, k: c( C
得到的结果是(注意上图中虽然断点停在了DAC_DHR12R2_ALIGNMENT处,但是程序是DAC_CHANNEL_1,所以最终执行的还是下面的语句)
+ w" X8 Y- j0 S% R0 j& g
43.jpg % w. C: n4 t9 r
所以最终产生的效果就是:; i6 L: E- X: `& ^; y2 E
44.jpg
' x: I' w  s8 [  q4 w; i( B8 ^地址为0x40007408的寄存器赋值,即下面寄存器赋值:' F0 z- b" y! L, c1 i( O4 d
45.jpg : M4 v, z( ~" B/ z
但是这寄存器的作用是什么呢?holding data?* g9 F& q4 O: }( c: ~% ]+ d
Holding data寄存器,可以简单的理解为:* X. E: }3 ]0 p; T% x
设置影响DAC的直流分量(直流分量还是根据下面的公式计算出来的):
3 ^$ `5 A) J4 P3 I6 ?9 ?/ d% f1 G# y+ \
46.jpg 7 C! V/ T0 ?  `- D2 c( V
当传递的参数设置为0是,DACoutput即三角波的最低电平为0:
  a2 \4 l1 h5 h; y! f( y当传递的参数设置为2047,DACoutput即三角波的最低电平为1.65V
% a& E$ u9 Z/ k& B/ c
47.jpg
, B' m. K: ^- x5 k; |; W如果传递的参数设置为1024,DACoutput即三角波的最低电平为0.82V;
9 I" r1 v- M0 c  w6 r, h3 t/ y
48.jpg 0 x: Z; k! B5 Y3 T0 ]: a
如果传递的参数设置为3000,DACoutput即三角波的最低电平为2.42V;
) h; z$ }" x+ [0 s. u
49.jpg
% [9 X7 \# G+ R8 p
50.jpg
% i; ?5 z, r8 b/ j5、噪声产生器* X! K( m( x- T. X; M8 J5 H
主要函数的代码如下:. U1 R/ @4 u0 i$ o. D1 H

' l  h; P; @( l  N' x, @
51.jpg 5 h* f: A+ d, s$ f# R
52.jpg ; I# V* a) ~4 c* j

$ L; |% T+ I# A, d" X由于一般的认为噪声是随机性的,所以可以认为只是修改幅值,对于其周期不可控4 @6 }3 h1 ~9 G4 u( V) W7 [

6 g6 t7 E5 W4 l, V" Z3 e* {* O

2 L# e# c% o5 \
) A9 J* ?% \& f  k/ E文档下载地址:7 M( d/ t9 r4 b; O8 j: [# J
https://www.stmcu.org.cn/document/detail/index/id-217139% p4 N) K# h% W9 p

# \3 @+ S$ V% k* s: s9 ~1 ^$ I( [实战经验汇总:% B! Q; x6 p! J
https://www.stmcu.org.cn/module/forum/thread-576401-1-1.html0 ?/ h( Z% `  `

8 O7 Q$ ^+ g: t# g" H
收藏 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 手机版