STM32学习笔记(19)DAC转换介绍

DAC介绍

DAC:Digital-to-Analog Converter,指数/模转换器或者数字/模拟转换器。与ADC相反,或者说互补,是指将离散的数字信号转换为连续变量的模拟信号的器件。

STM32学习笔记(18)ADC转换介绍

STM32 的 DAC 主要特点

  • 2 个 DAC 转换器:每个转换器对应 1 个输出通道
  • 8 位或者 12 位单调输出
  • 12 位模式下数据左对齐或者右对齐
  • 同步更新功能
  • 噪声波形生成
  • 三角波形生成
  • 双 DAC 通道同时或者分别转换
  • 每个通道都有 DMA 功能

DAC输出电压计算

DAC输出 = VREF x (DOR / 4096)

其中DOR是对应的数字信号,VREF为参考电压。

DAC基本原理

DAC框图

在这里插入图片描述

DAC数字信号格式

如图,DAC 输出是受 DORx 寄存器直接控制的,但是我们不能直接往 DORx寄存器写入数据,而是通过 DHRx 间接的传给 DORx 寄存器,实现对 DAC 输出的控制。

而STM32 的 DAC 支持 8/12 位模式, 8 位模式的时候是固定的右对齐的,而 12 位模式可以设置左对齐/右对齐。即单 DAC 通道 x总共有 3 种情况:

  • 8 位数据右对齐:用户将数据写入 DAC_DHR8Rx[7:0]位(实际是存入 DHRx[11:4]位)。
  • 12 位数据左对齐:用户将数据写入 DAC_DHR12Lx[15:4]位(实际是存入 DHRx[11:0]位)。
  • 12 位数据右对齐:用户将数据写入 DAC_DHR12Rx[11:0]位(实际是存入 DHRx[11:0]位)。

之后这些数据会传输到DORx 寄存器。

如果没有选中硬件触发(寄存器DAC_CR1的TENx位置’0’),存入寄存器DAC_DHRx的数据会在一个APB1时钟周期后自动传至寄存器DAC_DORx。
如果选中硬件触发(寄存器DAC_CR1的TENx位置’1’),数据传输在触发发生以后3个APB1时钟周期后完成。

一旦数据从DAC_DHRx寄存器装入DAC_DORx寄存器,在经过时间tSETTLING之后,输出即有效,这段时间的长短依电源电压和模拟输出负载的不同会有所变化。
在这里插入图片描述

DAC触发

选择硬件触发,此时寄存器DAC_CR1的TENx位置’1’,通过TSELx寄存器写入相应位可启动相应外部触发方式。(框图左上角)

DAC转换可以由某外部事件触发(定时器计数器、外部中断线)。配置控制位TSELx[2:0]可以选择8个触发事件之一触发DAC转换。

在这里插入图片描述
每次DAC接口侦测到来自选中的定时器TRGO输出,或者外部中断线9的上升沿,最近存放在寄存器DAC_DHRx中的数据会被传送到寄存器DAC_DORx中。在3个APB1时钟周期后,寄存器DAC_DORx更新为新值

如果选择软件触发,一旦SWTRIG位置’1’,转换即开始。在数据从DAC_DHRx寄存器传送到
DAC_DORx寄存器后, SWTRIG位由硬件自动清’0’。

配置步骤

1)开启相应引脚时钟,设置 PA4 为模拟输入。(DAC1对应PA4,DAC2对应PA5)

STM32F103ZET6 的 DAC 通道 1 在 PA4 上,所以,我们要使能 PORTA 的时钟并设置 PA4 为模拟输入。

DAC 本身是输出,但是为什么端口要设置为模拟输入模式呢?
因为一但使能 DACx 通道之后,相应的 GPIO 引脚(PA4 或者 PA5)会自动与 DAC 的模拟输出相连,设置为输入,是为了避免额外的干扰。(即使是直接用芯片也可以无脑设置为模拟输入,实验可得虽然引脚为模拟输入,但仍可输出相应信号。(电压)

2)使能相应 DAC 时钟。(此处通道一对应DAC1)
3)初始化 DAC,设置 DAC 的工作模式。
4)使能 DAC 转换通道。
5)设置 DAC 的输出值。

相关结构体

typedef struct
{
uint32_t DAC_Trigger;                     //是否使用触发功能
uint32_t DAC_WaveGeneration;              //是否使用波形发生
uint32_t DAC_LFSRUnmask_TriangleAmplitude;//设置屏蔽/幅值选择器,只在使用波形发生器的时候才有用
uint32_t DAC_OutputBuffer;                //设置输出缓存控制位(使能后输出可能没法到0)
}DAC_InitTypeDef;

代码示例

DAC初始化

void Dac1_Init(void)
{
  
	GPIO_InitTypeDef GPIO_InitStructure;
	DAC_InitTypeDef DAC_InitType;//相关结构体初始化

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );	  //使能PORTA通道时钟
   	RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );	  //使能DAC通道时钟 

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;				 // 端口配置
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 		 //模拟输入
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_4)	;//PA.4 输出高
					
	DAC_InitType.DAC_Trigger=DAC_Trigger_None;	//不使用触发功能 TEN1=0
	DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生
	DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置
	DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;	//DAC1输出缓存关闭 BOFF1=1
    DAC_Init(DAC_Channel_1,&DAC_InitType);	 //初始化DAC通道1

	DAC_Cmd(DAC_Channel_1, ENABLE);  //使能DAC1
  
    DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12位右对齐数据格式设置DAC值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值