前言
STM32所谓的支持双通道的DAC,其实硬件register只有一个地址,分别使用0/1的两个channel来实现2个output的输出
所指的xx位的DAC,实际上是实现的多少的分压,像12bit的DAC,最大分压为4095,10bit的DAC,最大分压1023,这个体现在最终的输出电压设定的value,根据这个value以及分压值来计算最终的电压
环境
软件:
STM32CubeMX V6.2.1
硬件:
STM32F4Discovery
配置
Analog/DAC配置
配置PA4,PA5为默认DAC_OUT1,DAC_OUT2的输出GPIO
针对3V的输入下,实测下来,开启DAC的输出缓存,输出的电压会更加接近预期值
DAC_OUT,缓冲器打开时,最小0.2,最大Vref±0.2(V)
配置DAC1,DAC2的DMA
其它的配置参考:DAC接口使用.
代码
函数说明
DAC初始化主函数:MX_DAC_Init();
DAC instance 初始化函数:HAL_DAC_Init(&hdac)
DAC 绑定GPIO口设定函数:HAL_DAC_MspInit(hdac)
DAC配置channel1:HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1)
DAC配置channel2:HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_2)
DAC设定函数:HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data)
- hdac:即初始化的instance dac
- channel:DAC配置的channel
- Alignment:12位右对齐/左对齐,8位右对齐
- data:设定的电压比例。这个就是前言中提到的分压比,12bit的最大为4095,10bit的最大为1023.以3V的输入为例:计算电压的设定出实际输出公式为:data * 3 / 4095,假设data设定4095,输出为3V(实际测量2.94V),data设定为2048,输出1.5V(实际测量1.478V)
代码实例
设定DAC_OUT1为1.5V,DAC_OUT2为3V,对应的GPIO口,PA4为DAC1,PA5为DAC2
if (HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Data) != HAL_OK )
Error_Handler();
if (HAL_DAC_Start(&hdac, DAC_CHANNEL_1) != HAL_OK )
Error_Handler();
if (HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_12B_R, Data) != HAL_OK )
Error_Handler();
if (HAL_DAC_Start(&hdac, DAC_CHANNEL_2) != HAL_OK )
Error_Handler();