此文档作为对洋桃电子STM32F407单片机视频的整理,B站链接:
已知ADC功能是把模拟电压转换成数值的功能,与之相反的DAC功能是把数值转换成模拟电压的功能被称为DAC数模转换器。
1. DAC功能介绍
DAC模块是2个12位宽的数值转换器,2个DAC模块有2个对应的输出通道可以设置为8位和12位模式,在12位模式下可设置左对齐或右对齐,DAC除了输出稳定的模拟电压值,还可生成特殊波形包括噪声、三角波和音频信号。
在DAC结构框图中,上半部分是生成波形的数字电路部分,通过对内部寄存器的控制,可以输出12位宽的电压值、噪声和三角波,数字部分输出的最终数值将输入到图中下半部分的“数模转换器”中,此部分由VDDA和VSSA供电,由VREF+提供参考电压,转换后的模拟电压从DAC_OUTX输出。当VREF+连接3.3V时,12位DAC数值0~4095对应输出电压为0V~3.3V。
STM32F407单片机有2个DAC模块,对应着2个通道的输出端口DAC_OUT1和DAC_OUT2。
2. 硬件电路
开发板上的DAC OUT1通道连接了一个红色高亮LED灯,通过LED亮度来呈现电压的高低。
3. STM32cubeMX初始化
在main.c文件的第110行,会自动调用CubeMX生成的DAC初始化函数,当单片机上电后会执行DAC初始化函数,但并不会向DAC_OUT1通道输出电压,还需要我们在主函数中用HAL库函数设置电压并开启通道输出。
3.1 HAL库函数
当前我们只需要用到其中的两个基础函数。HAL_DAC_SetValue函数用于设置DAC的输出电压值,HAL_DAC_Start函数用于开启DAC转换并在通道上输出电压。
3.2 应用程序
其中第119~120行是借用ADC功能的应用程序,将光敏电阻和电位器的ADC数值存放到ADC_BUF数组中,第123~125行是让DAC输出电压的应用程序,其中第123行是对ADC数值进行必要的换算,因为在硬件电路中用于显示DAC电压的LED是红色型号的,此LED的特性之一是启动电压为1.8V,也就是说此LED的输入电压低于1.8V时不会点亮,所以我们需要让电位器的ADC数值为0时,对应到DAC输出1.8V电压,所以对电位器数值除2后加上2047的偏移值,将换算结果放入ADC BUF[2]中。第124行调用HAL_DAC_SetValue函数,此函数第一个参数是DAC句柄,第二个参数是DAC电压的输出通道,DAC_CHANNEL 1表示DAC_OUT1通道,第三个参数是数据宽度和对齐方式,DAC_ALIGN_12B_R表示12位宽度右对齐,第四个参数是DAC转换的电压值,这里放入ADC_BUF[2]的数值。第125行调用HAL_DAC_Start函数开启DAC转换和通道输出,第126行的延时函数决定了采样和输出的刷新频率。
4. 实验现象
旋转电位器来改变LED的亮度。当电位器阻值为0时DAC输出LED亮度变成最暗,当电位器阻值为最大时DAC输出LED亮度变成最亮。微调电位器时LED也会有对应的亮度变化。达到了DAC输出模拟电压的效果。