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

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

[复制链接]
zero99 发布时间:2016-6-21 18:02
STM32 F1系列 DAC的示例详解 6 w/ L& t7 x8 h: m! P5 D
1 r: T5 l/ m5 v! \2 D
前言+ e9 Q$ ^  Y4 ~& V8 v
基于学习的目的,详细讲解关于Cube库中的DAC的功能。本次介绍DAC。1 N9 r3 M; n2 e' }' u+ F, Q6 A

3 f/ M( a# b- w  W一、示例详解5 S# F& x8 j' F5 C0 w6 {9 B/ W
基于硬件平台:STM32F10C-EVAL,MCU的型号是STM32F107VCT6。
% }+ {8 D& {- j8 |0 M9 Y# |软件则是其Cube库,路径:STM32Cube\Repository\STM32Cube_FW_F1_V1.3.0\Projects\STM3210C_EVAL\Examples\DAC\DAC_SignalsGeneration。
/ q2 I* m6 O2 J, {  z& h: q1、主程序" C% m% `# k0 B
软件配置,运行程序可以发现,系统时钟设置为72MHz,定时器使用到的是TIM6;
( _( @/ p" N) \; n
11.jpg ( |2 l0 v8 P' Q& Q2 o; u7 o# _$ ~+ v
12.jpg ; V1 p  W$ l; J8 y2 [
根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM6的时钟源来自APB1的分频。
& Q1 n, m( c$ r# G5 D+ E4 @
13.jpg
% f1 |3 @- N' F# q: V+ D8 J( M0 b
14.jpg
4 w& x- d0 ?# \! k5 Z) g+ F! v
15.jpg " J/ o' t' O+ \8 x
AHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,即/1,所以HCLK就是72MHz;
3 D+ U  Y3 `( I; dAPB1的prescaler的系数是PPRE1:0x4,HCLK divided 2,即/2,APB1CLK为36MHz;由于APB1的prescaler系数部分频,即/4,所以倍频器起作用,即为上图中的TIMxCLK = 72Mhz。3 v7 I+ Y5 P; x7 u$ a2 ?2 j
2、 定时器Tim6
6 A: ^# k1 `! M1 v2 _6 A
16.jpg , x2 p' [" d. H
17.jpg 8 i4 U/ u: x; H/ q1 G5 Z
设置的是向上计数,周期是0x7FF(2047),从0开始计数到2047,所以该定时器的更新周期:(2047+1)/72 = 28us,
" B# _, h5 W$ [# r+ U- P3 [) Z
18.jpg
2 P+ K- ^' @  J+ W9 K# X. I8 W所以传输的6个数值:
/ \3 P2 c+ ]7 [
19.jpg , Y3 j. ]8 y1 _( t' q3 h
对于8位的DAC,程序中设定的是右对齐,
/ O$ y7 R4 q) `! z
20.jpg 2 k/ k! D' u, }+ l  t
所以,对应的DOR分别为
; ?$ O0 L: _3 \9 E6 g  \0x000(0), 0x330(816), 0x660(1632), 0x990(2448), 0xCC0(3264), 0xFF0(4080) ;) T2 e) M: G" u) s+ x& ]% _
而Vref = 3.3V, 所以:6 L! |+ ^# l- H' L
Vdac 分别等于:也是约在0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V之间;
. S: \" z; }3 Z3、阶梯波形
" N1 d3 b: h3 q3 ]# `
21.jpg ; s) _1 G8 e' R
22.jpg + [' z8 {( v9 m# ~# v% H. t5 [
对于阶梯波形比较简单:
+ P3 s- G+ b) F就是上述的6个数值每个28us触发DMA传输一次到DOR的寄存器;
( ^; E9 j$ F/ V1 Q6 i所以测得的实际波形(6个梯阶,电压分别0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V; 周期28*6 = 168us);
6 G* i: p2 W; \7 r0 v2 F验证的波形如下:
$ U; T; A  ~5 J0 t2 }
23.jpg . {7 F, ]) s: W! q. a! o
对于阶梯波形的产生,WAVE设置的是0x00;即:wave generation disable;
- O' Z/ P3 E+ |+ \2 }% X
24.jpg
$ m( C$ C( B6 e* V- Z+ K4、三角波 6 ?8 I$ J2 P. H% n% k2 V' o
25.jpg
' {2 L9 g8 b+ t! `9 v产生三角波的主要代码如上,其实也就是下面的这一段代码:
' Y; Q# h1 C; I9 _" d
26.jpg / @9 }# m9 c! X+ z0 l, T  l
其实也就是设置下面的寄存器的比特位;) L0 j* \) W' p; Q- P& l2 y8 y
27.jpg . z& `8 L' t4 f7 Z( y* f* ]" h2 k' l" [) q! A
最大的振幅是3.3V,即对应的是4095,
# J8 u, M. ^/ B2 r2 w' s! F软件里面设置的2047,所以振幅是大约1.65V
- \( e; ?! [+ H, c6 W; ?, F4 y
28.jpg
% A+ @9 |  N1 }, E7 P! @9 X该三角波的产生是由单片机的硬件产生的,软件控制的是:振幅和周期;
1 v7 ~0 n. C' e1 @4 e1 d振幅通过上述寄存器中的MAMP1来控制;
$ y# G9 ]$ @8 L& u1 q; X) Z$ C$ x& h1 A周期则是定时器Tim6的触发事件?
* p5 i$ @7 n4 Z/ {: ]; k但是这里的周期并不是128us啊?
5 v3 ~  ]7 L( v" k' q改变幅值也会改变三角波的周期的,, ~1 X7 H: n9 U
那么这幅值和周期以及定时器之间三者的关系如何呢?  `1 N* v( J. _
答案:
' I0 p! ?. H2 l- ~
29.jpg + O8 Q# m) a3 A9 I  \+ h
30.jpg , Y9 n; T9 S' f; F' X: h8 s  i( ]
符合推论。( x6 \/ _7 c: U, R5 x$ ]5 z
设置的波形控制模式:WAVE1 = 0x02,即产生三角波;
' ]" s! P4 z' ~2 \4 o
31.jpg
$ i- T8 \# L9 M5 ~对于三角波的产生器,还有一段函数代码的作用是什么意思呢?
% q, A, s; p: W: u6 n3 v
32.jpg
" K7 [( R- O& f/ ^
33.jpg
3 P5 a9 Z2 ]7 f1 l; Y. s. J7 h( X即其中的代码:3 k5 c+ D; s  c. o0 _1 o$ q5 Z
34.jpg
. ^  N- T' H" d是什么作用呢?) M% e( D; }& e
产生的波形:5 g2 o! c1 ^0 T  H1 h: y% T6 Z9 d
35.jpg $ S' N$ ?( c' s7 N
36.jpg ! b+ h: k- f! c& n# r# j
在加了函数之后:4 A% T  d% r+ t; c5 v" r
37.jpg 6 w' h2 {! D: N& o: \  D9 e" g
38.jpg
% }+ ~5 T% i1 ~8 S7 J: P+ f, v从波形上来看,当参数数值不为0时,波形更像三角波,
; W4 |. G1 D( r; m那这个参数影响的是什么呢?
, X" p. u) f7 y  g3 D' O2 ~% Q
39.jpg
+ `( j' i5 b( V参数的tmp的值,位于0x200004A4处,初始值为0,运行到:
. M! L$ g9 H4 e2 F$ l$ I8 [, `# p( v
40.jpg
4 t- C. F; d% X后tmp的值为0x40007400,该值是解释得通的:DAC外设的基地址(0x40007400)! \" E4 ^: R) {+ y; U2 r0 J
41.jpg
# |; n. \# p- j4 ]3 B1 \4 I执行完语句之后:由于传递的参数是#define DAC_ALIGN_12B_R    ((uint32_t)0x00000000)
2 l9 A* M$ Z5 w4 G/ J% s
42.jpg
7 B* c; N$ |: c  l' O; s- _+ C得到的结果是(注意上图中虽然断点停在了DAC_DHR12R2_ALIGNMENT处,但是程序是DAC_CHANNEL_1,所以最终执行的还是下面的语句)
8 I0 v; Q6 P7 |1 }0 u: _* {! v
43.jpg
. T7 ?+ O! d6 S所以最终产生的效果就是:/ e) C2 m4 a4 e) a8 h
44.jpg 7 L9 F" K" z4 g& O& R# ^5 [
地址为0x40007408的寄存器赋值,即下面寄存器赋值:# x6 l8 ?) v+ d" e" r3 W; K
45.jpg , X' ^# J( Z7 g* h( @. n, f
但是这寄存器的作用是什么呢?holding data?
  b3 z7 y, ^/ BHolding data寄存器,可以简单的理解为:
! Y/ U# v* w: S, n2 S设置影响DAC的直流分量(直流分量还是根据下面的公式计算出来的):/ S1 h) s- f6 V' R. j! R
46.jpg
. q5 d0 D, Q  j& S. q) [+ F当传递的参数设置为0是,DACoutput即三角波的最低电平为0:
: W( f6 F; U& c1 ]当传递的参数设置为2047,DACoutput即三角波的最低电平为1.65V
3 g* r2 Z2 ~& Q# e1 o3 C
47.jpg   H5 G" I' g7 I% j
如果传递的参数设置为1024,DACoutput即三角波的最低电平为0.82V;
$ ~8 C1 L: E$ O6 `" V; T
48.jpg
% @, C2 ~/ s7 P9 x  c5 z如果传递的参数设置为3000,DACoutput即三角波的最低电平为2.42V;3 U- d( o$ i/ G1 m5 Y3 m
49.jpg
! i9 \" Q/ {4 T; y
50.jpg
% G. F4 Q0 C& x4 ?1 o* m5、噪声产生器& m4 _0 B( ^* ?
主要函数的代码如下:
6 t1 K/ d- B5 x9 r1 D
2 s" S! P2 T6 C" T6 b7 c# e+ d
51.jpg 7 o. F7 a4 z9 ^: o2 l& N2 B
52.jpg 7 d$ b. Y* Y9 q* Y$ S4 P( U' u

- h& x/ [6 y9 Z: \: b9 Y7 m由于一般的认为噪声是随机性的,所以可以认为只是修改幅值,对于其周期不可控7 @/ j8 C/ j6 X2 Y1 j
2 G" M; R" t0 ?  [. e4 o

1 z2 |& t8 c9 Q8 h  j3 U+ T2 z* q, J. Q1 ?( @' Q
文档下载地址:
% F9 |7 J3 R  L; Y! i- |8 C) j) Vhttps://www.stmcu.org.cn/document/detail/index/id-2171396 K- a6 c$ }1 `! l5 F+ Y" s
' H% T9 Q( T+ `; @, P9 l
实战经验汇总:
' ~- L! f( _$ I# M6 \$ C, N1 D* _https://www.stmcu.org.cn/module/forum/thread-576401-1-1.html
6 L& z4 p7 z% J4 G
# E! t& q1 O4 y
收藏 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 手机版