目录
一、参考工程
二、仅提供不同的配置
1、用定时器控制DAC输出
2、配置定时器参数
三、代码修改
四、 运行并观察显示效果
一、参考工程
本工程依赖作者的文章:细说MCU用单路DAC模块设计和输出锯齿波的实现方法-CSDN博客 https://wenchm.blog.csdn.net/article/details/140570606http://xn--https-rfa//wenchm.blog.csdn.net/article/details/140570606
工程的配置基本上与参考文章一模一样。
二、仅提供不同的配置
1、用定时器控制DAC输出
参考例子中是在while(1)循环中实现了DAC的输出,并且让DAC输出信号幅值逐步变化。参考例子中对DAC的配置与使用是比较方便的。硬件配置完成后,在代码中实要做的只有两步:一是用库函数HAL_DAC_Start()启动DAC,二是用函数HAL_DACValue()给DAC的数据寄存器赋值。
本例依然是在初始化阶段启动DAC,即函数HAL_DAC_Start()放置的位置不变,而将给DAC的数据寄存器赋值的语句放置到定时器的中断中,从而实现用定时器中断控制DAC的输出频率。
2、配置定时器参数
配置TIM3,选择为Internal Clock;
配置预分频因子(Prescaler)设置为169,计数器周期数配置为9。系统时钟为170MHz时,计数器的计数周期为(169+1)(9+1)/(170*10^6)=10us,对应的频率为0.1MHz。
使能TIM3的中断,优先级设置为0;
三、代码修改
/* USER CODE BEGIN PV */
uint16_t DACIndex = 0;
/* USER CODE END PV */
/* USER CODE BEGIN 2 */HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);HAL_TIM_Base_Start_IT(&htim3);/* USER CODE END 2 */
然后定义回调函数:
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim == (&htim3)){DACIndex ++;if(DACIndex == 4096)DACIndex = 0;HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,DACIndex);}
}
/* USER CODE END 4 */
实际就是将参考例子中位于while(1)中的代码完整地移植到了TIM3的回调函数中来。
四、 运行并观察显示效果
通过示波器测量PA4引脚上的电压,将会得到一个锯齿波,频率约为24.39 Hz(0.1MHz/4096)。
本例子中,用定时器得到了一个周期性变化的锯齿波,可以通过调整定时器的参数来皮形的周期。当然,输出波形的周期也可以通过控制DAC数据寄存器数值的更新步长变。譬如,在上面的例子中,每次发生定时器中断,让DACIndex加1,也就是说,要4095断后才能进入下一个周期。如果要修改输出信号频率,可以调整DACIndex增加的数值每次中断让DACIndex加2,输出频率就会增加一倍。