前言

DAC代表数字到模拟转换器,顾名思义,它将数字信号转换为模拟形式。介绍一些在STM32中工作的基本DAC。我将使用带有CubeIDE的STM32F103rct6
如下图所示,DAC接受三种整数格式的数据:8位(数据保持寄存器的LS字节)、12位右对齐(数据保持寄存器的12位LS位)和12位左对齐(数据保持寄存器的12位MS位)。在本教程中,我将使用 12 位右对齐数据格式。
在这里插入图片描述
这里主要讲生成正弦波。

本文代码文件


一、cubemx配置

打开以后触发方式我们选择使用定时器来触发,这样不用cpu参与

在这里插入图片描述
我们还需要开启dma,dma要是循环模式而且大小要选择为word
在这里插入图片描述
定时器的配置,定时器不需要开启中断哈!
在这里插入图片描述
在我的例子中,计时器 2 时钟是 72MHz,这就是将自动重装载的值设定为72-1。时钟将除以该值,得到总共 1 MHz 的频率。这是TIMER 2现在的频率。正弦波频率还取决于我们要采集的样本数量。我稍后会解释这一点。

1M是DAC的最大更新速度,DAC从一个电压变成另外一个电压最大速度为1M,也就是1us。
在这里插入图片描述
但是可以超频

二、代码编写

1.变量和函数

uint32_t sine_val[100];

#define PI 3.1415926
void calcsin ()
{
	for (int i=0; i<100; i++)
	{
		sine_val[i] = ((sin(i*2*PI/100) + 1)*(4096/2));
	}
}

请添加图片描述
在这里插入图片描述
我们案例中的计时器频率是 1000000Hz,我们在这里采集 100 个样本。因此,正弦波的频率将为 1000000/100 = 1 KHz。

2.主函数

	HAL_TIM_Base_Start(&htim2);
	calcsin();
	HAL_DAC_Start_DMA(&hdac, DAC1_CHANNEL_1, sine_val, 100, DAC_ALIGN_12B_R);

三、频率修改函数

__HAL_TIM_SET_PRESCALER()
__HAL_TIM_SET_PRESCALER(&htim2, 72-1);

该宏用于设置定时器的预分频值。该值定义了计数器时钟的频率。计数器时钟频率(CK_CNT)等于时钟频率(fCK_PSC)除以预分频器加1的值(PSC[15:0] + 1)。

__HAL_TIM_SET_AUTORELOAD();
__HAL_TIM_SET_AUTORELOAD(&htim2, 1000-1);

该宏用于设置定时器的自动重装载值。在向上计数模式中,当计数器值等于该值时,定时器会产生一个更新事件并重新开始计数。


总结

可参考的文章
STM32cubemx教程 DAC+TIM+DMA
DAC in STM32

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐