STM32之单DAC数模转换输出
1.DAC简介及框图:
-
DAC功能只有STM32大容量的芯片才具有;中低容量的芯片没有;
-
DAC有两个 8位*(右对齐)或者是12位(左或右对齐)*的转换器,每个转换器只有一个通道,所以通常在使能时都是直接操作对应的通道,DAC_OUT1对应PA4;DAC_OUT2对应PA5;
-
注意:为防止对DAC造成干扰,使用DAC对应的IO应设置为模拟输入
-
在上图的寄存中,DORx寄存器是无法直接写值的,只有DHRx寄存器可以进行写操作,控制器会在一个时钟脉冲后将DHRx的值转入DOR寄存器中。
-
DAC功能可以有一个参考电压的输入V_REF+ (要求在2.4-3.3V之间,没有的话是默认VCC*(3.3V)*)
当选择12位数据格式,且默认VCC为参考时,输出电压的转换如下:
V O U T P U T = D O R 2 12 ∗ V R E F + = D H R ∗ V R E F + 4096 V_{OUTPUT}=\frac{DOR}{2^{12}}*V_{REF+}=\frac{DHR*V_{REF+}}{4096} VOUTPUT=212DOR∗VREF+=4096DHR∗VREF+
2.相关寄存器:
-
DAC_CR:操作DAC的相关使能位,如:DAC1/2(低16位的低13位分配DAC1;高16位的低13位给DAC2)
-
使能位EN[0] /[16],
-
缓冲区使能位BOFF[1]/[17],
-
软件触发位(置1即触发DAC转换):TEN[2]/[18]
-
外部触发的选择使能位TSEL[5:3]/[21:19]
-
三角波WAVE,噪声波MAMP的使能位
-
DMA使能位DMAEN[12]/[28]
-
-
DAC_SWTRIGR(DAC software trigger register)低两位有效,分别是DAC1/2的软件触发使能位
-
DAC_DHR12R1 和 DAC_DHR12L1 和 DAC_DHR8R1:
DAC_DHR12R2 和 DAC_DHR12L2 和 DAC_DHR8R2:
分别是单DAC模式下的DHR(可写的数据输入寄存器data holding register)的DAC1/2的12位左对齐,右对齐,8位右对齐的数据位;
-
DAC_DHR12RD 和DAC_DHR12LD 和DAC_DHR8RD:
结尾的D表示DUAL(双DAC模式);双DAC模式下的寄存器高16位分给DAC2,低16位分给DAC1;
-
DAC_DOR1和DAC_DOR2( data output register只能读,不能写,用于装载写在DHR中的值,可以读出此时我们写入的值);
3.库函数操作:
-
使能对应的GPIO的时钟及GPIO配置(注意:做DAC输出的引脚PA4或者是PA5要设成模拟输入;GPIO_Mode_AIN)
-
使能外设DAC的时钟,及初始化(用对应的结构体,具体成员的分析如下:)
{ //...表示对应的前缀uint32_t DAC_Trigger;//触发方式,若是软件触发,选..._None uint32_t DAC_WaveGeneration; //波形发生,不产生波形选..._Noneuint32_t DAC_LFSRUnmask_TriangleAmplitude;// 屏蔽/复制选择,波形发生时才使用,不使用,选..._Bit0uint32_t DAC_OutputBuffer;//输出缓存,关闭..._DISABLE/开启..._ENABLE }DAC_InitTypeDef;
关于输出缓存:开启时,能使对应的输出能够有较大的驱动能力,但输出较小的电压值(0V)时精度较差,所以如果想要有较小值电压输出,应将输出缓存关闭;
-
使能DAC外设
DAC_Cmd(DAC_Channel_x, ENABLE); //与ADC不同,一个转换器只有一个通道,所以直接使能通道即可(库函数封装时没有分开了)。
-
常用的两个库函数:
DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data); //x通道的对齐方式,及DHR的数值 //可选对齐方式有DAC_Align_12b_R / DAC_Align_12b_L / DAC_Align_8b_R //Data 值需在所需对齐方式的范围内
DAC_GetDataOutputValue(uint32_t DAC_Channex)//获取我们所设置的值,即读取DOR寄存器的值
4.PWM模拟DAC输出
对于没有DAC输出的小容量芯片,可以采用PWM方波模拟DAC输出,只需要在硬件上加上滤波电路,滤去高次谐波即可;以下是原子战舰板上所带的二阶低通滤波器的电路图: