一.DAC介绍. q" g) W5 N5 q6 g
ADC是模数转换器,可以将模拟电压转换位数字信号;DAC是数模转换器,可以将数字信号转换为模拟电压。
. v$ O/ i+ S$ t! G9 l0 \6 QSTM32F103ZET6内部DAC有2个通道,12位数字输入(也可以配置为8位),可以按要求输出不同的信号波形,其主要特点如下:
* W* g. i* t ] {6 l2个DAC转换通道( F0 w0 ]7 ?: h W
每个通道都有DMA功能
( P' T3 t0 o ^( V2个通道可以同时转换或者分别转换
5 ~4 P8 O+ ]1 _% R! V9 o# ~' Q输入信号可以是12位或8位
, k3 | H2 y* y( a$ ?12位输入模式分为:右对齐、左对齐 H9 z9 t8 J" F# u! B
有同步更新功能
' T# \5 ~- B, }" e- i0 [可以生成噪声波形2 W1 K9 Q& e" M# W$ ]6 P2 b5 ?# L
可以生成三角波形5 J0 w4 b0 x1 B+ O+ q
0 }7 U; b6 _% O, [/ i' ?' T
. x' q+ X* G1 ^9 v, V7 D! Q# B
DAC框图如下:
" K# V+ a9 f' ^3 Z) o: L6 Z2 J- S2 X" h4 h
6 O& Y' b; J' e" |- i
: s( U5 ]! A9 s+ I/ V" R# a6 V6 _! a, w. {* M5 [
2 X- u2 }0 e. E: w6 S7 d. h二.主要寄存器说明
# `4 ]- s9 B( G一般使用DAC情况不多,而且使用也就是单纯输出电压,基本用不到STM32输出一些特殊的波形,所以了解一下基本的寄存器就可以配饰DAC了。
- |) r" F% P a, g6 r
& P# x% }7 `1 Z6 M6 U0 S! S( K, ~1 }: h. [6 r
DAC 输出是受 DORx 寄存器直接控制的,但是不能直接往 DORx寄存器写入数据,而是通过 DHRx 间接的传给 DORx 寄存器,实现对 DAC 输出的控制。8 k7 e" O+ O0 A0 F5 |1 }
比如通道1的12位右对齐数据保持寄存器:% X% N' D' d* H0 m7 L+ D
P4 Q; A6 i. s# e7 w6 E1 m$ u+ B4 M" B! u3 s5 M
+ l( ^: U( H# K0 ~
D' c/ p* L* k' E& k5 O
( t9 d6 E0 Z! r
控制DAC的就是DAC控制寄存器了:' I( ~3 C) t* X" Q4 l
- E: R& A: v7 V% E
# F6 ?/ j5 q, K9 l0 M
& b. r6 y i: J/ L, d
0 k+ u ]2 ^, |8 ?
! N4 q7 y! l1 Z+ y/ X* S+ B+ p$ t1 v+ f
这种东西,现在查一下参考手册就可以很快掌握。
7 Z+ G+ W5 p9 m# O* Z! O5 o& K, d/ b$ C; I
三.代码及配置
# C+ z0 @% f5 f$ U+ ]PA4开始设置为模拟输入是为了防止信号干扰,在使能DAC后,PA4会自动与DAC模拟输出相连,所以不必担心。
& Y" m5 D0 Z% F) U. I7 o7 Y- /* DAC1 PA4 模拟输入 12位右对齐 参考电压3.3V */& O/ J" o, B7 x) l; M8 C% ^
- void DAC1_Init( void )
( e4 Y9 w3 ~% X: D6 x4 M- \8 K - {
r. U6 h* Q0 Z" y$ D7 _ - GPIO_InitTypeDef GPIO_InitStruct;; f+ b$ q6 k$ E+ c4 Y v; q
- DAC_InitTypeDef DAC_InitStruct;% C t9 \1 \4 `3 M# k
-
5 Z) f" z) D; K - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
/ m6 J3 ]* O6 u* @* S# B8 h - RCC_APB1PeriphClockCmd( RCC_APB1Periph_DAC, ENABLE );
w- N$ U6 ]: F6 g: n3 ]9 e -
" ~2 F, n. d; D - GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//GPIO引脚模式:模拟输入& b. n' N: G6 D1 {& ?" t: b
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;8 h, D" k8 [, ], E0 }6 N- [
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
7 Z l6 C% A3 X7 j" j - GPIO_Init( GPIOA, &GPIO_InitStruct );
, I% _( B- j$ A - GPIO_SetBits( GPIOA, GPIO_Pin_4 );. |6 H4 r# B. L
- 5 a. G* K# T( {# X U; A
- DAC_InitStruct.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;//只有波形发生时才使用
: @% P' M* j4 t. x - DAC_InitStruct.DAC_OutputBuffer = DAC_OutputBuffer_Disable;//不使用输出缓存# i8 V- }1 I" c" l, X8 H8 K
- DAC_InitStruct.DAC_Trigger = DAC_Trigger_None;//不触发
- e1 C) f* f; b6 [0 q& f - DAC_InitStruct.DAC_WaveGeneration = DAC_WaveGeneration_None;//不使用波形发生6 U/ R7 w, M2 y8 M% O7 W; b9 W8 [
- DAC_Init( DAC_Channel_1, &DAC_InitStruct );' q( B& ]- L9 A; c N
-
1 u/ o" q: d }% V3 [ - DAC_Cmd( DAC_Channel_1, ENABLE );# O3 r( u4 E0 z4 I, F
- DAC_SetChannel1Data( DAC_Align_12b_R, 0 );
8 @1 E! `, Y9 \+ c4 `/ N! H! z) h/ j - }
0 @+ B1 N" L5 L/ _* n: e" A# _ - " l0 r R. s* P
- 6 l0 k( t( T. u! U0 Q
- /* 参考电压3.3V 12位分辨率:0~4095 vol代表输出电压的100倍:0~330 */# J+ C2 }9 s( y5 F
- void Set_DAC_Vol( uint16_t vol )
! h' U5 A, O' K$ P8 F! y% u6 g - {
6 f, i6 a9 K, L% A - uint16_t x;
E$ j; V/ K) C -
3 e, I* _* G4 V" ] - x = (uint16_t)4096*(vol/330);
* D( Q# ~% R o: w - DAC_SetChannel1Data( DAC_Align_12b_R, x );
# }" B6 r1 {1 {9 M0 w5 v# B - }; U0 V0 C/ O0 v4 v9 C5 Z
- , J. }) @2 z% P+ c2 s
/ o0 l: b. Z/ Y) V. c
复制代码 9 z! }$ s) k# T, M9 @& l- C& E
————————————————; T0 g. c6 I9 _: @. {4 r4 _- t8 R. C
版权声明:Aspirant-GQ9 S9 O6 R" n# X5 @' a U( Z
如有侵权请联系删除
) L2 L6 b8 E& U" z2 M# ]7 ]5 X
9 P% z. Q$ }9 k& I, Q" m# T: e* e* b- Y
|