STM32系列第20篇--DAC
扫描二维码
随时随地手机看文章
特点:
2个DAC转换器:每个转换器对应1个输出通道 (对应PA4和PA5)
8位或者12位单调输出
12位模式下数据左对齐或者右对齐
同步更新功能
噪声波形生成
三角波形生成
双DAC通道同时或者分别转换
每个通道都有DMA功能
DAC输出电压:数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到Vref+。任一DAC通道引脚上的输出电压满足下面的关系: DAC输出 = Vref * (DOR / 4095)。
CODE://dac.c#include"dac.h"voidDac1_Init(void){GPIO_InitTypeDefGPIO_InitStructure;DAC_InitTypeDefDAC_InitType;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA通道时钟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);GPIO_SetBits(GPIOA,GPIO_Pin_4);//PA.4输出高DAC_InitType.DAC_Trigger=DAC_Trigger_None;//不使用触发功能TEN1=0DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形发生DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable;//DAC1输出缓存关闭BOFF1=1DAC_Init(DAC_Channel_1,&DAC_InitType);//初始化DAC通道1DAC_Cmd(DAC_Channel_1,ENABLE);//使能DAC1DAC_SetChannel1Data(DAC_Align_12b_R,0);//12位右对齐数据格式设置DAC值}//设置通道1输出电压//vol:0~3300,代表0~3.3VvoidDac1_Set_Vol(u16vol){floattemp=vol;temp/=1000;temp=temp*4096/3.3;DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值}//main.c#include"led.h"#include"delay.h"#include"key.h"#include"sys.h"#include"lcd.h"#include"usart.h"#include"dac.h"#include"adc.h"#include"usmart.h"intmain(void){u16adcx;floattemp;u8t=0;u16dacval=0;u8key;delay_init();//延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);//串口初始化为115200KEY_Init();//初始化按键程序LED_Init();//LED端口初始化LCD_Init();//LCD初始化usmart_dev.init(72);//初始化USMARTAdc_Init();//ADC初始化Dac1_Init();//DAC初始化POINT_COLOR=RED;//设置字体为红色LCD_ShowString(60,50,200,16,16,"WarShipSTM32");LCD_ShowString(60,70,200,16,16,"DACTEST");LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(60,110,200,16,16,"2015/1/15");LCD_ShowString(60,130,200,16,16,"WK_UP:+KEY1:-");//显示提示信息POINT_COLOR=BLUE;//设置字体为蓝色LCD_ShowString(60,150,200,16,16,"DACVAL:");LCD_ShowString(60,170,200,16,16,"DACVOL:0.000V");LCD_ShowString(60,190,200,16,16,"ADCVOL:0.000V");DAC_SetChannel1Data(DAC_Align_12b_R,0);//初始值为0while(1){t++;key=KEY_Scan(0);if(key==WKUP_PRES){if(dacval<4000)dacval+=200;DAC_SetChannel1Data(DAC_Align_12b_R,dacval);//设置DAC值,电压值递增,灯逐渐变亮}elseif(key==KEY1_PRES){if(dacval>200)dacval-=200;elsedacval=0;DAC_SetChannel1Data(DAC_Align_12b_R,dacval);//设置DAC值,电压值递减,灯逐渐变暗}if(t==10||key==KEY1_PRES||key==WKUP_PRES)//WKUP/KEY1按下了,或者定时时间到了{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);}}