新聞中心

STM32 DAC

作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
STM32DAC模塊(數(shù)字/模擬轉(zhuǎn)換模塊)是12位數(shù)字輸入,電壓輸出型的DAC。DAC可以配置為8位或12位模式,也可以與DMA控制器配合使用。DAC工作在12位模式時(shí),數(shù)據(jù)可以設(shè)置成左對齊或右對齊。DAC模塊有2個(gè)輸出通道,每個(gè)通道都有單獨(dú)的轉(zhuǎn)換器。在雙DAC模式下,2個(gè)通道可以獨(dú)立地進(jìn)行轉(zhuǎn)換,也可以同時(shí)進(jìn)行轉(zhuǎn)換并同步地更新2個(gè)通道的輸出。DAC可以通過引腳輸入?yún)⒖茧妷篤REF+以獲得更精確的轉(zhuǎn)換結(jié)果。

STM32的DAC模塊主要特點(diǎn)有:

本文引用地址:http://butianyuan.cn/article/201611/317047.htm

①2個(gè)DAC轉(zhuǎn)換器:每個(gè)轉(zhuǎn)換器對應(yīng)1個(gè)輸出通道

②8位或者12位單調(diào)輸出

③12位模式下數(shù)據(jù)左對齊或者右對齊

④同步更新功能

⑤噪聲波形生成

⑥三角波形生成

⑦雙DAC通道同時(shí)或者分別轉(zhuǎn)換

⑧每個(gè)通道都有DMA功能

使用庫函數(shù)的方法來設(shè)置DAC模塊的通道1來輸出模擬電壓,其詳細(xì)設(shè)置步驟如下:

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

STM32F103ZET6的DAC通道1在PA4上,所以,我們先要使能PORTA的時(shí)鐘,然后設(shè)置PA4為模擬輸入。DAC本身是輸出,但是為什么端口要設(shè)置為模擬輸入模式呢?因?yàn)橐坏鼓蹹ACx通道之后,相應(yīng)的GPIO引腳(PA4或者PA5)會自動與DAC的模擬輸出相連,設(shè)置為輸入,是為了避免額外的干擾。

使能GPIOA時(shí)鐘:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA時(shí)鐘

設(shè)置PA1為模擬輸入只需要設(shè)置初始化參數(shù)即可:

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入

2)使能DAC1時(shí)鐘。

同其他外設(shè)一樣,要想使用,必須先開啟相應(yīng)的時(shí)鐘。STM32的DAC模塊時(shí)鐘是由APB1提供的,所以我們調(diào)用函數(shù)RCC_APB1PeriphClockCmd()設(shè)置DAC模塊的時(shí)鐘使能。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);//使能DAC通道時(shí)鐘

3)初始化DAC,設(shè)置DAC的工作模式。

該部分設(shè)置全部通過DAC_CR設(shè)置實(shí)現(xiàn),包括:DAC通道1使能、DAC通道1輸出緩存關(guān)閉、不使用觸發(fā)、不使用波形發(fā)生器等設(shè)置。這里DMA初始化是通過函數(shù)DAC_Init完成的:

voidDAC_Init(uint32_tDAC_Channel,DAC_InitTypeDef*DAC_InitStruct)

參數(shù)設(shè)置結(jié)構(gòu)體類型DAC_InitTypeDef的定義:

typedefstruct

{

uint32_tDAC_Trigger;//設(shè)置是否使用觸發(fā)功能

uint32_tDAC_WaveGeneration;//設(shè)置是否使用波形發(fā)生

uint32_tDAC_LFSRUnmask_TriangleAmplitude;//設(shè)置屏蔽/幅值選擇器,這個(gè)變量只在使用波形發(fā)生器的時(shí)候才有用

uint32_tDAC_OutputBuffer;//設(shè)置輸出緩存控制位

}DAC_InitTypeDef;

實(shí)例代碼:

DAC_InitTypeDefDAC_InitType;

DAC_InitType.DAC_Trigger=DAC_Trigger_None;//不使用觸發(fā)功能TEN1=0

DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形發(fā)生

DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;

DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable;//DAC1輸出緩存關(guān)閉

DAC_Init(DAC_Channel_1,&DAC_InitType);//初始化DAC通道1

4)使能DAC轉(zhuǎn)換通道

初始化DAC之后,理所當(dāng)然要使能DAC轉(zhuǎn)換通道,庫函數(shù)方法是:

DAC_Cmd(DAC_Channel_1,ENABLE);//使能DAC1

5)設(shè)置DAC的輸出值。

通過前面4個(gè)步驟的設(shè)置,DAC就可以開始工作了,我們使用12位右對齊數(shù)據(jù)格式,所以我們通過設(shè)置DHR12R1,就可以在DAC輸出引腳(PA4)得到不同的電壓值了。庫函數(shù)的函數(shù)是:

DAC_SetChannel1Data(DAC_Align_12b_R,0);

第一個(gè)參數(shù)設(shè)置對齊方式,可以為12位右對齊DAC_Align_12b_R,12位左對齊DAC_Align_12b_L以及8位右對齊DAC_Align_8b_R方式。第二個(gè)參數(shù)就是DAC的輸入值了,這個(gè)很好理解,初始化設(shè)置為0。

這里,還可以讀出DAC的數(shù)值,函數(shù)是:

DAC_GetDataOutputValue(DAC_Channel_1);

  1. //DAC通道1輸出初始化
  2. voidDac1_Init(void)
  3. {
  4. GPIO_InitTypeDef GPIO_InitStructure;
  5. DAC_InitTypeDef DAC_InitType;
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA通道時(shí)鐘
  7. RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);//使能DAC通道時(shí)鐘
  8. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;// 端口配置
  9. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模擬輸入
  10. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  11. GPIO_Init(GPIOA,&GPIO_InitStructure);
  12. GPIO_SetBits(GPIOA,GPIO_Pin_4);//PA.4 輸出高
  13. DAC_InitType.DAC_Trigger=DAC_Trigger_None;//不使用觸發(fā)功能 TEN1=0
  14. DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形發(fā)生
  15. DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值設(shè)置
  16. DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable;//DAC1輸出緩存關(guān)閉 BOFF1=1
  17. DAC_Init(DAC_Channel_1,&DAC_InitType);//初始化DAC通道1
  18. DAC_Cmd(DAC_Channel_1,ENABLE);//使能DAC1
  19. DAC_SetChannel1Data(DAC_Align_12b_R,0);//12位右對齊數(shù)據(jù)格式設(shè)置DAC值
  20. }
  21. //設(shè)置通道1輸出電壓
  22. //vol:0~3300,代表0~3.3V
  23. voidDac1_Set_Vol(u16 vol)
  24. {
  25. floattemp=vol;
  26. temp/=1000;
  27. temp=temp*4096/3.3;
  28. DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右對齊數(shù)據(jù)格式設(shè)置DAC值
  29. }



關(guān)鍵詞: STM32DA

評論


技術(shù)專區(qū)

關(guān)閉