ST32 ADC read By DMA 要點說明
1、 對於ADC來說,我們關注的是它的解析度、轉換速度、ADC類型、參考電壓範圍。
A、 解析度,12位元解析度,最小量化單位LSB=VREF+/212
B、 轉換時間,可編程的,採樣一次至少要用14個ADC時鐘週期,而ADC時鐘頻率
高為14M Hz,也就是說它的最短採樣時間為1us
C、 ADC類型,類型決定了性能的極限,stm32是逐次比較型ADC(SAR)
D、 參考電壓範圍,當需要測量負電壓或測量的信號超出範圍時,要先經過運算電路進行平移或利用電阻分壓
2、 ADC工作過程分析,ADC部件要受到觸發信號才開始進行轉換,如EXTI外部觸發、計時器觸發,也可以軟體觸發。ADC部件在接收到觸發信號後,在ADCCLK時鐘的驅動下對輸入通道信號進行採樣,並進行模數轉換。其中,ADCCLK來自ADC的預分頻器
3、 DMA在傳輸時,由於不是內核執行的指令,所以修改變數值是絕對不會出現賦值語句的。
4、 在ADC_Init(
)中完成對ADC和DMA配置後,ADC就不停地採集資料,而DMA就自動把ADC採集到的資料轉移至記憶體中的變數ADC_ConvertedValue.因此,它是一個即時值
5、 ADC1_GPIO_Config( )的功能就是使能DMA時鐘、GPIO時鐘、ADC1時鐘。然後把ADC1的通道11使用的GPIO引腳PC1配置成類比輸入模式
6、 配置DMA,ADC模式及其DMA傳輸方式都在ADC_Mode_Config( )中實現,ADC的DMA整體上被配置為:使用DMA1的通道1
7、 配置ADC模式:主要對ADC的初始化結構體進行賦值,下面是它的結構體成員:
A、.ADC_Mode,多個ADC,不同的ADC又是共用相同的通道,根據同一個通道的先後順序、時間間隔,可劃分10種模式(測量電壓分壓後的電壓值,要求不高,用一個ADC就可以了
B、.ADC_ScanConvMode,當有多個通道需要採集信號時,可配置為按一定順序對各個通道進行掃描轉換,即輪流採集各通道的值,若採集多個通道,必須開啟此模式
C、ADC_ContinuousConvMode,連續轉換模式,即在上一次轉換完後,立即開啟下一次的轉換
D、ADC_ExternalTrigConv,外部觸發,若使用軟體觸發,則ADC_ExternalTrigConv_None
E、.ADC_DataAlign,資料對齊方式
F、.ADC_NbrOfChannel,這個成員保存了要進行ADC資料轉換的通道數
8、ADC初始化使用ADC_Init(
)函數,但要調用ADC_Cmd( )函數來使能ADC外設,用ADC_DMACmd( )函數來使能ADC的DMA介面
9、ADC轉換時間配置:RCC_ADCCLKConfig(
)設置分頻值,ADC轉換時間不僅與ADC的時鐘有關,還與採樣週期有關
10、stm32中 ADC採樣時間計算公式:Tconv=採樣週期+12.5個週期,公式中的採樣週期就是本函數配置的ADC_SampleTime,後面再加上12.5個固定週期值。所以,轉換時間=採樣時間/分頻值
11、ADC自校準,在ADC轉換前,要啟動ADC的自校準,校準可以大幅度減少准精度誤差
12、軟體觸發可以調用庫函數ADC_SoftwareStartConvCmd( )來開啟軟體觸發
13、Volatile定義的變數,使用該關鍵字來修飾,為的是不要讓編譯器去優化變數
14、用volatile聲明的類型變數表示可以被某些編譯器未知的因素更改,比如:作業系統、硬體或者其他線程等。 因為ADC_ConvertedValue這個變數值隨時都是會被DMA控制器改變的,所以我們用volatile來修飾它,確保每次讀取到的都是即時的ADC轉換值。
15、ADC通用的電壓計算公式:實際電壓值=ADC轉換值*LSB
[ 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 ADCPRE:ADC 預分頻由軟體設置來確定 ADC 時鐘頻率
00:PCLK2 2 分頻後作為 ADC 時鐘
01:PCLK2 4 分頻後作為 ADC 時鐘
10:PCLK2 6 分頻後作為 ADC 時鐘
11:PCLK2 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=14M Hz 和1.5 週期的採樣時間
TCONV = 1.5 + 12.5 = 14 週期 = 1μs
SMPx[2:0]:選擇通道 x的採樣時間這些位用於獨立地選擇每個通道的採樣時間。在
採樣週期中通道選擇位必須保持不變。
000:1.5 週期 100:41.5 週期
001:7.5 週期 101:55.5 週期
010:13.5 週期 110:71.5 週期
011:28.5 週期 111:239.5 週期
注:
– ADC1 的模擬輸入通道 16 和通道 17 在晶片內部分別連到了溫度感測器和VREFINT。
– ADC2 的模擬輸入通道 16 和通道17 在晶片內部連到了 VSS。
2. 具體分析如下:
(1) 我們的輸入信號是 50Hz (週期為 20m s),初步定為1 週期200 個採樣點,(注:一
週期最少采 20 個點,即採樣率最少為 1k) ,每 2個採樣點間隔為 20m s/200=100us
ADC 可編程的通道採樣時間我們選最小的 1.5 週期,則 ADC 採樣週期一週期大小
為 100us
/1.5=66us 。 ADC 時鐘頻率為 1/66us =15 KHz。ADC 可編程的通道採樣時
間我們選 71.5 週期,則 ADC 採樣週期一週期大小為(100us /71.5)。ADC 時鐘
頻率為 7.15M Hz。
(2) 接下來我們要確定系統時鐘:我們
用的是 8M Hz 的外部晶振做時鐘源(HSE),估
計得經過 PLL 倍頻 PLL 倍頻係數分別為 2 的整數倍,最大 72 MHz。為了提高資料
計算效率,我們把系統時鐘定為
72M Hz,(PLL 9 倍頻)。
則 PCLK2=72M Hz,PCLK1=36M Hz;我們通過設置時鐘配置寄存器(RCC_CFGR) 中
有為 ADC 時鐘提供一個專用的可編程預分器,將 PCLK2 8 分頻後作為 ADC 的時
鐘,則可 知ADC 時鐘頻率為 9M Hz 。
從手冊可知: ADC 轉換時間:STM32F 103xx 增強型產品:ADC 時鐘為 56M Hz 時
為 1μs (ADC 時鐘為 72M Hz 為 1.17μs)
(3) 由以上分析可知:不太對應,我們重新對以上中
內容調整,提出如下兩套方案:
方案一:
我們的輸入信號是 50Hz (週期為 20m s), 初步定為 1 週期 2500 個採樣點,(注:
一週期最少采 20 個點, 即採樣率最少為 1k), 每 2 個採樣為 20m s /2500= 8 us
ADC 可編程的通道採樣時間我們選 71.5 週期,則 ADC 採樣週期一週期大小為
8us /71.5 。 ADC 時鐘頻率約為 9 MHz。將 PCLK2 進行 8 分頻後 作為 ADC 的時 鐘,
則可知 ADC 時鐘頻率為 9MHz。
方案二:
我們的輸入信號是 50Hz (週期為20m s),初步定為 1 週期1000 個採樣點,(注:一
週期最少采 20 個點,即採樣率最少為 1k) ,每2 個採樣點間隔為 20m s /1000= 20 us
ADC 可編程的通道採樣時間我們選 239.5 週期,則 ADC 採樣週期一週期大小為
20us /239.5 。 ADC 時鐘頻率約為 12 MHz。將PCLK2 進行6 分頻後作為 ADC 的
沒有留言:
張貼留言