目录
一、STM32G474RE的DAC模块
有些MCU本身就带有数/模转换器(Digital to Analog Converter,DAC)模块,使DAC模块就可以产生模拟信号。STM32G474RE就有两个可以引出到外部的12位DAC:DAC1和DAC2(STM32G474RE的另外两个DAC模块DAC3、DAC4无法直接从GPIO输|):其中,DAC1有两个输出通道,DAC2有一个。所以,在STM32G474RE的DAC中,总共三路模拟信号可以直接从GPIO引出。STM32G474RE上的三路DAC对应的引脚如下:
DAC1_OUT1——PA4
DAC1_OUT2——PA5
DAC2_OUT1——PA6
另外,这三路DAC均有输出缓冲。所谓缓冲,是指信号经过运算放大器(运放)电路送。在STM32G474RE中,该运放集成在MCU内部。在进行参数配置时,可以选择是否使该缓冲电路。
DAC模块从MCU引脚上最终输出的电压(VDAC),与输入到它的数据输出寄存器中的数值有关。由于STM32G474RE中的DAC为12位,也就是说,当数据寄存器中的值为4095时,DAC会输出最大电压值,但这个最大值具体是几伏,还与MCU的参考电压(VREF)有关。具体公式如下:
式中,DOR是DAC数据输出寄存器(data output register)中的数值。理想情况下,DAC的输出电压在0~VRF之间。不过,如果开启了DAC的缓冲(Buffer),输出的电压最小值不会为0,最大值也不会是VREF,而是会在0.2 V~VREF-0.2 V之间。VREF是参考电压,它在MCU上专门有一个外部引脚;在NUCLEO-G474RE板上,该引脚连到了电源电压上,理论值是3.3 V。所以,当给DAC的数据寄存器写入4095时,DAC的输出电压会接近3.3 V。
二、配置
1.配置DAC
选择DAC1,OUT1模式(OUT1 mode)选择Connected to external pin only,也就是DAC1的输出通道1连接到外部引脚,该引脚为PA4;其他参数,均可暂时持默认值。
2.选择时钟源和Debug
将高速时钟(HSE)设置为Crystal/eramic Resonator,使用片外时钟晶体作为HSE的时钟源。最后,在SYS中将Debug设置Serial Wire。
NVIC中把tick timer的抢占式优先级设为0。
3.配置系统时钟
系统时钟(SYSCLK)频率配置为170 MHz。
三、代码修改
在main函数的初始化阶段,除了使用代码自动生成的函数MX_DAC1_Init()对DAC模块的基本参数进行初始化之外,还需要添加启动DAC的语句。
1.启动DAC
专门有一个库函数HAL_DAC_Start()实现启动DAC模块的功能,可将它放到main函数中的while(1)之前、MX_DAC1_Init()函数之后的注释对中:
/* USER CODE BEGIN 2 */
HAL_DAC_Start(&hdac1,DAC_CHANNEL_1);
/* USER CODE END 2 */
2.给DAC的数据输出寄存器赋值
DAC启动之后,可以在while(1)中给其数据寄存器赋值,这样就可以通过它输出所需要的模拟电压信号。
给DAC的数据寄存器赋值,可以使用库函数HAL_DAC_SetValue()。在while(1)中添加如下代码:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
DACIndex++;
if(DACIndex == 4096)
DACIndex =0;
HAL_DAC_SetValue(&hdac1,DAC_CHANNEL_1,DAC_ALIGN_12B_R,DACIndex);
HAL_Delay(10);
}
/* USER CODE END 3 */
HAL_DAC_SetValue()函数有4个参数:第一个是DAC句柄;第二个是DAC的通道;第三个是数据对齐方式(选用12位右对齐);第四个参数是具体赋给数据寄存器的数值这里用了一个变量DACIndex,该变量逐步增加到4096后,再从0开始。当然,需要在main函数中声明该变量。将其声明为全局变量,放到main函数前面的注释对中:
/* USER CODE BEGIN PV */
uint16_t DACIndex = 0;
/* USER CODE END PV */
3.运行并观察输出
运行、下载。通过示波器观察PA4管脚的输出。对应开发板CN7的32引脚或CN8的第3引脚。