在DAC的主要特征中可以看出,DAC内部还带有波形发生器。5 B. P. I2 k' s0 q T* m
& h7 C9 P$ }& U w# o2 v. \
DAC 主要特征' C' e/ e. f7 d8 S2 x% s: h0 T7 Q
2个DAC转换器:每个转换器对应1个输出通道
7 ] u6 _! p/ i2 E" M7 S2 j! X8位或者12位单调输出. Q( k+ T8 X3 l
12位模式下数据左对齐或者右对齐
; l) u6 W9 p! `$ L同步更新功能
; n( Z% j! ~6 j9 A% k W" a噪声波形生成3 U/ h6 F- f9 c2 \4 H
三角波形生成
. v. C4 A9 K. M& Q* J% m8 |. P/ |双DAC通道同时或者分别转换
! v2 i% C; r1 G3 h每个通道都有DMA功能 v; t! r- p4 r" W
外部触发转换1 X I; P( Y* t" Y: w$ p
输入参考电压V REF+! @# G& E5 ~3 Y! M
比如我们要输出一个三角波,就不需要自己去计算三角波每个点的电压是多少,通过内部自带的三角波发生器,就可以产生三角波。具体的操作步骤在官方文档中也有介绍。
! _# X; t. V9 K0 K& l' F( }) w' Y ^9 z7 w* x0 Z( ?2 w2 r
三角波生成& X/ J+ p2 \: G9 U! z3 n
可以在DC或者缓慢变化的信号上加上一个小幅度的三角波。设置WAVEx[1:0]位为’10’选择DAC的三角波生成功能。设置DAC_CR寄存器的MAMPx[3:0]位来选择三角波的幅度。内部的三角波计数器每次触发事件之后3个APB1时钟周期后累加1。计数器的值与DAC_DHRx寄存器的数值
# u9 V& `' K' C相加并丢弃溢出位后写入DAC_DORx寄存器。在传入DAC_DORx寄存器的数值小于MAMP[3:0]
) i1 \3 w z4 r; n' I- k- e位定义的最大幅度时,三角波计数器逐步累加。一旦达到设置的最大幅度,则计数器开始递
% c8 t" u8 ]1 T5 W: o2 p* {8 U减,达到0后再开始累加,周而复始。将WAVEx[1:0]位置’0’可以复位三角波的生成。8 G# u) x- _9 l/ n T
7 Y& s f; r' G+ C6 k3 i
6 C1 W4 n4 \3 S. q6 T% C% k
7 b L! T& B* H6 z4 C' ]( J9 A, C$ j: V0 e ?
注意:9 c+ ]! r8 N2 i+ k
" D7 {$ c+ b; T P9 s5 a7 ]( u/ |
为了产生三角波,必须使能 DAC 触发,即设 DAC_CR 寄存器的 TENx 位为 ’1’ 。
0 z. Y9 S: X2 qMAMP[3:0] 位必须在使能 DAC 之前设置,否则其值不能修改
6 t8 A- U% ?2 x( K3 H下面通过代码来设置DAC输出三角波/ B7 m w, K+ r9 q- x- q* d+ ]
4 X6 h/ ^) D+ }* Y9 X- z7 b- #include "dac_wave.h"
2 y3 s K1 \* K2 B* I$ C9 C2 ~4 l9 ] - + F3 W, a2 a L& f M% a
- //通过DAC通道1和通道2输出三角波* w3 x+ L. [) c
- void DAC_Wave_Init(void)
' w/ s% E4 R- c7 f7 Q - {6 m) q4 n+ ]$ d" Z/ N& ~) c! n8 S
- GPIO_InitTypeDef GPIO_InitStructure;5 g9 ^! T' K% B' J R# K7 w% [
- DAC_InitTypeDef DAC_InitStructure;
5 q# V, ]. q7 G - TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;6 ?* H4 [* ~. `# e% z
- 5 c9 D, h# ^; J8 e
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);5 Y0 z$ Q/ H, z1 e: c# A$ H( [
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);' _- ^6 }) H- f8 x
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
$ F* z$ t& Q/ [5 L" Q: X8 V
' y }) S) t- j( O4 C- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;$ y* F4 W' x3 F J7 O# W4 Q; f. O
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;4 i* _7 {% u& Y+ r& ^
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
5 b3 M5 K& d; K8 b7 G - GPIO_Init(GPIOA, &GPIO_InitStructure);
* H/ E T# Z4 i" N( A' d& N+ R) z
1 h" u2 V# r/ N+ a+ H- TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
- F: ^1 M9 n" \ - TIM_TimeBaseStructure.TIM_Period = 0x0F;7 G; { ^* \5 ~% R! x8 A- w
- TIM_TimeBaseStructure.TIM_Prescaler = 0x01;
4 N o# r u' }/ k - TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;6 ^ o- `& `2 \& d6 v4 X
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;$ h# d" ?: k' h+ r7 f6 a6 I
- TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
* p; B8 J/ [) u9 B5 H; G( r2 B7 Z - . ~) C3 ? ]! {7 Q' N
- TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
5 H: v) X& ]6 F3 H. o# ^/ D% {
5 x* r' x! X8 r; h z" [( g- DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
4 b5 \& H* }! R" O - DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;/ N: C4 u& K5 c) K$ g3 L: o
- DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;9 V5 k7 H; U% _$ w
- DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
% K: e, t, g* }$ Q - DAC_Init(DAC_Channel_1, &DAC_InitStructure);0 \( S$ e" X$ [* A2 @2 o
- ~# s+ F6 d8 {) G5 N' ]% W2 f- DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_2047;/ g; k+ R- m" b5 ~7 Y7 ~# \: B
- DAC_Init(DAC_Channel_2, &DAC_InitStructure);' p9 d! m; T% @; A
, y, z) Y3 @5 S5 H- DAC_Cmd(DAC_Channel_1, ENABLE);
, x+ Z( [ p$ \5 \" A$ Q - DAC_Cmd(DAC_Channel_2, ENABLE);
2 ?5 c0 ^& F+ d( e - ' [% y0 N! S; U7 Q$ h. a$ b5 s9 o( M
- DAC_SetDualChannelData(DAC_Align_12b_R, 0, 0);# i5 _2 `( G; O6 @6 c
U) D# v$ W' a# w- TIM_Cmd(TIM2, ENABLE);" v: }$ i7 X+ e% d# m
- }
复制代码 3 d/ F( t) J) V/ s/ ]% H
9 G+ n8 ]! b$ X
将DAC的通道1和通道2都开启,要自动输出三角波,这时候就不能使用软件自己去触发了,在这里要借助定时器来自动触发,当定时器定时时间到了之后,就会触发一次DAC的输出,这里使用的是定时器2触发,所以初始化DAC的时候。也要初始化定时器2,接下里初始化DAC,设置DAC的触发方式为定时器2触发,然后选择三角波发生器,接下来设置通道1三角波的幅度最大值为4095。也就是输出的三角波最大电压值为3.3V。设置通道2的三角波最大幅值为2047,也就是通道2的最大值为通道1的一半1.65V。最后使能DAC输出。这是三角波就会的PA4和PA5引脚上自动输出了。通过示波器就能看到这两个引脚上的波形了。
% Y; H, G& g& }6 f2 j p! m7 b5 n: G7 j# Z) d1 {# `0 q
0 b/ x0 Y7 p; p8 R W9 q |