welcom ! Handel home

2014年7月1日 星期二

ST32 ADC mode Note 2

下午 04:14
ADC_Mode

ADC_ScanConvMode

ADC_ContinuousConvMode

ADC_ExternalTrigConV

對於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_CC1
ADC_ExternalTrigConv_T1_CC2
ADC_ExternalTrigConv_T2_CC2
ADC_ExternalTrigConv_T3_T以及
ADC_ExternalTrigConv_T4_CC4
計時器輸出觸發比較麻煩,還需要設置相應的計時器。以
ADC_ExternalTrigConv_T2_CC2觸發為例設置相應的計時器:
Void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDefTIM_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;
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位或更多,否則,資料將出錯。


STM32 ADC採樣頻率的確定 
1. 先看一些資料,確定一下ADC 的時鐘: 
1)、 由時鐘控制器提供的ADCCLK 時鐘和PCLK2(APB2 時鐘)同步。
CLK 控制器為ADC時鐘提供一個專用的可程式設計預分頻器。

2)、 一般情況下在程式 中將 PCLK2 時鐘設為與系統時鐘相同 
RCC_HCLKConfig(RCC_SYSCLK_Div1);
 RCC_PCLK2Config(RCC_HCLK_Div1); 
RCC_PCLK1Config(RCC_HCLK_Div2); 

3)、 在時鐘配置寄存器(RCC_CFGR) 中有為ADC 時鐘提供一個專用的可程式設計預分器。 
15:14 ADCPREADC預分頻由軟體設置來確定ADC時鐘頻率 
00PCLK2 2分頻後作為ADC時鐘 
01PCLK2 4分頻後作為ADC時鐘 
10PCLK2 6分頻後作為ADC時鐘 
11PCLK2 8分頻後作為ADC時鐘 

我們可對其進行設置例如:
RCC_ADCCLKConfig(RCC_PCLK2_Div4); 
另外ADC 時鐘使能設置:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1| RCC_APB2Periph_ADC2 | RCC_APB2Periph_GPIOC, ENABLE); 

4)、 可程式設計的通道採樣時間 
ADC 使用若干個ADC_CLK 週期對輸入電壓採樣,採樣週期數目可以通過ADC_SMPR1 ADC_SMPR2 寄存器中的SMP[2:0]位而更改。每個通道可以以不同的時間採樣。總轉換時間如下計算: 

TCONV = 採樣時間+ 12.5 個週期 

例如:當ADCCLK=14MHz 1.5 週期的採樣時間 
TCONV = 1.5 + 12.5 = 14 週期 = 1μs 

SMPx[2:0]:選擇通道x的採樣時間這些位用於獨立地選擇每個通道的採樣時間。在採樣週期中通道選擇位必須保持不變。


0001.5週期 
10041.5週期 
0017.5週期 
10155.5週期 
01013.5週期 
11071.5週期 
01128.5週期 
111239.5週期 

注: 
– ADC1的模擬輸入通道16和通道17在晶片內部分別連到了溫度感測器和VREFINT 
– ADC2的模擬輸入通道16和通道17在晶片內部連到了VSS 

2. 具體分析如下: 
1 我們的輸入信號是50Hz (週期為20ms),初步定為1週期200個採樣點,(注:一 週期最少采20個點,即取樣速率最少為1k ,每2個採樣點間隔為 20ms/200=100us      ADC可程式設計的通道採樣時間我們選最小的 1.5 週期,則 ADC採樣週期一週期大小 100us /1.5=66us  ADC 時鐘頻率為 1/66us =15 KHzADC可程式設計的通道採樣時 間我們選71.5 週期,則 ADC採樣週期一週期大小為(100us /71.5)。ADC 時鐘 頻率為 7.15MHz 

2 接下來我們要確定系統時鐘:我們 用的是 8M Hz 的外部晶振做時鐘源(HSE),估 計得經過 PLL倍頻 PLL 倍頻係數分別為2的整數倍,最大72 MHz。為了提高資料 計算效率,我們把系統時鐘定為72MHz(PLL 9倍頻) 
PCLK2=72MHz,PCLK1=36MHz;我們通過設置時鐘配置寄存器(RCC_CFGR)  有為ADC 時鐘提供一個專用的可程式設計預分器,將PCLK2 8 分頻後作為ADC 的時 鐘,則可 ADC 時鐘頻率為 9MHz  
從手冊可知: ADC 轉換時間:STM32F103xx 增強型產品:ADC 時鐘為56MHz  1μs  (ADC 時鐘為72MHz 1.17μs) 

3 由以上分析可知:不太對應,我們重新對以上中 內容調整,提出如下兩套方案: 
方案一: 
我們的輸入信號是50Hz  (週期為20ms),  初步定為1週期2500個採樣點,(注: 一週期最少采20個點, 即取樣速率最少為1k), 2個採樣為20ms /2500= 8 us   ADC可程式設計的通道採樣時間我們選71.5 週期,則 ADC採樣週期一週期大小為 8us /71.5  ADC 時鐘頻率約為 9 MHz。將PCLK2進行8分頻後 作為ADC 的時

0001.5週期 
10041.5週期 
0017.5週期 
10155.5週期 
01013.5週期 
11071.5週期 
01128.5週期 
111239.5週期
 注: 
– ADC1的模擬輸入通道16和通道17在晶片內部分別連到了溫度感測器和VREFINT 
– ADC2的模擬輸入通道16和通道17在晶片內部連到了VSS 

2. 具體分析如下: 
1 我們的輸入信號是50Hz (週期為20ms),初步定為1週期200個採樣點,(注:一 週期最少采20個點,即取樣速率最少為1k ,每2個採樣點間隔為 20ms/200=100us     ADC可程式設計的通道採樣時間我們選最小的 1.5 週期,則 ADC採樣週期一週期大小 100us /1.5=66us  ADC 時鐘頻率為 1/66us =15 KHzADC可程式設計的通道採樣時 間我們選71.5 週期,則 ADC採樣週期一週期大小為(100us /71.5)。ADC 時鐘 頻率為 7.15MHz 

2 接下來我們要確定系統時鐘:我們 用的是 8M Hz 的外部晶振做時鐘源(HSE),估 計得經過 PLL倍頻 PLL 倍頻係數分別為2的整數倍,最大72 MHz。為了提高資料 計算效率,我們把系統時鐘定為72MHz(PLL 9倍頻) 
PCLK2=72MHz,PCLK1=36MHz;我們通過設置時鐘配置寄存器(RCC_CFGR)  有為ADC 時鐘提供一個專用的可程式設計預分器,將PCLK2 8 分頻後作為ADC 的時 鐘,則 ADC 時鐘頻率為 9MHz  從手冊可知: ADC 轉換時間:STM32F103xx 增強型產品:ADC 時鐘為56MHz  1μs  (ADC 時鐘為72MHz 1.17μs) 

3 由以上分析可知:不太對應,我們重新對以上中 內容調整,提出如下兩套方案: 
方案一: 
我們的輸入信號是50Hz  (週期為20ms),  初步定為1週期2500個採樣點,(注: 一週期最少采20個點, 即取樣速率最少為1k), 2個採樣為20ms /2500= 8 us   ADC可程式設計的通道採樣時間我們選71.5 週期,則 ADC採樣週期一週期大小為 8us /71.5  ADC 時鐘頻率約為 9 MHz。將PCLK2進行8分頻後 作為ADC 的時
鐘,則可知ADC 時鐘頻率為 9MHz 

方案二: 
我們的輸入信號是50Hz (週期為20ms),初步定為1週期1000個採樣點,(注:一 週期最少采20個點,即取樣速率最少為1k ,每2個採樣點間隔為20ms /1000= 20 us ADC可程式設計的通道採樣時間我們選239.5週期,則 ADC採樣週期一週期大小為 20us /239.5  ADC 時鐘頻率約為 12 MHz。將PCLK2 進行分頻後作為ADC  時鐘,則可知ADC 時鐘頻率為 12MHz 


沒有留言: