DAC的简单应用

1.简介

DAC指数字/模拟转换。STM32F103RCT6具有2个12位数字输入,模拟输出的DAC;支持数字输入配置成8位右对齐、12位左对齐或12位右对齐格式;在双DAC通道模式下支持单通道独立转换或双通道同步转换。

2.框图

在这里插入图片描述

  1. 根据框图,将数据写入DHRX寄存器后,经过控制逻辑后被传输到DORX寄存器后再转成模拟输出
  2. 值得注意的是,一旦使能DACx通道(ENx位置1),相应的GPIO引脚(DAC1对应PA4,DAC2对应PA5)会自动与DAC的模拟输出(DAC_OUTx)相连为了避免寄生的干扰和额外的功耗,引脚PA4或者PA5应在使能DACx通道前设置成模拟输入(AIN)

3.使能DAC通道

将ENx置1即可打开对DACx的供电。在经过一段启动时间Twakeup(见规格书,6.5us)后,DACx被使能
注:ENx只会使能DACx的模拟部分,即使ENx置0,DACx的数字部分仍在工作
在这里插入图片描述

4. DAC的转换

  1. 不能直接对DORx寄存器直接写入数据,任何输出到DACx的数据都必须写入到DHRx,经系统自动传输到DORx寄存器
  2. 如果没有选中硬件触发(TENx置0)写入到DHRx的数据,会在1个APB1时钟周期后自动传输到DORx寄存器;如果选中硬件触发(TENx置1),写入到DHRx的数据会在硬件触发后经3个APB1时钟周期自动传输到DORx寄存器(注:软件触发,在置1后经1个APB1时钟周期数据传输到DORx寄存器
  3. 一旦数据从DHRx传输到DORx后,经Tsetting后,模拟输出有效(见规格书,STM32F103RCT6的典型值为3us)
    在这里插入图片描述
    附:没有选中硬件触发(TENx = 0)时的时间框图
    在这里插入图片描述

5. 输出电压

数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。
任一DAC通道引脚上的输出电压满足下面的关系:
DAC输出 = VREF x (DOR / 4096)

6. DAC触发

如果TENx位被置1, DAC转换可以由某外部事件触发(定时器计数器、外部中断线)。配置控制位TSELx[2:0]可以选择8个触发事件之一触发
在这里插入图片描述

  1. 每次检测到TRGO事件发生或者外部中断9的发生,最近一次的DHRx的数据在经3个APB1时钟周期后传输到DORx寄存器
  2. 如果是软件触发,在置1后,经1个APB1周期后DHRx的数据传输到DORx寄存器,此时,SWTRIG由硬件自动清0
    注:在ENx置1后,不能再改变TSELx[2:0]

7. DAC寄存器

以**字(32位)**的方式操作这些寄存器

7.1 DAC控制寄存器(DAC_CR)

该寄存器用于控制DAC1和DAC2,低12位为DAC1,[28:16]为DAC2,这里仅看低12位
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.2 DAC软件触发寄存器(DAC_SWTRIGR)

bit0和bit1分别用于设置DAC1和DAC2通道的软件触发,其余bit均保留
在这里插入图片描述在这里插入图片描述

7.3 DAC通道 1 的 12 位右对齐数据保持寄存器(DAC_DHR12R1)

这里仅说一下DAC1的12bit右对齐格式,其他的格式请查参考手册
低12bit为写入DHR寄存器的数据,这里用的是12bit右对齐格式
在这里插入图片描述

7.4 DAC通道 1 数据输出寄存器(DAC_DOR1)

DAC1和DAC2的格式一样,该DORx寄存器的数据会传输到DACx的模拟电路并转换成模拟输出
注:不能直接写数据到该寄存器,输出数据只能通过写入到DHR寄存器,经系统传输到DORx
在这里插入图片描述

8. 简单应用

不使用外部触发,噪声、三角波生成的简单初始化如下:

/****************************************************************************
* 函数名:bspDACInit()
* 功能:初始化DAC
* 输入:无
* 输出:无
*/
void bspDACInit(void)
{
	uint32_t ulTemp;
	
	RCC->APB2ENR |= 1 << 2;		/*使能GPIPA时钟*/
	GPIOA->CRL &= 0xFFF0FFFF;	/*PA4模拟输入*/
	
	RCC->APB1ENR |= 1 << 29;	/*使能DAC时钟*/
	
	ulTemp = DAC->CR;
	ulTemp &= 0xFFFF0000;
	ulTemp |= 0x00000003;
	DAC->CR = ulTemp;	/*失能ADC1的DMA,MAMP,波形发生器,触发;使能ADC1*/	
	
	DAC->DHR12R1 = 0;	/*输出数据初始值为0*/
}

在例程中运行如下:
在这里插入图片描述

9. 注意

  1. DAC输出电压 = VREF x (DOR / 4096)
  2. 在使能ENx前,必须先把DACx对应的GPIO设置成模拟输入
  3. 不建议使能DACx缓存(BOFFx = 0),因为启用缓存后,DACx的模拟输出不能到 0
  4. ENx使能后,不能再配置DAC控制寄存器了,因此ENx放在最后使能,并且ENx只控制DACx模拟部分的电,ENx = 0,不会影响DACx数字部分的工作
  5. 不使用外部触发,DHR写入的数据会在1个APB1时钟周期后传输到ODR寄存器;使用外部触发,DHR写入的数据会在3个APB1时钟周期后传输到ODR寄存器(软件触发,在置1后,只需1个APB1时钟周期即可把数据从DHR传输到ODR寄存器)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值