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

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

[复制链接]
STMCU小助手 发布时间:2022-3-20 13:20
在DAC的主要特征中可以看出,DAC内部还带有波形发生器。

DAC 主要特征
2个DAC转换器:每个转换器对应1个输出通道
8位或者12位单调输出
12位模式下数据左对齐或者右对齐
同步更新功能
噪声波形生成
三角波形生成
双DAC通道同时或者分别转换
每个通道都有DMA功能
外部触发转换
输入参考电压V REF+
  比如我们要输出一个三角波,就不需要自己去计算三角波每个点的电压是多少,通过内部自带的三角波发生器,就可以产生三角波。具体的操作步骤在官方文档中也有介绍。

三角波生成
  可以在DC或者缓慢变化的信号上加上一个小幅度的三角波。设置WAVEx[1:0]位为’10’选择DAC的三角波生成功能。设置DAC_CR寄存器的MAMPx[3:0]位来选择三角波的幅度。内部的三角波计数器每次触发事件之后3个APB1时钟周期后累加1。计数器的值与DAC_DHRx寄存器的数值
相加并丢弃溢出位后写入DAC_DORx寄存器。在传入DAC_DORx寄存器的数值小于MAMP[3:0]
位定义的最大幅度时,三角波计数器逐步累加。一旦达到设置的最大幅度,则计数器开始递
减,达到0后再开始累加,周而复始。将WAVEx[1:0]位置’0’可以复位三角波的生成。

EH[5~112BN2N)K8C42)X@IP.png


注意:

为了产生三角波,必须使能 DAC 触发,即设 DAC_CR 寄存器的 TENx 位为 ’1’ 。
MAMP[3:0] 位必须在使能 DAC 之前设置,否则其值不能修改
下面通过代码来设置DAC输出三角波

  1. #include "dac_wave.h"

  2. //通过DAC通道1和通道2输出三角波
  3. void DAC_Wave_Init(void)
  4. {
  5.     GPIO_InitTypeDef GPIO_InitStructure;
  6.     DAC_InitTypeDef            DAC_InitStructure;
  7.     TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;

  8.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  9.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  10.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  11.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;
  12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  14.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  15.     TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  16.     TIM_TimeBaseStructure.TIM_Period = 0x0F;
  17.     TIM_TimeBaseStructure.TIM_Prescaler = 0x01;
  18.     TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  19.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  20.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  21.     TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

  22.     DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
  23.     DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;
  24.     DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;
  25.     DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  26.     DAC_Init(DAC_Channel_1, &DAC_InitStructure);

  27.     DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_2047;
  28.     DAC_Init(DAC_Channel_2, &DAC_InitStructure);

  29.     DAC_Cmd(DAC_Channel_1, ENABLE);
  30.     DAC_Cmd(DAC_Channel_2, ENABLE);

  31.     DAC_SetDualChannelData(DAC_Align_12b_R, 0, 0);

  32.     TIM_Cmd(TIM2, ENABLE);
  33. }
复制代码


  将DAC的通道1和通道2都开启,要自动输出三角波,这时候就不能使用软件自己去触发了,在这里要借助定时器来自动触发,当定时器定时时间到了之后,就会触发一次DAC的输出,这里使用的是定时器2触发,所以初始化DAC的时候。也要初始化定时器2,接下里初始化DAC,设置DAC的触发方式为定时器2触发,然后选择三角波发生器,接下来设置通道1三角波的幅度最大值为4095。也就是输出的三角波最大电压值为3.3V。设置通道2的三角波最大幅值为2047,也就是通道2的最大值为通道1的一半1.65V。最后使能DAC输出。这是三角波就会的PA4和PA5引脚上自动输出了。通过示波器就能看到这两个引脚上的波形了。


收藏 评论0 发布时间:2022-3-20 13:20

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版