• 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会自动设置好

    其他暂时不用管。

    库函数

    部分库函数如下:

    1. /** @addtogroup DAC_Exported_Functions_Group2
    2. * @{
    3. */
    4. /* IO operation functions *****************************************************/
    5. HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel);
    6. HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef *hdac, uint32_t Channel);
    7. HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t *pData, uint32_t Length,
    8. uint32_t Alignment);
    9. HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel);
    10. void HAL_DAC_IRQHandler(DAC_HandleTypeDef *hdac);
    11. HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
    12. void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac);
    13. void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef *hdac);
    14. void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac);
    15. 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个点的情况下:

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

    代码比较简单,略。

  • 相关阅读:
    java传base64返回给数据报404踩坑
    CryptoPunks NFT 概览与数据分析
    OpenGLES:绘制一个混色旋转的3D球体
    HarmonyOS之自选股App
    每日一题-轮转数组
    【python运维脚本实践】python实践篇之使用Python处理有序文件数据的多线程实例
    2.10 流程控制之 while循环
    Spark RDD惰性计算的自主优化
    Redis进阶篇:发布订阅模式原理与运用
    UE5 ChaosVehicles载具 实现大漂移 (连载四)
  • 原文地址:https://blog.csdn.net/qq_28576837/article/details/126851261