1.简介
DAC指数字/模拟转换。STM32F103RCT6具有2个12位数字输入,模拟输出的DAC;支持数字输入配置成8位右对齐、12位左对齐或12位右对齐格式;在双DAC通道模式下支持单通道独立转换或双通道同步转换。
2.框图
- 根据框图,将数据写入DHRX寄存器后,经过控制逻辑后被传输到DORX寄存器后再转成模拟输出
- 值得注意的是,一旦使能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的转换
- 不能直接对DORx寄存器直接写入数据,任何输出到DACx的数据都必须写入到DHRx,经系统自动传输到DORx寄存器
- 如果没有选中硬件触发(TENx置0),写入到DHRx的数据,会在1个APB1时钟周期后自动传输到DORx寄存器;如果选中硬件触发(TENx置1),写入到DHRx的数据会在硬件触发后,经3个APB1时钟周期自动传输到DORx寄存器(注:软件触发,在置1后,经1个APB1时钟周期数据传输到DORx寄存器)
- 一旦数据从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个触发事件之一触发
- 每次检测到TRGO事件发生或者外部中断9的发生,最近一次的DHRx的数据在经3个APB1时钟周期后传输到DORx寄存器
- 如果是软件触发,在置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. 简单应用
不使用外部触发,噪声、三角波生成的简单初始化如下:
void bspDACInit(void)
{
uint32_t ulTemp;
RCC->APB2ENR |= 1 << 2;
GPIOA->CRL &= 0xFFF0FFFF;
RCC->APB1ENR |= 1 << 29;
ulTemp = DAC->CR;
ulTemp &= 0xFFFF0000;
ulTemp |= 0x00000003;
DAC->CR = ulTemp;
DAC->DHR12R1 = 0;
}
在例程中运行如下:
9. 注意
- DAC输出电压 = VREF x (DOR / 4096)
- 在使能ENx前,必须先把DACx对应的GPIO设置成模拟输入
- 不建议使能DACx缓存(BOFFx = 0),因为启用缓存后,DACx的模拟输出不能到 0
- ENx使能后,不能再配置DAC控制寄存器了,因此ENx放在最后使能,并且ENx只控制DACx模拟部分的电,ENx = 0,不会影响DACx数字部分的工作
- 不使用外部触发,DHR写入的数据会在1个APB1时钟周期后传输到ODR寄存器;使用外部触发,DHR写入的数据会在3个APB1时钟周期后传输到ODR寄存器(软件触发,在置1后,只需1个APB1时钟周期即可把数据从DHR传输到ODR寄存器)
|