DAC

 國電臨近,總結一下以前寫過的一些程序和電路。時間很少,只能抽空寫了,等閒的時候再一併寫好,以饗讀者。緩存

       STM32F103VCT6自帶兩個12DACDAC的轉換速度一直沒有查到,網上有人說是1MHZ的頻率,那就是1us了。ADC的轉換時間在56MHZ工做頻率下爲1us,在72MHZ工做頻率下爲1.17us。若是ADDA有對稱關係的話,那麼極可能跟ADC的時間相同。(僅做分析用!)函數

       DAC於我,有兩個用途:輸出波形輸出固定電壓。先來講說前者的配置。字體

       第一個參數:觸發方式,DAC_InitStructure.DAC_Trigger。可選的外部觸發源一共有八個。六個是定時器觸發:TIM2TIM4TIM5TIM6TIM7TIM8。剩下兩個分別是:EXTI線路9和軟件觸發。若是採用定時器觸發的話,就還要再編寫相應的定時器函數,這個倒不是很複雜,和定時器的編寫方式相似。如:DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;//選擇定時器6做外部觸發源spa

 

void TIM_Configuration(void).net

{調試

       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;orm

       TIM_OCInitTypeDef            TIM_OCInitStructure;ip

 

      

       TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);get

      TIM_TimeBaseStructure.TIM_Period = 0x85;         it

      TIM_TimeBaseStructure.TIM_Prescaler = 0x0;      

      TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   

      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 

      TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);     

      

    TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);

}

輸出信號頻率計算:假設輸出一個6個點的鋸齒波波形,則其頻率爲:(72MHZ/(0x85+1))*6=89.552KHZ.注意:若是prescaler不爲0,則時鐘還要再除以(prescaler+1)

       第二個參數:DAC_InitStructure.DAC_WaveGeneration。顧名思義:波形發生器。STM32內部集成了兩個幅度可調的波形發生器,能夠產生三角波噪聲波。若是咱們使用自定義的緩衝區的話,就不須要配置這個參數或者使其爲DAC_WaveGeneration_None,但爲了不別人誤覺得你忘了配置這個參數,因此仍是多寫一句吧,養成好的習慣。

       第三個參數:DAC_InitStructure.DAC_OutputBuffer,便是否使用輸出緩存。輸出緩存的功能主要用來減少輸出阻抗,是STM32DAC無需外部運放就能夠直接驅動負載。這裏通常設置成DAC_OutputBuffer_Disable,即關閉外部緩存。這是爲保險起見,萬一驅動能力不夠強(本人也沒試過@_ @),那調試的時間就又多了一些。

       參數的配置就這麼多了,算得上STM32中最簡單的外設配置之一了!

       通常來講,用DAC輸出波形,傳輸的數據比較多,因此採用DMA傳輸能夠節省CPU的開支。因此在調用DAC_DMACmd(DAC_Channel_1, ENABLE);函數後別忘了配置DMA函數。詳細的配置說明就不寫了,這裏把代碼貼出來:

 

void DMA_Configuration(void)

{

       DMA_InitTypeDef            DMA_InitStructure;

      

       DMA_DeInit(DMA2_Channel3);

       DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_Address;

       DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&FIR_OutPutValueTab;

       DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

       DMA_InitStructure.DMA_BufferSize = 200;

       DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

       DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

       DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

       DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

       DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

       DMA_InitStructure.DMA_Priority = DMA_Priority_High;

       DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

       DMA_Init(DMA2_Channel3, &DMA_InitStructure);

 

      

       DMA_Cmd(DMA2_Channel3, ENABLE);

      

       DMA_ITConfig(DMA2_Channel3,DMA_IT_TC,ENABLE);

}

注意紅色字體寫的那行代碼,當咱們傳輸多個數據時,須要將其設置爲連續轉換!其他就不贅述了。

       接下來談談DAC固定電壓的配置。

       STM32DAC固定電壓配置和上面的波形輸出配置類似,不一樣的地方在於它要多調用一個函數:DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);這樣纔會輸出固定的電平。

具體配置以下:

 

void DAC_VOLTAGE_Configuration(void)

{

       DAC_InitTypeDef            DAC_InitStructure;

       DAC_DeInit();

      

      DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;

      DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;      

      DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

      DAC_Init(DAC_Channel_1, &DAC_InitStructure);

       //

      

       DAC_Cmd(DAC_Channel_1, ENABLE);

       DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);

}

配置完成後,調用DAC_SetChannel1Data(DAC_Align_12b_R,4000);函數就能夠發送數據了!!極其方便。比起5615,0832之流不知簡便了多少!有兩點要注意:1、該函數的第一個參數DAC_Align_12b_R不可依據設置ADC外設地址的方式重寫這個地址,由於這個參數是不帶基址的,而咱們重寫地址後一半會把基址算進去,這樣就不對了!(筆者就曾經卡在這裏!看來凡事不可先入爲主,不然問題早晚會發生。)2、每次改變發送數據時,要同時調用如下兩個函數:

       DAC_SetChannel1Data(DAC_Align_12b_R,4000);

       DAC_SoftwareTriggerCmd(DAC_Channel_1,ENABLE);

至於爲何,個人理解是:由於DAC改變數據後並不會當即寫入寄存器,須要一次更新,因爲不是經過定時器觸發來更新,所以就只能經過調用函數的方法來更新。

相關文章
相關標籤/搜索