STM32F103使用DAC功能输出三角波

在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’可以复位三角波的生成。

image.png
image.png

注意

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

下面通过代码来设置DAC输出三角波

#include "dac_wave.h"

//通过DAC通道1和通道2输出三角波
void DAC_Wave_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    DAC_InitTypeDef            DAC_InitStructure;
    TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

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

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 0x0F;
    TIM_TimeBaseStructure.TIM_Prescaler = 0x01;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);

    DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle;
    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095;
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);

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

    DAC_Cmd(DAC_Channel_1, ENABLE);
    DAC_Cmd(DAC_Channel_2, ENABLE);

    DAC_SetDualChannelData(DAC_Align_12b_R, 0, 0);

    TIM_Cmd(TIM2, ENABLE);
}

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

STM32 DAC(数字模拟转换器)可以用来生成三角波信号,通常需要配合软件编程来实现。以下是基本步骤: 1. **初始化DAC**:首先,在程序开始时,你需要配置STM32DAC模块,包括选择适当的通道(例如DMA支持)、设置数据精度、时钟源等。 ```c HAL_DAC_Init(&hdac); HAL_DAC_MspInit(&hdac); ``` 2. **设置模式**:如果你打算生成三角波,通常会使用线性递增模式(DAC_MODE_LINEAR),而不是常规的电压输出模式(DAC_MODE_VOLTAGE_OUT)。 ```c HAL_DAC_SetOutputBuffer(&hdac, DAC_OUTPUT_BUFFER_ENABLE); HAL_DAC_SetMode(&hdac, DAC_MODE_LINEAR); ``` 3. **设置序列**:三角波通常是通过对时间内的电压值变化进行计算得到的,你可以创建一个数组存储每个时隙对应的电压值,然后通过`HAL_DAC_Transmit`函数发送到DAC。 4. **生成三角波**:创建一个变量作为当前的电压值,并在循环中逐步增加这个值,直到达到最大值后减小回到最小值,如此往复形成三角波。 ```c for (int i = 0; i <= dac_max_voltage; i += dac_increment) { dac_buffer[current_index] = i; current_index = (current_index + 1) % dac_buffer_size; HAL_Delay(1); // 调整速度可以根据需求调整延时 HAL_DAC_Transmit(&hdac, dac_buffer, dac_buffer_size, DAC_DELAY_NONE); } ``` 5. **处理中断**:如果你希望连续输出三角波,可以考虑启用DMA传输并处理中断以保持数据的实时更新。 注意,以上代码示例简化了实际过程,具体实现可能会因所使用的库(如STM32CubeMX生成的驱动代码)而有所不同。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值