采用定时器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
|