國電臨近,總結一下以前寫過的一些程序和電路。時間很少,只能抽空寫了,等閒的時候再一併寫好,以饗讀者。緩存
STM32F103VCT6自帶兩個12位DAC,DAC的轉換速度一直沒有查到,網上有人說是1MHZ的頻率,那就是1us了。ADC的轉換時間在56MHZ工做頻率下爲1us,在72MHZ工做頻率下爲1.17us。若是AD和DA有對稱關係的話,那麼極可能跟ADC的時間相同。(僅做分析用!)函數
DAC於我,有兩個用途:輸出波形和輸出固定電壓。先來講說前者的配置。字體
第一個參數:觸發方式,DAC_InitStructure.DAC_Trigger。可選的外部觸發源一共有八個。六個是定時器觸發:TIM2,TIM4,TIM5,TIM6,TIM7和TIM8。剩下兩個分別是: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,便是否使用輸出緩存。輸出緩存的功能主要用來減少輸出阻抗,是STM32的DAC無需外部運放就能夠直接驅動負載。這裏通常設置成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固定電壓的配置。
STM32的DAC固定電壓配置和上面的波形輸出配置類似,不一樣的地方在於它要多調用一個函數: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改變數據後並不會當即寫入寄存器,須要一次更新,因爲不是經過定時器觸發來更新,所以就只能經過調用函數的方法來更新。