数字/模拟转换DAC
简介
数字/模拟转换模块(DAC)是12位数字输入,电压输出的数字/模拟转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。
DAC工作在12位模式时,数据可以设置成左对齐或右对齐。
DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出
DAC主要特征
● 2个DAC转换器:每个转换器对应1个输出通道
● 8位或者12位单调输出
● 12位模式下数据左对齐或者右对齐
● 同步更新功能
● 噪声波形生成
● 三角波形生成
● 双DAC通道同时或者分别转换
● 每个通道都有DMA功能(DMA只在外部触发事件时生效)
● 外部触发转换
● 输入参考电压VREF+
DAC 通道模块框图
DAC输出缓存
DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载
每个DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭
DAC触发
不使能DAC控制寄存器DAC_CR的TEN位,写入DAC_DHRx寄存器的数据在1个APB1时钟周期后传入DAC_DOR2寄存器(自动触发模式)
使能DAC控制寄存器DAC_CR的TEN位使能DAC外部触发,TSEL位选择外部触发方式
外部触发列表
DAC_DMA请求
任一DAC通道都具有DMA功能。2个DMA通道可分别用于2个DAC通道的DMA请求。
如果DMAENx位置’1’,一旦有外部触发(而不是软件触发)发生,则产生一个DMA请求,然后DAC_DHRx寄存器的数据被传送到DAC_DORx寄存器。
在双DAC模式下,如果2个通道的DMAENx位都为’1’,则会产生2个DMA请求。如果实际只需要一个DMA传输,则应只选择其中一个DMAENx位置’1’。这样,程序可以在只使用一个DMA请
求,一个DMA通道的情况下,处理工作在双DAC模式的2个DAC通道。
DAC的DMA请求不会累计,因此如果第2个外部触发发生在响应第1个外部触发之前,则不能处理第2个DMA请求,也不会报告错误
噪声生成&三角波生成
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通道转换
在需要2个DAC同时工作的情况下,为了更有效地利用总线带宽,DAC集成了3个供双DAC模式
使用的寄存器:DHR8RD、DHR12RD和DHR12LD,只需要访问一个寄存器即可完成同时驱动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 噪声及三角波幅值宏在此文件中定义*/