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

【经验分享】STM32F103使用DAC功能输出三角波

[复制链接]
STMCU小助手 发布时间:2022-3-20 13:20
在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 EH[5~112BN2N)K8C42)X@IP.png
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
  1. #include "dac_wave.h"
    2 y3 s  K1 \* K2 B* I$ C9 C2 ~4 l9 ]
  2. + F3 W, a2 a  L& f  M% a
  3. //通过DAC通道1和通道2输出三角波* w3 x+ L. [) c
  4. void DAC_Wave_Init(void)
    ' w/ s% E4 R- c7 f7 Q
  5. {6 m) q4 n+ ]$ d" Z/ N& ~) c! n8 S
  6.     GPIO_InitTypeDef GPIO_InitStructure;5 g9 ^! T' K% B' J  R# K7 w% [
  7.     DAC_InitTypeDef            DAC_InitStructure;
    5 q# V, ]. q7 G
  8.     TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;6 ?* H4 [* ~. `# e% z
  9. 5 c9 D, h# ^; J8 e
  10.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);5 Y0 z$ Q/ H, z1 e: c# A$ H( [
  11.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);' _- ^6 }) H- f8 x
  12.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    $ F* z$ t& Q/ [5 L" Q: X8 V

  13. ' y  }) S) t- j( O4 C
  14.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;$ y* F4 W' x3 F  J7 O# W4 Q; f. O
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;4 i* _7 {% u& Y+ r& ^
  16.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    5 b3 M5 K& d; K8 b7 G
  17.     GPIO_Init(GPIOA, &GPIO_InitStructure);
    * H/ E  T# Z4 i" N( A' d& N+ R) z

  18. 1 h" u2 V# r/ N+ a+ H
  19.     TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    - F: ^1 M9 n" \
  20.     TIM_TimeBaseStructure.TIM_Period = 0x0F;7 G; {  ^* \5 ~% R! x8 A- w
  21.     TIM_TimeBaseStructure.TIM_Prescaler = 0x01;
    4 N  o# r  u' }/ k
  22.     TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;6 ^  o- `& `2 \& d6 v4 X
  23.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;$ h# d" ?: k' h+ r7 f6 a6 I
  24.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    * p; B8 J/ [) u9 B5 H; G( r2 B7 Z
  25. . ~) C3 ?  ]! {7 Q' N
  26.     TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
    5 H: v) X& ]6 F3 H. o# ^/ D% {

  27. 5 x* r' x! X8 r; h  z" [( g
  28.     DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
    4 b5 \& H* }! R" O
  29.     DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;/ N: C4 u& K5 c) K$ g3 L: o
  30.     DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;9 V5 k7 H; U% _$ w
  31.     DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
    % K: e, t, g* }$ Q
  32.     DAC_Init(DAC_Channel_1, &DAC_InitStructure);0 \( S$ e" X$ [* A2 @2 o

  33. - ~# s+ F6 d8 {) G5 N' ]% W2 f
  34.     DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_2047;/ g; k+ R- m" b5 ~7 Y7 ~# \: B
  35.     DAC_Init(DAC_Channel_2, &DAC_InitStructure);' p9 d! m; T% @; A

  36. , y, z) Y3 @5 S5 H
  37.     DAC_Cmd(DAC_Channel_1, ENABLE);
    , x+ Z( [  p$ \5 \" A$ Q
  38.     DAC_Cmd(DAC_Channel_2, ENABLE);
    2 ?5 c0 ^& F+ d( e
  39. ' [% y0 N! S; U7 Q$ h. a$ b5 s9 o( M
  40.     DAC_SetDualChannelData(DAC_Align_12b_R, 0, 0);# i5 _2 `( G; O6 @6 c

  41.   U) D# v$ W' a# w
  42.     TIM_Cmd(TIM2, ENABLE);" v: }$ i7 X+ e% d# m
  43. }
复制代码
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
赞 收藏 评论0 发布时间:2022-3-20 13:20

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版