打印
[应用相关]

STM32单片机用定时器触发DAC输出三角波并通过串口观察波形的方法

[复制链接]
30|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
磨砂|  楼主 | 2025-1-12 12:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
      采用定时器TIM3的TRGO信号作为DAC1的触发信号,DAC1在触发信号驱动下输出三角波。通过或示波器观察三角波的波形。

        使用的硬件开发板及其它资源,可以参考本文作者的文章:细说STM32单片机DAC基础及软件启动DAC触发并通过串口观察数据的方法-CSDN博客  https://wenchm.blog.csdn.net/article/details/144127805。

一、 工程配置
1、时钟、DEBUG、USART2、Project Manager Code Generater
        与参考文章相同。

2、DAC1
(1)Mode
        DAC1有2个通道:out1 mode、out2 mode,☐External Trigger。

out1 mode,选择Connected to external pin only;
out2 mode,Disable;
External Trigger,不选择;
(2) DAC out1 Settings
Mode selected:Normal;
Output Buffer:Enable;设置是否使用输出缓冲器。如果使用输出缓冲器,可以降低输出阻抗并提高输出的负载能力。默认设置为Enable。
DAC High Frequency:Automatic;
DMA Double Data:Disable;
Signed Format:Disable;
Trigger:Timer3 Trigger out event;使用定时器TIM3的TRGO信号作为DAC1触发信号源。
Trigger2:None;
Wave Generation Mode:Triangle wave generation;
Maximum Triangle Amplitude:4095;三角波最大幅值是由4位二进制表示的参数,表示1~4095内某个固定的参数值,如1、3、7、127、511、2047、4095等,这里设置为4095。
User Trimming:Factory Trimming;



3、TIM3
TIM3 Mode:Internal Clock;
Prescaler:1700;
Counter Mode:Up;
Period:9;
auto_reload:Enable;
TRGO:Update Event;



        APB总线定时器时钟频率为170MHz,1700分频后计数器时钟信号是100kHz,CounterPeriod(计数器周期)设置为9,所以TIM3的定时周期是0.1ms。设置三角波的最大幅度为4095,DAC1在每次触发时,使三角波幅度值加1(上行程)或减1(下行程),所以一个三角波的周期是819ms。如果需要调整三角波的频率,就调整定时器TIM3的预分频系数或计数器周期值。

4、NVIC
调整TimeBase的优先级为0;
开启定时器TIM3的满溢中断,抢占式优先级为1;
        设置TIM3的满溢中断,目的是当中断发生时,读取DAC数据,并通过串口发送到串口助手。

二、软件设计
        只需设计main.c。

/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
uint32_t DCValue=0;        //12bits,DC component,0V
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim3);                //Start TIM3 and trigger DAC1 to periodically output DAC value.

  HAL_DACEx_TriangleWaveGenerate(&hdac1, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_4095);
  HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);//start DAC1
  HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DCValue);  // set to output DAC value

/* USER CODE END 2 */
        在外设初始化部分,函数MX_DAC_Init()进行DAC的初始化,其内部会调用生成三角波的函数HAL_DACEx_TriangleWaveGenerate()。

        在完成各种初始化后,用函数HAL_DAC_Start()启动DAC1,再调用HAL_DAC_SetValue()设置DAC1输出值为0,也就是设置数据保持寄存器DHR1的值为0,三角波的数据会和寄存器DHR1里的值叠加后移送到数据输出寄存器DOR1。

        接下来,启动定时器TIM3。如果TIM3发生UEV事件,就会触发DAC1,三角波计数器的值会在每次触发时加1(上行程)或减1(下行程),然后和数据保持寄存器DHR1的值叠加后移送到数据输出寄存器DOR1。

        调用产生三角波的函数HAL_DACEx_TriangleWaveGenerate(),这个函数的功能就是配置内部的三角波计数器,从而在触发信号驱动下产生三角波数据。

        TIM3用于周期性地触发DAC1进行DAC转换。TIM3每0.1ms产生一次定时溢出,也就是产生一次UEV信号,TRGO信号的来源设置为UEV信号。

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        DCValue = HAL_DAC_GetValue(&hdac1, DAC_CHANNEL_1);
          printf("DAC1 value = %ld\r\n",DCValue);
}

//串口打印
int __io_putchar(int ch)
{
        HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 0xFFFF);
        return ch;
}
/* USER CODE END 4 */
三、下载运行
1、串口助手收到的一段三角波数据



2、示波器显示的三角波
        无须对任何中断进行处理,构建项目后,将其下载到开发板上加以测试。使用示波器观察PA4引脚的输出,可以看到三角波信号,三角波信号周期大约为800ms。在使用DAC输出波形时,DAC触发的周期不能太长,否则输出的模拟信号容易出现失真。



————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/wenchm/article/details/144213359

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

4182

帖子

2

粉丝