单片机采用STM32F103VET6,大容量的STM32F103(256k)具备DAC功能
DAC说明
—DAC 外设有固定的输出通道,分别为 PA4 和 PA5
—通过向DHRx 寄存器写入数据,间接传递给DORx 寄存器,可以实现对DAC的输出功能。
—STM32的DAC支持8位/12位模式,8位模式时,固定为右对齐;12位模式时,可以设置为右对齐或左对齐方式。
—当DAC的参考电压为Vref+的时候,DAC输出电压范围为0-Vref+。在12位模式下,计算公式为:
DAC(out)=Vref*(DORx/4095)
寄存器配置
DAC CR寄存器低八位的常用配置如下:
代码
DAC的配置相比较ADC简单很多,其简单代码配置如下:
void DAC_INIT(void)
{
RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
GPIOA->CRL &= ~(0xf<<16);//配置PA4为模拟输入
RCC->APB1ENR|=1<<29; //使能 DAC 时钟
DAC->CR=0;//**初始化DAC
DAC->CR|=1<<0; //使能 DAC1
DAC->CR|=1<<1; //DAC1 输出缓存不使能 BOFF1=1
DAC->DHR12R1=0;//初始化电压数据寄存器
}
//配置电压值
void Dac_Vol(u16 vol)//输入的电压值0-3300,对应0-3.3v
{
float temp=vol;
temp/=1000;
temp=temp*4096/3.3; //计算 DAC 输出寄存器值
DAC->DHR12R1=temp;//向DHR12R1寄存器写入输出的电压值
}
在主函数中调用函数,即可实现PA4 DAC引脚的电压输出。
实验结果
PS:由于野火开发板没有连接ADC与DAC引脚的跳帽,因此无法使用ADC来检测DAC输出,可以使用万用表或示波器直接测量。(有空用万用表测下试试。)
PS2:相比较而言,实际开发中多数采用外置DAC输出芯片来达成DAC输出,这样只需要普通IO口使用iic总线协议控制DAC芯片即可。