特點:
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;//不使用觸發(fā)功能TEN1=0DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形發(fā)生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);//設置中斷優(yōu)先級分組為組2:2位搶占優(yōu)先級,2位響應優(yōu)先級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);}}