STM32 DAC
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);
- //DAC通道1輸出初始化
- voidDac1_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- DAC_InitTypeDef DAC_InitType;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA通道時(shí)鐘
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);//使能DAC通道時(shí)鐘
- 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=0
- DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//不使用波形發(fā)生
- DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//屏蔽、幅值設(shè)置
- DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable;//DAC1輸出緩存關(guān)閉 BOFF1=1
- DAC_Init(DAC_Channel_1,&DAC_InitType);//初始化DAC通道1
- DAC_Cmd(DAC_Channel_1,ENABLE);//使能DAC1
- DAC_SetChannel1Data(DAC_Align_12b_R,0);//12位右對齊數(shù)據(jù)格式設(shè)置DAC值
- }
- //設(shè)置通道1輸出電壓
- //vol:0~3300,代表0~3.3V
- voidDac1_Set_Vol(u16 vol)
- {
- floattemp=vol;
- temp/=1000;
- temp=temp*4096/3.3;
- DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右對齊數(shù)據(jù)格式設(shè)置DAC值
- }
評論