1. 程式人生 > >STM32之ADC配置

STM32之ADC配置

 對於STM32,在使用ADC的時候需要配置幾個引數。

(1) 第一個引數是ADC_Mode,這裡設定為獨立模式:

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

在這個模式下,雙ADC不能同步,每個ADC介面獨立工作。所以如果不需要ADC同步或者只是用了一個ADC的時候,就應該設成獨立模式了。

(2) 第二個引數是ADC_ScanConvMode,這裡設定為DISABLE

ADC_InitStructure.ADC_ScanConvMode = DISABLE;

如果只是用了一個通道的話,DISABLE就可以了,如果使用了多個通道的話,則必須將其設定為

ENABLE

(3) 第三個引數是ADC_ContinuousConvMode,這裡設定為ENABLE,即連續轉換。如果設定為DISABLE,則是單次轉換。兩者的區別在於連續轉換直到所有的資料轉換完成後才停止轉換,而單次轉換則只轉換一次資料就停止,要再次觸發轉換才可以。所以如果需要一次性採集1024個數據或者更多,則採用連續轉換。

(4) 第四個引數是ADC_ExternalTrigConv,即選擇外部觸發模式。這裡只講三種:

1、第一種是最簡單的軟體觸發,引數為ADC_ExternalTrigConv_None。設定好後還要記得呼叫庫函式:

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

這樣觸發才會啟動。

2、第二種是定時器通道輸出觸發。共有這幾種:ADC_ExternalTrigConv_T1_CC1ADC_ExternalTrigConv_T1_CC2ADC_ExternalTrigConv_T2_CC2

ADC_ExternalTrigConv_T3_T以及ADC_ExternalTrigConv_T4_CC4。定時器輸出觸發比較麻煩,還需要設定相應的定時器。以

ADC_ExternalTrigConv_T2_CC2觸發為例設定相應的定時器:

void TIM2_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_TimeBaseStructure.TIM_Prescaler = 4;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseStructure.TIM_Period = 0XFF;

TIM_TimeBaseStructure.TIM_ClockDivision = 0;

TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse = 0X7F;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

//配置CC2的屬性。若CC3作為ADC的觸發源,則應改為TIM_OC3Init(TIM2, &TIM_OCInitStructure);

TIM_OC2Init(TIM2, &TIM_OCInitStructure);

TIM_Cmd(TIM2, ENABLE);

TIM_CtrlPWMOutputs(TIM2, ENABLE);

}

這樣設定之後就可以用定時器2的輸出觸發了,至於觸發的週期,設定TIM2的時間即可。這裡不再贅述。

3、第三種是外部引腳觸發,對於規則通道,選擇EXTI11TIM8_TRGO作為外部觸發事件;而注入通道組則選擇EXTI15TIM8_CC4作為外部觸發事件。

(5) 第五個引數是ADC_DataAlign,這裡設定為ADC_DataAlign_Right右對齊方式。建議採用右對齊方式,因為這樣處理資料會比較方便。當然如果要從高位開始傳輸資料,那麼採用左對齊優勢就明顯了。

(6) 第六個引數是ADC_NbrOfChannel,顧名思義:通道的數量。要是到多個通道採集資料的話就得設定一下這個引數。此外在規則通道組的配置函式中也許將各個通道的順序定義一下,如:

      ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_13Cycles5);

      ADC_RegularChannelConfig(ADC1,ADC_Channel_14,2,ADC_SampleTime_13Cycles5);

 多通道資料傳輸時有一點還要注意:若一個數組為ADC_ValueTab[4],且設定了兩個通道:通道1和通道2,則轉換結束後,ADC_ValueTab[0]ADC_ValueTab[2]儲存的是通道1的資料,而ADC_ValueTab[1]ADC_ValueTab[3]儲存的是通道2的資料。如果陣列容量大則依次類推。

 補充一點:在使用DMA傳輸資料的時候,需要設定外設地址和儲存器地址,外設地址當然就是ADC的地址了,而儲存器的地址如果使用8位資料的話,儲存器必須定義為8位緩衝區;如果使用16位資料格式的話,儲存器則為16位緩衝器,不可定義為32位或更多,否則,資料將出錯。