请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
zero99 发布时间:2016-6-21 18:02
STM32 F1系列 DAC的示例详解 " d* q& K4 H% M' n! S# f
! k6 x# c6 x% F; u9 w3 l
前言
; U& J9 g) j7 y- c4 C基于学习的目的,详细讲解关于Cube库中的DAC的功能。本次介绍DAC。# E4 p% ^: I: L$ e6 k6 e) }

5 m8 m2 i& Y3 {/ _8 u2 G0 n一、示例详解4 [3 n8 E; U( M7 B. B# ~
基于硬件平台:STM32F10C-EVAL,MCU的型号是STM32F107VCT6。" x& @" m' i% M! ]% q+ Z0 f- K/ o
软件则是其Cube库,路径:STM32Cube\Repository\STM32Cube_FW_F1_V1.3.0\Projects\STM3210C_EVAL\Examples\DAC\DAC_SignalsGeneration。
/ J: r& k8 ~: w6 U: k8 g1 R9 z1 [( C1、主程序8 c1 M2 F6 ^, R
软件配置,运行程序可以发现,系统时钟设置为72MHz,定时器使用到的是TIM6;
, V7 S3 D4 Y, {! ^* N6 r' d
11.jpg 4 C; m4 P7 K0 b& {! P% G
12.jpg
- s) C  E! `/ J+ b% A! ~; B根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM6的时钟源来自APB1的分频。7 t" {' c# r6 i& W; X$ k) k: w8 s
13.jpg & Q$ _+ u4 U" c. H! a4 ^
14.jpg
9 u3 U0 I- X! c
15.jpg
  t% s: L& R( c7 N4 uAHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,即/1,所以HCLK就是72MHz;
& F  [4 X: h/ w. F; K- xAPB1的prescaler的系数是PPRE1:0x4,HCLK divided 2,即/2,APB1CLK为36MHz;由于APB1的prescaler系数部分频,即/4,所以倍频器起作用,即为上图中的TIMxCLK = 72Mhz。: D" e# {2 ]; q" K  K
2、 定时器Tim6 5 B; A( u! S: Y" a
16.jpg 0 X/ s4 K1 o/ o% w" K4 ^# @  `& B
17.jpg $ S) V0 L% Y- P6 Y' w
设置的是向上计数,周期是0x7FF(2047),从0开始计数到2047,所以该定时器的更新周期:(2047+1)/72 = 28us,
/ M7 t4 \+ H& S$ v$ y
18.jpg 7 _# N. ^/ C! ^) i; {5 a. D# u
所以传输的6个数值:
; i0 W# o! A& k$ v7 k3 h1 c8 z
19.jpg
; e0 `: g2 Z/ G' S对于8位的DAC,程序中设定的是右对齐,
- ~; k. A% [9 _, h0 O5 M. K/ q$ m
20.jpg
! {* {4 ?* o) z8 C  H所以,对应的DOR分别为
$ K: y& R6 X9 t0 _7 k/ f0x000(0), 0x330(816), 0x660(1632), 0x990(2448), 0xCC0(3264), 0xFF0(4080) ;
, U0 w  Q9 B7 A' s9 i: K" W而Vref = 3.3V, 所以:! Z, N, v7 P& b5 @% p) D
Vdac 分别等于:也是约在0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V之间;
2 w  D2 _; d2 v$ F3、阶梯波形
% F. i9 |$ c' s" z& t" t* T
21.jpg
9 b) F' C+ z9 L% i
22.jpg
: S& i6 F6 |7 J4 O5 i对于阶梯波形比较简单:
  ^6 L0 K8 _/ O, p6 w0 Y0 ?1 U就是上述的6个数值每个28us触发DMA传输一次到DOR的寄存器;
/ ~/ S& e* R6 H所以测得的实际波形(6个梯阶,电压分别0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V; 周期28*6 = 168us);
9 K# U6 W0 u% H* d验证的波形如下:
5 U6 `) M: ]( Z3 I. q( E( l
23.jpg 9 z. B( H! i3 R
对于阶梯波形的产生,WAVE设置的是0x00;即:wave generation disable;
" G: k# ~: h; z9 E
24.jpg % Z& O( ^7 `9 H/ k1 L. V6 e
4、三角波
, L: R. B6 T6 x1 V8 {6 A
25.jpg
1 B6 y5 j" b; N+ a7 a产生三角波的主要代码如上,其实也就是下面的这一段代码:
: e- c6 ?3 o5 G5 _9 Y  R
26.jpg
/ ~. |4 M3 y4 J9 W+ N1 b  t# m( a  r其实也就是设置下面的寄存器的比特位;
) y. ~- Q4 G  `+ O; M
27.jpg
3 g: M) K9 ^4 G, _最大的振幅是3.3V,即对应的是4095,0 z7 N& Y. d' b& W& c  z
软件里面设置的2047,所以振幅是大约1.65V. V2 ]8 v" W0 y8 N
28.jpg
8 L3 i, M, v2 Y8 k3 Z7 d该三角波的产生是由单片机的硬件产生的,软件控制的是:振幅和周期;7 t+ i& g: y3 R5 p. o
振幅通过上述寄存器中的MAMP1来控制;
; X. d, y" o; J" B% M周期则是定时器Tim6的触发事件?4 _0 {3 i. ]) W- t+ t
但是这里的周期并不是128us啊?
7 O0 s3 F. `# o4 `$ g6 S改变幅值也会改变三角波的周期的,0 o- R9 |* k: w* _
那么这幅值和周期以及定时器之间三者的关系如何呢?: u2 a7 u# V0 y( G+ ]6 l/ X+ C* B! I% N
答案: 5 D( a% _$ V3 ~9 Q, E2 I
29.jpg
, U) r( b' C% X, K* u
30.jpg
1 A6 Y2 B* I+ ]) M符合推论。, G. r1 A0 f( [  h- J* X
设置的波形控制模式:WAVE1 = 0x02,即产生三角波;
7 X/ x" Q0 y9 {& Q9 t" f
31.jpg * o. v4 C& {- _
对于三角波的产生器,还有一段函数代码的作用是什么意思呢?5 P0 a3 L/ @; r  A( P, N7 k/ ?
32.jpg 4 |, {8 k! V# [0 f5 N, m$ X& m) H1 \
33.jpg
) l0 ?# X! h8 S. V% G即其中的代码:9 D+ U) K9 O4 j3 F; k2 t
34.jpg
+ M* Y/ _4 c8 X. X9 C是什么作用呢?
) o: J+ W. ?, ^+ f1 ~! S; V产生的波形:& R3 R, G' X+ F/ J
35.jpg $ T+ i7 b8 H6 t
36.jpg
* I3 O7 p4 w. `- X+ D2 a# |. m: K4 I在加了函数之后:
* ]' y. C5 M, F+ r  S6 Z! I
37.jpg
3 i7 U8 [! E! e+ y9 H7 X
38.jpg
: E7 H3 h$ E7 I) w0 A1 y8 Z从波形上来看,当参数数值不为0时,波形更像三角波,
0 m9 Q* M) c. l1 |" i: |& q那这个参数影响的是什么呢?
, r+ _( U* s$ C
39.jpg / O# A, p& i, F! c8 }; D" n
参数的tmp的值,位于0x200004A4处,初始值为0,运行到:* Y& F& g$ d8 a/ I3 k! l
40.jpg
. f% e: G' ~. z& P后tmp的值为0x40007400,该值是解释得通的:DAC外设的基地址(0x40007400)
8 [8 [* j8 f, \) ]9 d
41.jpg * {  v: r* s6 q1 _3 w  C
执行完语句之后:由于传递的参数是#define DAC_ALIGN_12B_R    ((uint32_t)0x00000000) 7 i0 C/ t' G9 k
42.jpg 1 i1 r( W$ w+ Q* i5 y/ y8 w* ~7 W
得到的结果是(注意上图中虽然断点停在了DAC_DHR12R2_ALIGNMENT处,但是程序是DAC_CHANNEL_1,所以最终执行的还是下面的语句)
4 p9 b; R8 S# |" {  K
43.jpg
5 w. P% z% m6 K- l! J- e所以最终产生的效果就是:
2 [+ J% r# j3 F, H: P
44.jpg
, P4 g7 X4 H: F9 {4 D. g- g地址为0x40007408的寄存器赋值,即下面寄存器赋值:
' a3 R0 n+ U4 `2 ]+ r
45.jpg ( H7 f3 |5 y' B/ p
但是这寄存器的作用是什么呢?holding data?
& V* B1 a  O6 E/ y6 A  uHolding data寄存器,可以简单的理解为:6 C8 a; o" Y6 w* u0 U
设置影响DAC的直流分量(直流分量还是根据下面的公式计算出来的):
6 @% N" e% H2 [3 m' ~4 T
46.jpg 6 a8 Z) s( a, f4 y
当传递的参数设置为0是,DACoutput即三角波的最低电平为0:
5 G6 k8 O  m0 m" T9 v当传递的参数设置为2047,DACoutput即三角波的最低电平为1.65V0 Q) G& r- o- k; D" o8 Z
47.jpg " [8 d( |/ _/ N. q$ M, }: K9 n: O' Y
如果传递的参数设置为1024,DACoutput即三角波的最低电平为0.82V;. J+ d0 k4 T" P* S( r
48.jpg 3 b/ ^; b; E2 h
如果传递的参数设置为3000,DACoutput即三角波的最低电平为2.42V;
! W. u1 F4 e; `
49.jpg ; ?$ M  p) u2 B6 N
50.jpg
/ n/ o6 j; B/ U; `- S1 j/ W; G5、噪声产生器9 P0 E7 a1 n( J- k% Q/ L
主要函数的代码如下:
$ H. o( Y' u6 ^7 |( q( s7 e! [8 k3 U0 f$ y" o& N
51.jpg
4 K$ L- Y" [# F  ]9 s
52.jpg , Z: \& Z) g5 F; h2 _
# Q# L/ {5 A% O% C! b
由于一般的认为噪声是随机性的,所以可以认为只是修改幅值,对于其周期不可控9 o% a5 w+ o8 s  Q, [
! s& ~5 L7 V& ]4 H9 ]* s% ]

- _8 Y, _! a) D8 e! ?$ |) u9 B4 W1 `9 [& |
$ y! i1 L0 A1 q/ b" U文档下载地址:
1 ]5 U& _1 C9 @, ]6 @8 [/ shttps://www.stmcu.org.cn/document/detail/index/id-217139
7 Z4 @& y& F+ ?! t. \2 `
" }, R( [! x$ N) O4 Z" d4 ^实战经验汇总:
/ c* c, Z) `% Y& H( t7 w. c/ G9 uhttps://www.stmcu.org.cn/module/forum/thread-576401-1-1.html+ r. e7 c) n1 |2 f8 a8 n) g( ~& j% r

0 P( t5 o7 s- `' ]* u- M
收藏 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 手机版