STM32学习笔记 & 数字/模拟转换DAC 11

数字/模拟转换DAC

简介

数字/模拟转换模块(DAC)12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。

DAC工作在12位模式时,数据可以设置成左对齐或右对齐。

DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出

DAC主要特征

● 2DAC转换器:每个转换器对应1个输出通道

8位或者12位单调输出

12位模式下数据左对齐或者右对齐

● 同步更新功能

● 噪声波形生成

● 三角波形生成

● 双DAC通道同时或者分别转换

● 每个通道都有DMA功能(DMA只在外部触发事件时生效

● 外部触发转换

● 输入参考电压VREF+

DAC 通道模块框图

DAC输出缓存

DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载

每个DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭

DAC触发

不使能DAC控制寄存器DAC_CR的TEN位,写入DAC_DHRx寄存器的数据在1APB1时钟周期后传入DAC_DOR2寄存器(自动触发模式

使能DAC控制寄存器DAC_CR的TEN位使能DAC外部触发,TSEL位选择外部触发方式

外部触发列表

DAC_DMA请求

任一DAC通道都具有DMA功能。2DMA通道可分别用于2DAC通道的DMA请求。

如果DMAENx位置’1’,一旦有外部触发(而不是软件触发)发生,则产生一个DMA请求,然后DAC_DHRx寄存器的数据被传送到DAC_DORx寄存器。

在双DAC模式下,如果2个通道的DMAENx位都为’1’,则会产生2DMA请求。如果实际只需要一个DMA传输,则应只选择其中一个DMAENx位置’1’。这样,程序可以在只使用一个DMA

求,一个DMA通道的情况下,处理工作在双DAC模式的2DAC通道。

DACDMA请求不会累计,因此如果第2个外部触发发生在响应第1个外部触发之前,则不能处理第2DMA请求,也不会报告错误

噪声生成&三角波生成

DAC可通过寄存器配置输出不同幅值的噪声(Noise)和三角波(triangle

Note :配置以上模式,必须使能外部触发模式

/*三角波输出配置函数*/
HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude);
/*噪声输出配置函数*/
HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude);

/*使用例程*/
int main()
{
    /*设置DHR基值*/
    HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_12B_R, 0);
    /*使用定时器2 TROG 事件触发*/
	HAL_TIM_Base_Start(&htim2);
    /*开启DAC通道*/
	HAL_DAC_Start(&hdac, DAC_CHANNEL_2);
}

双DAC通道转换

在需要2DAC同时工作的情况下,为了更有效地利用总线带宽,DAC集成了3个供双DAC模式

使用的寄存器:DHR8RDDHR12RDDHR12LD,只需要访问一个寄存器即可完成同时驱动2个DAC通道的操作

DAC STM32 CUBE_MX 配置

DAC HAL库函数LIST

stm32f1xx_hal_dac.c

/*DAC初始化和去初始化函数*/
HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef *hdac);
HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef *hdac);
/*DAC启动和停止*/
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef *hdac, uint32_t Channel);
/*DAC启动和停止 DMA方式*/
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);
/*DAC通道配置函数*/
HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef *hdac, DAC_ChannelConfTypeDef *sConfig, uint32_t Channel);
/*设置数据保持寄存器DHR*/
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
/*查询数据保持寄存器DHR*/
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef *hdac, uint32_t Channel);
/*回调函数注册与注销*/
HAL_StatusTypeDef     HAL_DAC_RegisterCallback(DAC_HandleTypeDef *hdac, HAL_DAC_CallbackIDTypeDef CallbackID,
                                               pDAC_CallbackTypeDef pCallback);
HAL_StatusTypeDef     HAL_DAC_UnRegisterCallback(DAC_HandleTypeDef *hdac, HAL_DAC_CallbackIDTypeDef CallbackID);

/*中断及回调函数*/
void HAL_DAC_IRQHandler(DAC_HandleTypeDef *hdac);//未使用
void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac);//未使用
/*DMA 通道1 传输事件回调*/
void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac);//传输完成
void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef *hdac);//传输过半
void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac);//传输错误

stm32f1xx_hal_dac.h

typedef struct
{
  DAC_TypeDef                 *Instance;     /*!< 寄存器基地址             */

  __IO HAL_DAC_StateTypeDef   State;         /*!< DAC communication state           */

  HAL_LockTypeDef             Lock;          /*!< DAC locking object                */

  DMA_HandleTypeDef           *DMA_Handle1;  /*!< DMA 1 句柄 */

  DMA_HandleTypeDef           *DMA_Handle2;  /*!< DMA 2 句柄 */

  __IO uint32_t               ErrorCode;     /*!< DAC Error code                    */

} DAC_HandleTypeDef;

typedef struct
{
  uint32_t DAC_Trigger;                  /*!< 外部触发源选择
                                              这个参数可查 @ref DAC_trigger_selection */

  uint32_t DAC_OutputBuffer;             /*!<  输出缓冲器配置
                                               这个参数可查 @ref DAC_output_buffer */

} DAC_ChannelConfTypeDef;//通道配置结构体

stm32f1xx_hal_dac_ex.c

/*三角波配置*/
HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude);
/*噪声配置*/
HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude);
/*双DAC通道启动和停止*/
HAL_StatusTypeDef HAL_DACEx_DualStart(DAC_HandleTypeDef *hdac);
HAL_StatusTypeDef HAL_DACEx_DualStop(DAC_HandleTypeDef *hdac);
/*双DAC通道数据保持寄存器设置*/
HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef *hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2);
/*查询双DAC通道数据保持寄存器*/
uint32_t HAL_DACEx_DualGetValue(DAC_HandleTypeDef *hdac);

/*DMA 通道2 传输事件回调*/
void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef *hdac);//传输完成
void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef *hdac);//传输过半
void HAL_DACEx_ErrorCallbackCh2(DAC_HandleTypeDef *hdac);//传输错误

stm32f1xx_hal_dac_ex.h

/*DAC 触发源宏定义在此文件中定义*/
/*DAC 噪声及三角波幅值宏在此文件中定义*/

Author:HU&DA

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值