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

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

[复制链接]
zero99 发布时间:2016-6-21 18:02
STM32 F1系列 DAC的示例详解 & i. M* ]" g3 d5 y

5 k* x7 O+ _  i- }" L2 y1 z. C前言; R8 `6 B/ m  ?! o
基于学习的目的,详细讲解关于Cube库中的DAC的功能。本次介绍DAC。
  {% g+ S# t# }* F7 v9 l3 E) ~& `  d5 o9 d5 ^* O0 A; W1 k
一、示例详解3 @7 ~6 J& Y; e6 G
基于硬件平台:STM32F10C-EVAL,MCU的型号是STM32F107VCT6。! z/ U# n' l, x
软件则是其Cube库,路径:STM32Cube\Repository\STM32Cube_FW_F1_V1.3.0\Projects\STM3210C_EVAL\Examples\DAC\DAC_SignalsGeneration。8 O! L9 k# k1 Y+ J$ V* l# [
1、主程序
# ~" Q7 C$ c+ P+ {软件配置,运行程序可以发现,系统时钟设置为72MHz,定时器使用到的是TIM6;( M# R. G1 g4 p  ~+ M( [6 i5 Z* C
11.jpg
0 _, Z* |9 \+ O6 l
12.jpg ! g. e0 O- Q  R) o. M+ y8 ]/ r
根据时钟树的图谱及其程序, 该示例选择的是内部时钟源作为定时器的时钟源;TIM6的时钟源来自APB1的分频。
4 D; j0 U! R: S" R& o  d
13.jpg / X' {( e/ |) j1 t& i. y
14.jpg
- [7 W" \' }5 ^* }0 F" l
15.jpg
6 e4 I, m/ [/ \2 I- z8 g4 lAHB 时钟 (HCLK)在RCC_CFGR寄存器中的分频系数HPRE的值为0,即SYSCLK not divided,即/1,所以HCLK就是72MHz;
8 n9 C$ k. c: E  t: \+ UAPB1的prescaler的系数是PPRE1:0x4,HCLK divided 2,即/2,APB1CLK为36MHz;由于APB1的prescaler系数部分频,即/4,所以倍频器起作用,即为上图中的TIMxCLK = 72Mhz。
6 @" }7 U- f* \5 M( S) e5 \2、 定时器Tim6 5 V! s0 J# d. B& V9 [3 m8 N/ j
16.jpg " P$ j& I  s9 M2 D& S8 G0 a$ g+ h
17.jpg % O4 X1 Z! f. l0 R9 t- k
设置的是向上计数,周期是0x7FF(2047),从0开始计数到2047,所以该定时器的更新周期:(2047+1)/72 = 28us,/ V( X/ ~! l1 ~- \4 ^
18.jpg
: d8 E$ `9 w+ _. w+ C. ^9 e  N所以传输的6个数值:
2 m% E! m% l+ r1 C- e8 t6 C
19.jpg , ]2 w# A7 @, P+ v% ~% \$ m
对于8位的DAC,程序中设定的是右对齐,1 ~' y# C1 m4 s$ t8 N3 T
20.jpg 4 Y' k2 I/ {' Y  s/ x
所以,对应的DOR分别为
4 A5 l" e  u- x7 t. \0x000(0), 0x330(816), 0x660(1632), 0x990(2448), 0xCC0(3264), 0xFF0(4080) ;
9 K5 _) I  Q1 d5 t而Vref = 3.3V, 所以:; S$ ?* n* s! v8 [9 L' p3 N
Vdac 分别等于:也是约在0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V之间;
$ V$ l  f% C/ f" l. e3、阶梯波形
3 H3 \; c: x' d, v8 |
21.jpg
: v! p4 K9 U7 R0 N: v
22.jpg 1 G0 B3 i# [! X/ S' j9 F
对于阶梯波形比较简单:
, d8 |4 h5 c5 ]4 w0 ]7 E/ M; d就是上述的6个数值每个28us触发DMA传输一次到DOR的寄存器;
7 o  z' L( F$ l# \! W2 N" i: N所以测得的实际波形(6个梯阶,电压分别0V; 0.66V; 1.32V; 1.98V; 2.64V; 3.3V; 周期28*6 = 168us);
1 H1 O& o3 b+ z+ @验证的波形如下:
5 Z; I) `; `: Z# E1 K, I1 W, o
23.jpg
4 k5 _2 R6 D8 i# d8 j6 m: S- t对于阶梯波形的产生,WAVE设置的是0x00;即:wave generation disable;) X2 }. K- G$ B4 F8 r: S7 }
24.jpg
9 B( n6 A/ L( b& ?$ P+ E) l4 p9 o4、三角波 6 O2 t. c8 ]  i8 \2 s+ u- w8 t; a
25.jpg 8 Z4 [( p1 C, M( ^# Y
产生三角波的主要代码如上,其实也就是下面的这一段代码: ( W3 S: r- ]2 G6 n( ~: Z+ g' |
26.jpg * J3 G- E7 m! l" [9 \! \6 F
其实也就是设置下面的寄存器的比特位;7 U- a- C& f% u
27.jpg
8 A; w4 Z. N5 ^$ L& J& L% I1 v最大的振幅是3.3V,即对应的是4095,2 U4 \6 g: G0 a) g2 T
软件里面设置的2047,所以振幅是大约1.65V
) b% ~; v8 O! o" G
28.jpg
8 u% @. {3 w$ H" v该三角波的产生是由单片机的硬件产生的,软件控制的是:振幅和周期;
+ O6 P2 W  v( J) H+ z振幅通过上述寄存器中的MAMP1来控制;% o/ S: I, u  f8 f: L
周期则是定时器Tim6的触发事件?
8 i8 f9 |( \. |- Q2 H但是这里的周期并不是128us啊?
; E+ C9 `! b6 j, r  v# d改变幅值也会改变三角波的周期的,
4 g/ w# S# c" V" S那么这幅值和周期以及定时器之间三者的关系如何呢?! F* P. J& D6 c4 T! R8 a% u; ^9 C, j
答案: 0 D# I4 f4 t* [2 W% h
29.jpg
" v) Z" D: w+ G
30.jpg
/ k8 l2 Z! u+ W+ Q+ U& q+ J符合推论。1 Z: o* U' Y4 w# P
设置的波形控制模式:WAVE1 = 0x02,即产生三角波;
  B0 a+ B! V  ?3 x: l
31.jpg   S* N: e+ z1 C: C" A
对于三角波的产生器,还有一段函数代码的作用是什么意思呢?
& h/ I) e+ H* v7 W) ]; b
32.jpg
, J1 E9 q4 w/ s+ t3 ~
33.jpg
1 j& a3 k% Q, Y5 I1 V+ p即其中的代码:
# H) a9 y, A" v/ w
34.jpg * u5 x: j1 t! x# [: f
是什么作用呢?6 g" Z3 I. ]/ ~5 a* y
产生的波形:- r! A& e& q. }" e' L+ b; K2 _
35.jpg % z7 ^# K+ w( K7 B! D  a4 A
36.jpg 5 U6 b( v* J, W; X1 ~
在加了函数之后:# I4 k, l  e2 X& g
37.jpg
3 S$ O1 h5 e4 u$ I9 Y
38.jpg
  C# W% ?, s+ [1 e7 l; }1 g1 F- u' ?从波形上来看,当参数数值不为0时,波形更像三角波,
! H! e3 c4 q5 p* Z! E7 I那这个参数影响的是什么呢?$ c( b" _8 d' O& D! U! @4 j
39.jpg ) N; Y/ r0 h* S- V" Y# N# k+ i$ L# Y
参数的tmp的值,位于0x200004A4处,初始值为0,运行到:) x. w! @' L# }3 p4 X' C& q; |
40.jpg # }, X$ d! {; G7 x/ @" X+ y4 J
后tmp的值为0x40007400,该值是解释得通的:DAC外设的基地址(0x40007400)
7 E7 ^  g6 S; J' Y. e& t
41.jpg
1 f7 I; ^, `! I: L1 q执行完语句之后:由于传递的参数是#define DAC_ALIGN_12B_R    ((uint32_t)0x00000000)
3 P/ |$ X5 E# A$ F; ~
42.jpg
) ?! B0 |6 O7 D1 J4 m# |得到的结果是(注意上图中虽然断点停在了DAC_DHR12R2_ALIGNMENT处,但是程序是DAC_CHANNEL_1,所以最终执行的还是下面的语句)
! ~8 Q4 v2 W9 U) e" r2 L
43.jpg
# ?1 q4 r6 O1 c; C: H$ V" _所以最终产生的效果就是:
4 z6 c' c/ F/ f. h8 t
44.jpg - T4 ]& Q+ K* a3 V
地址为0x40007408的寄存器赋值,即下面寄存器赋值:
9 d4 y" H# Z, o. D1 G, Y
45.jpg ) a2 u6 d" a* d4 T
但是这寄存器的作用是什么呢?holding data?
; m, s) E. m9 r! nHolding data寄存器,可以简单的理解为:' U1 z" R7 H7 w1 m% C" W2 D2 P  `
设置影响DAC的直流分量(直流分量还是根据下面的公式计算出来的):& n4 s9 e# W- {( V5 y
46.jpg
& |+ l; m* y/ M# _8 o; @' V1 c当传递的参数设置为0是,DACoutput即三角波的最低电平为0:/ q* R6 D+ I+ d  L
当传递的参数设置为2047,DACoutput即三角波的最低电平为1.65V4 Y* F) D/ k: _  n# E) {
47.jpg - u; X0 w; K# _# w* U" |
如果传递的参数设置为1024,DACoutput即三角波的最低电平为0.82V;
  {( o6 Z: s/ f* w3 s. `0 g+ W( J7 T
48.jpg . `* D+ o) n8 h5 w+ Q
如果传递的参数设置为3000,DACoutput即三角波的最低电平为2.42V;
" ?6 O% X( X& u# N2 @$ r
49.jpg 2 N4 ?6 d% Y# N/ c2 ]- I
50.jpg
) H+ ?: ^& ?* a! W( g5、噪声产生器6 y  i- T: I4 C
主要函数的代码如下:
! {: B3 E& L6 ]4 W; |7 C" t: N4 T$ [+ q, b- ?7 ?4 Y) I' y
51.jpg 1 T8 F, P9 W" {8 W
52.jpg
5 L, |. X5 B  z. ~# |% z; Z0 |% X4 P8 ^8 u' h  Z0 c
由于一般的认为噪声是随机性的,所以可以认为只是修改幅值,对于其周期不可控
* `, B. w3 ]  W. D3 n$ E, V" Z: V1 s$ ?2 u& h  J

! a4 K" g% e# x3 L0 b0 X1 v1 Z& ]) f7 X& c: u7 f
文档下载地址:
) }2 V* z/ {- I8 n0 J: p5 V3 L! ^https://www.stmcu.org.cn/document/detail/index/id-217139
& G) C) R9 y' _/ q  L8 F3 K9 b$ u
实战经验汇总:% V5 z! s& i: ^. l
https://www.stmcu.org.cn/module/forum/thread-576401-1-1.html; s3 D) w- ~# W' p/ }5 @# U6 s

' R0 u0 l+ L3 {$ c( s) [/ i
赞 收藏 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版