STM32实战总结:HAL之DAC

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输出的电压如果范围不够,可以接放大电路

原理图

 

配置MX

相应的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个点的情况下:

取样点越多,波形越光滑。理论上,当取无穷个点的时候,得到的就是理想的正弦波。

代码比较简单,略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值