嵌入式单片机基础篇(十四)之DAC | 您所在的位置:网站首页 › dac转换器的功能是什么意思 › 嵌入式单片机基础篇(十四)之DAC |
DAC原理与应用详解
第一部分:stm32
1、问题:什么是DAC? 回答:数模转换器 2、stm32 DAC简介 STM32 的 DAC 模块(数字/模拟转换模块)是 12 位数字输入,电压输出型的 DAC。DAC 可以配置为 8 位或 12 位模式,也可以与 DMA 控制器配合使用。DAC 工作在 12 位模式时,数据可以设置成左对齐或右对齐。DAC 模块有 2 个输出通道,每个通道都有单独的转换器。在双 DAC模式下,2 个通道可以独立地进行转换,也可以同时进行转换并同步地更新 2 个通道的输出。DAC 可以通过引脚输入参考电压 VREF+以获得更精确的转换结果。 3、STM32 的 DAC 模块主要特点有: ① 2 个 DAC 转换器:每个转换器对应 1 个输出通道 ② 8 位或者 12 位单调输出 ③ 12 位模式下数据左对齐或者右对齐 ④ 同步更新功能 ⑤ 噪声波形生成 ⑥ 三角波形生成 ⑦ 双 DAC 通道同时或者分别转换 ⑧ 每个通道都有 DMA 功能 4、单个 DAC 通道的框图如图所示:
第一个参数 DAC_Trigger 用来设置是否使用触发功能,如果不使用触发功能,其值为 DAC_Trigger_None。 第二个参数 DAC_WaveGeneratio 用来设置是否使用波形发生,如果不使用,其值为 DAC_WaveGeneration_None。 第三个参数 DAC_LFSRUnmask_TriangleAmplitude 用来设置屏蔽/幅值选择器,这个变量只在使用波形发生器的时候才有用,如果设置为 0 ,其值为 DAC_LFSRUnmask_Bit0。 第四个参数 DAC_OutputBuffer 是用来设置输出缓存控制位,如果不使用输出缓存,其值为 DAC_OutputBuffer_Disable。 例子: DAC_InitTypeDef DAC_InitType; 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 输出缓存关闭 DAC_Init(DAC_Channel_1,&DAC_InitType); //初始化 DAC 通道 14)使能 DAC 转换通道 初始化 DAC 之后,使能 DAC 转换通道,库函数方法是: DAC_Cmd(DAC_Channel_1, ENABLE); //使能 DAC1 5)设置 DAC 的输出值。 通过前面 4 个步骤的设置,DAC 就可以开始工作了,如果使用 12 位右对齐数据格式,通过设置 DHR12R1,就可以在 DAC 输出引脚(PA4)得到不同的电压值了。库函数的函数是: DAC_SetChannel1Data(DAC_Align_12b_R, 0); 第一个参数设置对齐方式,可以为 12 位右对齐 DAC_Align_12b_R,12 位左对齐DAC_Align_12b_L 以及 8 位右对齐DAC_Align_8b_R 方式。 第二个参数就是 DAC 的输入值了,初始化设置为 0。 读出 DAC 的数值,函数是: DAC_GetDataOutputValue(DAC_Channel_1); 8、程序: dac.c #include "dac.h" //DAC 通道 1 输出初始化 void Dac1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTypeDef DAC_InitType; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //①使能 PA 时钟 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); //①初始化 GPIOA GPIO_SetBits(GPIOA,GPIO_Pin_4) ; //PA.4 输出高 DAC_InitType.DAC_Trigger=DAC_Trigger_None; //不使用触发功能 DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生 DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0; DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1 输出缓存关 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 初始值 } //设置通道 1 输出电压 //vol:0~3300,代表 0~3.3V void Dac1_Set_Vol(u16 vol) { float temp=vol; temp/=1000; temp=temp*4096/3.3; DAC_SetChannel1Data(DAC_Align_12b_R,temp);// 12 位右对齐设置 DAC 值 }main.c int main(void) { u16 adcx; float temp; u8 t=0; u16 dacval=0; u8 key; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置 NVIC 中断分组 2 uart_init(115200); //串口初始化波特率为 115200 KEY_Init(); //初始化按键程序 LED_Init(); //LED 端口初始化 LCD_Init(); //LCD 初始化 usmart_dev.init(72); //初始化 USMART Adc_Init(); //ADC 初始化 Dac1_Init(); //DAC 初始化 POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(30,50,200,16,16,"ELITE STM32"); LCD_ShowString(30,70,200,16,16,"DAC TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,110,200,16,16,"2015/1/15"); LCD_ShowString(30,130,200,16,16,"WK_UP:+ KEY1:-"); //显示提示信息 POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(60,150,200,16,16,"DAC VAL:"); LCD_ShowString(60,170,200,16,16,"DAC VOL:0.000V"); LCD_ShowString(60,190,200,16,16,"ADC VOL:0.000V"); DAC_SetChannel1Data(DAC_Align_12b_R, 0); //初始值为 0 while(1) { t++; key=KEY_Scan(0); if(key== WKUP_PRES) { if(dacval adcx=DAC_GetDataOutputValue(DAC_Channel_1); //读取前面设置 DAC 的值 LCD_ShowxNum(124,150,adcx,4,16,0); //显示 DAC 寄存器值 temp=(float)adcx*(3.3/4096); //得到 DAC 电压值 adcx=temp; LCD_ShowxNum(124,170,temp,1,16,0); //显示电压值整数部分 temp-=adcx; temp*=1000; LCD_ShowxNum(140,170,temp,3,16,0X80); //显示电压值的小数部分 adcx=Get_Adc_Average(ADC_Channel_1,10); //得到 ADC 转换值 temp=(float)adcx*(3.3/4096); //得到 ADC 电压值 adcx=temp; LCD_ShowxNum(124,190,temp,1,16,0); //显示电压值整数部分 temp-=adcx; temp*=1000; LCD_ShowxNum(140,190,temp,3,16,0X80); //显示电压值的小数部分 LED0=!LED0; t=0; } delay_ms(10); } } 第二部分:51单片机1、DAC0832内部结构及引脚 51单片机部分参考文章链接 |
CopyRight 2018-2019 实验室设备网 版权所有 |