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

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

[复制链接]
zero99 发布时间:2016-6-21 18:02
STM32 F1系列 DAC的示例详解 9 r) w5 E9 ^& M$ n" Z1 [0 g# M" V
0 Z- ^3 k+ {; ^: S8 x* g
前言
0 A+ Z: u( C/ o/ I1 n1 d4 ^+ X基于学习的目的,详细讲解关于Cube库中的DAC的功能。本次介绍DAC。2 \# F/ Q1 Z. g
7 m( }- h% a2 r' y/ |* H
一、示例详解
5 f  x/ u1 x4 |- Q( q) U基于硬件平台:STM32F10C-EVAL,MCU的型号是STM32F107VCT6。/ e$ Y7 ~* y# P
软件则是其Cube库,路径:STM32Cube\Repository\STM32Cube_FW_F1_V1.3.0\Projects\STM3210C_EVAL\Examples\DAC\DAC_SignalsGeneration。
* o- x% F" u; g8 K! [9 e' ^2 _1、主程序
# P$ U( _  I! ~4 V; e软件配置,运行程序可以发现,系统时钟设置为72MHz,定时器使用到的是TIM6;
8 z) q4 ^& e$ Y! ?* n
11.jpg
5 z5 r9 r; H- E) j! `; O: V$ r
12.jpg , J$ `9 V2 R5 T; d8 ]* |: a) R* h
根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM6的时钟源来自APB1的分频。
* Y7 A( ~' [+ C1 L; \7 X
13.jpg 3 k  ]7 S+ n' f+ [+ e; w" V$ W
14.jpg
5 J) _4 @8 ]1 @1 u  j
15.jpg ' _' J3 x$ T  {) ]: b" q/ y
AHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,即/1,所以HCLK就是72MHz;
! M2 Y- V$ y, |2 @. A5 tAPB1的prescaler的系数是PPRE1:0x4,HCLK divided 2,即/2,APB1CLK为36MHz;由于APB1的prescaler系数部分频,即/4,所以倍频器起作用,即为上图中的TIMxCLK = 72Mhz。# m4 B+ u& @; x8 E: \$ d$ ~
2、 定时器Tim6
1 U) M. h3 O6 z8 f9 C" v
16.jpg - r* b$ U! ^, V" }/ u0 @5 \
17.jpg
: f$ g; d- C8 C4 p9 i6 S' y设置的是向上计数,周期是0x7FF(2047),从0开始计数到2047,所以该定时器的更新周期:(2047+1)/72 = 28us,
: e0 i5 D# W* Q% U
18.jpg
9 k5 k9 E3 H  ~- Z5 t所以传输的6个数值:. U0 ?1 H* Y( Q4 }- B' p2 H
19.jpg 0 A2 s, i  P6 y4 m/ x
对于8位的DAC,程序中设定的是右对齐,
& Q. J- T( v% D
20.jpg * j' ]( {4 t6 K, _# V
所以,对应的DOR分别为# L. A- V1 S9 k2 G' D- q
0x000(0), 0x330(816), 0x660(1632), 0x990(2448), 0xCC0(3264), 0xFF0(4080) ;, ^, w- n( w9 P- r. S& @
而Vref = 3.3V, 所以:6 _9 N, N' L  w; c9 }
Vdac 分别等于:也是约在0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V之间;
* b1 H1 |: Q" V. r0 j9 \3、阶梯波形
$ F) Z. M# h8 A
21.jpg
! e! Z+ r* F/ U# [- Y
22.jpg * v; }7 J7 |9 r2 m3 ~8 Q$ [1 ?- J/ ?
对于阶梯波形比较简单:
  I6 }3 Q. B* O  \3 Y4 r就是上述的6个数值每个28us触发DMA传输一次到DOR的寄存器;5 T5 X' {' h* J4 M, z$ l
所以测得的实际波形(6个梯阶,电压分别0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V; 周期28*6 = 168us);. p' ~0 k! X/ p5 F- C& k
验证的波形如下:
/ ?7 P" s: a- D* N
23.jpg # Q+ K( U! c# f/ U% ?- y  }" o
对于阶梯波形的产生,WAVE设置的是0x00;即:wave generation disable;
6 Q3 _: G/ o! C
24.jpg ( N2 D- {/ f7 g* J. [
4、三角波
4 E% n# b* B( O3 e% P
25.jpg 0 l' _. ~1 [. F/ x. d
产生三角波的主要代码如上,其实也就是下面的这一段代码: 9 C6 g' }5 I5 c- c0 p
26.jpg
2 b0 E: z9 D0 s# z" \5 B其实也就是设置下面的寄存器的比特位;
  v4 k7 {/ H1 k4 j/ O& M/ g
27.jpg 3 e0 h" h! R1 K5 y: ^8 ~# ~
最大的振幅是3.3V,即对应的是4095,
+ o% Y% k: n& j9 c; }, `/ f软件里面设置的2047,所以振幅是大约1.65V
) f7 Z1 W0 m8 e+ V
28.jpg
- I0 w, i4 ~8 M/ W该三角波的产生是由单片机的硬件产生的,软件控制的是:振幅和周期;1 `" M1 f( }/ X
振幅通过上述寄存器中的MAMP1来控制;: T/ X1 @* Y) q7 q
周期则是定时器Tim6的触发事件?
* w3 \+ |" {  {1 W. N" q1 D但是这里的周期并不是128us啊?
8 h' \! d, O6 @6 r& ?2 [改变幅值也会改变三角波的周期的,
" |7 J0 w4 B+ p, P3 G那么这幅值和周期以及定时器之间三者的关系如何呢?; k. Z' z% c9 Y% l7 e9 G
答案:
7 _8 u0 o2 e% Q4 m
29.jpg
" Z3 f9 ]+ a5 X$ M9 c
30.jpg
6 t. O# i, |+ g$ g$ D' |符合推论。' d. Q. v6 ~5 t% C
设置的波形控制模式:WAVE1 = 0x02,即产生三角波;8 f# Z6 D7 D4 h5 N, _0 Z: D
31.jpg
: b( v8 s" }; X: ]对于三角波的产生器,还有一段函数代码的作用是什么意思呢?
" N6 N/ A! i7 U
32.jpg
0 P/ d$ G  j& R7 L. C& L
33.jpg
; w5 ]( F% \' e+ L1 C- H即其中的代码:  p$ o" j1 b* q4 X, s
34.jpg 7 t' `' ?0 t1 Q1 L' s, C5 F' Q$ l
是什么作用呢?  t# x- `5 |2 H. k' p7 o
产生的波形:" C% x* P: O2 o. L* o
35.jpg   X& C' h: ]" Q" ^6 C! S; u/ S2 x
36.jpg
7 j: g' H. r: s: b在加了函数之后:  Z/ M" F1 C( C2 w7 R& d; }
37.jpg
# k; z3 ]& P  u+ l6 a6 X; A6 n
38.jpg ( J' k! F8 m. o. f
从波形上来看,当参数数值不为0时,波形更像三角波,
4 ]0 \; w9 C6 K3 |- m- q那这个参数影响的是什么呢?/ l1 C. a# A1 u1 p$ J1 s
39.jpg
( r: V+ k: g8 ~( k参数的tmp的值,位于0x200004A4处,初始值为0,运行到:1 N; h* S( ~' s2 G9 ~8 R
40.jpg
, r& ]# P, A# ^, E! q后tmp的值为0x40007400,该值是解释得通的:DAC外设的基地址(0x40007400)
  a- r2 \- t  J( s1 `
41.jpg
! h: j/ p  p! K3 o& ~( ~执行完语句之后:由于传递的参数是#define DAC_ALIGN_12B_R    ((uint32_t)0x00000000) # B, `9 `# W4 o  _' E) Y
42.jpg $ K% z2 x, j% d8 _( J; r- Q
得到的结果是(注意上图中虽然断点停在了DAC_DHR12R2_ALIGNMENT处,但是程序是DAC_CHANNEL_1,所以最终执行的还是下面的语句)
. Z$ ], a" h4 N) X
43.jpg
- `! g) z, Q  n& a# M6 ~$ R* }3 E+ A2 U1 B所以最终产生的效果就是:
: g/ N! O& N; [% F0 _; d. V$ B
44.jpg
8 \. ?1 i, f5 |2 Z+ l6 t8 Y4 R$ M地址为0x40007408的寄存器赋值,即下面寄存器赋值:& N; k" b( h8 ?4 d0 t
45.jpg
9 R2 o" {" d! m/ \9 ^# \3 v但是这寄存器的作用是什么呢?holding data?
/ `: d% O" `* R! I' O2 X4 MHolding data寄存器,可以简单的理解为:
& D) [" }3 H' Q* W0 u" \+ s( ]设置影响DAC的直流分量(直流分量还是根据下面的公式计算出来的):9 d9 G* `0 {1 s
46.jpg . P' F; R$ P: W' A5 {* `
当传递的参数设置为0是,DACoutput即三角波的最低电平为0:
6 W3 b/ m: U( P当传递的参数设置为2047,DACoutput即三角波的最低电平为1.65V( ]( t/ j% _( P. j- V( |
47.jpg 5 z# K4 h  M4 s# G$ a
如果传递的参数设置为1024,DACoutput即三角波的最低电平为0.82V;
/ A+ U& }  \0 e/ `8 Z) R2 s5 H# z
48.jpg   H: S' p. f1 h% Z, i
如果传递的参数设置为3000,DACoutput即三角波的最低电平为2.42V;, l- i2 \+ `3 ~! u
49.jpg ' T$ U. x3 f1 K6 X: c" f; ?
50.jpg ! \' B/ H* i$ D9 V9 W! E& d
5、噪声产生器; g- u  X. i* ^9 l
主要函数的代码如下:! j  S. k  C0 a  G

1 t) [7 k: J8 x6 B+ ~3 T6 t
51.jpg
( e2 r5 i+ d# r7 V" }/ ~, s
52.jpg , h- H+ ?! q, H! X( B/ g4 \
+ `( G9 ?) Y- T5 q! I
由于一般的认为噪声是随机性的,所以可以认为只是修改幅值,对于其周期不可控
% _& K1 ^/ r( i$ a8 E1 ^4 h+ a

4 r: V" D9 [- D- G. [3 Q1 M1 e6 e4 ~$ Q4 P  I
文档下载地址:
. |/ g4 O* C4 N8 f# Fhttps://www.stmcu.org.cn/document/detail/index/id-217139- I* }  P+ w& m5 L- A" R
7 ], m- M/ \7 R
实战经验汇总:' w7 K) Z& Z1 f  P$ O0 F1 U% D
https://www.stmcu.org.cn/module/forum/thread-576401-1-1.html4 b) |# s+ c5 n

" w% s( V2 y' 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版