DAC,就是将数字信号转成模拟信号。
要了解STM32的DAC,可直接阅读参考手册。
DAC,Digital-to-Analog Converter(数模转换器),DA转换和AD转换有着同样重要的作用,在许多场合都能看到DAC的应用。
DA转换器是把数字量转变成模拟量的器件,按模拟量输出类型通常分为:电流和电压输出类型。常见的DAC是电压输出型,在STM32中集成的DAC转换模块为电压输出型数模转换器。
STM32内部集成的DAC输出通道和功能与型号有关,一般有1到3个通道。
下面描述一下DAC基本的参数信息:
1. DAC分辨率
分辨率决定了DAC的转换精度,目前STM32内部集成的DAC分辨率为12位。
对于大部分应用来说,12位分辨率的DAC已经足够了,同时还可通过软件配置成 8 位分辨率。
2. DAC参考电压
参考电压是DA转换输出电压的参考基准,STM32大部分芯片具有DAC和ADC共用的参考电压引脚VREF+、VREF-。没有参考电压引脚的芯片使用VDDA作为参考电压。
STM32参考电压要求:1.8V ≤ 参考电压 ≤ 3.6V,而且参考电压≤VDDA。不同系列不同型号参考电压范围有差异,具体请参看数据手册。
3. DAC对齐格式
STM32数据位数可配置为12位或者8位,对齐格式分为左对齐和右对齐。在单通道和双通道模式下的对齐格式如下图:
4.DAC触发选择
STM32触发DAC转换有多种选择,外部引脚、定时器、软件触发等,可根据实际情况选择。
放一张STM32的DAC框图和引脚让大家更加直观了解DAC:
STM32 DAC的功能可能不同型号之间略有差异,具体细节内容可查阅芯片对应的手册。
整个工作过程是这样的:
数据放在DHR寄存器中,然后触发信号发出(也可以没有触发),开始转换,可以将数据放在DOR寄存器中缓冲后再转换以提高驱动能力(牺牲一定的功耗),也可以直接转换则无驱动能力,具体根据需要来配置。
注意:
DAC输出的电压如果范围不够,可以接放大电路
相应的GPIO会自动设置好
其他暂时不用管。
部分库函数如下:
/** @addtogroup DAC_Exported_Functions_Group2 * @{ */ /* IO operation functions *****************************************************/ HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel); HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef *hdac, uint32_t Channel); HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t *pData, uint32_t Length, uint32_t Alignment); HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel); void HAL_DAC_IRQHandler(DAC_HandleTypeDef *hdac); HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data); void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac); void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef *hdac); void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac); void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac);其中包含开启和关闭函数;中断处理函数;赋值函数;转换完成的回调函数;转换到半路的回调函数以及转换错误回调函数等。
编程步骤如下:
1、使用HAL_DAC_Start来启动DAC;
2、根据要输出几V电压,算出要写入DOR的值;
3、使用HAL_DAC_SetValue来设定值;
比如,要让DAC输出2.5V电压,那么计算可知要写入的数据为2.5/3.3*4095,约等于3102。
写入该值之后,用万用表在该引脚测量,可测出其约2.5V。
如下,显示2.51V。
如何输出一个正弦波?
可以将正弦波进行取样,得到一个数组,比如对0~3.3V的正弦波进行32个或者更多的采样,计算得到对应的要写入的数值,构成一个数组。然后依次将这些数据写进去。
比如:
这样输出的不会是离散的波形吗?
不会,因为DAC模块会将其处理成模拟量,但是,如果取样点太少,波形就会不光滑,比如取样32个点的情况下:
取样点越多,波形越光滑。理论上,当取无穷个点的时候,得到的就是理想的正弦波。
代码比较简单,略。