新聞中心

        STM32 DAC

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

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

        本文引用地址:http://www.104case.com/article/201611/317047.htm

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

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

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

        ④同步更新功能

        ⑤噪聲波形生成

        ⑥三角波形生成

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

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

        使用庫(kù)函數(shù)的方法來(lái)設(shè)置DAC模塊的通道1來(lái)輸出模擬電壓,其詳細(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)會(huì)自動(dòng)與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è)置全部通過(guò)DAC_CR設(shè)置實(shí)現(xiàn),包括:DAC通道1使能、DAC通道1輸出緩存關(guān)閉、不使用觸發(fā)、不使用波形發(fā)生器等設(shè)置。這里DMA初始化是通過(guò)函數(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)換通道,庫(kù)函數(shù)方法是:

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

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

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

        DAC_SetChannel1Data(DAC_Align_12b_R,0);

        第一個(gè)參數(shù)設(shè)置對(duì)齊方式,可以為12位右對(duì)齊DAC_Align_12b_R,12位左對(duì)齊DAC_Align_12b_L以及8位右對(duì)齊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位右對(duì)齊數(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位右對(duì)齊數(shù)據(jù)格式設(shè)置DAC值
        29. }



        關(guān)鍵詞: STM32DA

        評(píng)論


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

        關(guān)閉
        主站蜘蛛池模板: 克东县| 双城市| 邵阳县| 黄大仙区| 平陆县| 隆子县| 十堰市| 崇文区| 安陆市| 三台县| 内丘县| 五台县| 泽普县| 时尚| 容城县| 景东| 阿拉尔市| 同心县| 江华| 且末县| 盐津县| 揭阳市| 永胜县| 商河县| 盖州市| 湟中县| 临邑县| 方山县| 青神县| 通化县| 康定县| 门源| 邳州市| 新宁县| 荥经县| 苏尼特左旗| 临夏县| 肥东县| 绥棱县| 乌拉特前旗| 长汀县|