cortex_m3_stm32嵌入式學習筆記(十八):DAC實驗(數模轉換)

ARM 295瀏覽

STM32 的 DAC 模塊(數字/模擬轉換模塊)是 12 位數字輸入,電壓輸出型的 DAC。 DAC可以配置為 8 位或 12 位模式,也可以與 DMA 控制器配合使用。 DAC 工作在 12 位模式時,數據可以設置成左對齊或右對齊。 DAC 模塊有 2 個輸出通道,每個通道都有單獨的轉換器。在雙 DAC 模式下, 2 個通道可以獨立地進行轉換,也可以同時進行轉換并同步地更新 2 個通道的輸出。

本節實驗,我們將利用按鍵(或 USMART) 控制 STM32 內部 DAC1來輸出電壓,通過 ADC1的通道1 采集 DAC的輸出電壓,在 LCD 模塊上面顯示 ADC 獲取到的電壓值以及 DAC 的設定輸出電壓值等信息。

STM32 的 DAC 模塊主要特點有:
① 2 個 DAC 轉換器:每個轉換器對應 1 個輸出通道
② 8 位或者 12 位單調輸出
③ 12 位模式下數據左對齊或者右對齊
④ 同步更新功能
⑤ 噪聲波形生成
⑥ 三角波形生成
⑦ 雙 DAC 通道同時或者分別轉換
⑧ 每個通道都有 DMA 功能

當 DAC 的參考電壓為 Vref+的時候(對 STM32F103RC 來說就是 3.3V), DAC 的輸出電壓是線性的從 0~Vref+, 12 位模式下 DAC 輸出電壓與 Vref+以及 DORx 的計算公式如下:
? ? ? ? ? ? ? ? ? DACx 輸出電壓=Vref*( DORx/4095)

我的ADC和DAC的理解是:

ADC可以采集電壓把電壓轉換為數字,DAC可以把數字轉換為電壓的形式并輸出

配置步驟:

1)開啟 PA 口時鐘,設置 PA4 為模擬輸入。

STM32F103RCT6 的 DAC 通道 1 在 PA4 上,所以,我們先要使能 PORTA 的時鐘,然后設置 PA4 為模擬輸入。 DAC 本身是輸出,但是為什么端口要設置為模擬輸入模式呢?因為一但使能 DACx 通道之后,相應的 GPIO 引腳( PA4 或者 PA5)會自動與 DAC 的模擬輸出相連,設置為輸入,是為了避免額外的干擾。
2)使能 DAC1 時鐘。
3) 初始化 DAC,設置 DAC 的工作模式。
4) 使能 DAC 轉換通道
5) 設置 DAC 的輸出值

dac.c

#include "dac.h" void Dac1_Init(void) { 	GPIO_InitTypeDef GPIO_ist; 	DAC_InitTypeDef DAC_ist; 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );//使能 PA 時鐘 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE ); //使能 DAC 時鐘 	GPIO_ist.GPIO_Pin=GPIO_Pin_4; 	GPIO_ist.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入 	GPIO_ist.GPIO_Speed=GPIO_Speed_50MHz; 	GPIO_Init(GPIOA,&GPIO_ist); 	GPIO_SetBits(GPIOA,GPIO_Pin_4);//PA.4 輸出高 	 	DAC_ist.DAC_Trigger=DAC_Trigger_None; //不使用觸發功能 	DAC_ist.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形發生 	DAC_ist.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0; 	DAC_ist.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;//關DAC1輸出緩存 	DAC_Init(DAC_Channel_1,&DAC_ist);  //初始化 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值 } u16 Dac1_Get_Vol(void) { 	return DAC_GetDataOutputValue(DAC_Channel_1); }
dac.h

#ifndef _DAC_H #define _DAC_H #include "sys.h" void Dac1_Init(void); u16 Dac1_Get_Vol(void); void Dac1_Set_Vol(u16 vol); #endif

主函數。。通過按鍵來調節DAC輸出電壓的強度,WKUP增強,KEY0減弱(也可以通過USMART組件設置)

#include "led.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "lcd.h" #include "adc.h" #include "dac.h" #include "key.h" void init() { 	delay_init();	    	 //延時函數初始化	   	uart_init(9600);	 	//串口初始化為9600 	LED_Init();		  		//初始化與LED連接的硬件接口  	LCD_Init(); 	KEY_Init(); 	Adc_Init(); 	Dac1_Init(); 	 	POINT_COLOR=RED;//設置字體為紅色 	LCD_ShowString(60,40,200,24,24,"DAC Test ^-^"); 	LCD_ShowString(60,70,200,16,16,"Bigggg difficulty"); 	LCD_ShowString(60,90,200,16,16,"2015/1/25"); 	LCD_ShowString(60,110,200,16,16,"By--Mr yh"); 	LCD_ShowString(60,130,200,16,16,"WK_UP:+ KEY0:-"); 	//顯示提示信息 	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"); 	Dac1_Set_Vol(330); } int main(void) { 	 	u16  adcnum=0; 	u16 dacnum=0; 	float tem; 	u8 key,t=0; 	init(); 	while(1) 	{ 		t++; 		key=KEY_Scan(0); 		if(key==WK_UP_PRES) 		{ 			if(dacnum<4000)dacnum+=200; 			DAC_SetChannel1Data(DAC_Align_12b_R,dacnum); 		} 		else if(key==KEY0_PRES) 		{ 			if(dacnum>200)dacnum-=200; 			else dacnum=0; 			DAC_SetChannel1Data(DAC_Align_12b_R,dacnum); 		} 		 		if(t==10||key==WK_UP_PRES||key==KEY0_PRES) 		{ 			adcnum=Dac1_Get_Vol();dacnum=adcnum; 			LCD_ShowxNum(124,150,adcnum,4,16,0);//顯示DAC寄存器值 			tem=(float)adcnum*(3.3/4096); //得到DAC電壓值 			adcnum=tem; 			LCD_ShowxNum(124,170,tem,1,16,0);//顯示電壓值整數部分 			tem-=adcnum;tem*=1000; 			LCD_ShowxNum(140,170,tem,3,16,0X80);//顯示電壓值的小數部分 			adcnum=Get_Adc_Average(ADC_Channel_1,10); 			tem=(float)adcnum*(3.3/4096); 			adcnum=tem; 			LCD_ShowxNum(124,190,tem,1,16,0); 			tem-=adcnum;tem*=1000; 			LCD_ShowxNum(140,190,tem,3,16,0X80); 			t=0; 			LED0=!LED0; 		} 		delay_ms(10); 	} }


最后在通過杜邦線將PA1和PA4連起來就好了。。至于為什么要連這兩個口 看圖

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

ADC1 和DAC1 分別掛在了 PA1和PA4上,所以我們想要通過ADC1采集DAC1輸出的電壓,就要將這兩點連起來


七星彩走势图2元网官网