因項(xiàng)目需要使用到STM32的ADC功能,雖然對(duì)ADC的使用并不陌生,但是第一接觸stm32的ADC功能還是有種無從下手的感覺,主要是因?yàn)镾TM32ADC設(shè)計(jì)較為復(fù)雜,一時(shí)對(duì)相關(guān)的專業(yè)術(shù)語較為生疏,此外固件庫中涉及到的函數(shù)雖都進(jìn)行了分門別類但是還是感覺函數(shù)較多,難以很快掌握,現(xiàn)就將個(gè)人理解寫出,以便大家共同進(jìn)步。
一、stm32 ADC特點(diǎn)
認(rèn)識(shí)事物首先還是要從整體上把握,ADC也一樣的道理,STM32的ADC外設(shè)提供了非常完善的功能,雖然其中很大一部分不見得能在項(xiàng)目中使用,但加深對(duì)其的認(rèn)識(shí)對(duì)于合理利用其資源也是非常有必要的。
下面以項(xiàng)目采用的STM32L151為例,其他類型大同小異。
先看原文:
? 12-bit, 10-bit, 8-bit or 6-bit configurable resolution
? Interrupt generation at the end of regular conversions, end of injected conversions, and in case of analog watchdog or overrun events (for regular conversions)
//在規(guī)則轉(zhuǎn)換結(jié)束、注入轉(zhuǎn)換結(jié)束以及模擬看門狗溢出和overrun事件(規(guī)則轉(zhuǎn)換模式)發(fā)生時(shí)能產(chǎn)生中斷
? Single and continuous conversion modes //有單次和連續(xù)轉(zhuǎn)換模式
? Scan mode for automatic conversions in a fully programmable order //在自動(dòng)轉(zhuǎn)換中支持完成可編程的掃描模式
? Programmable data alignment with in-built data coherency //數(shù)據(jù)對(duì)齊方式可編程
? Programmable and individual sampling time for each ADC channel //可以為每個(gè)通道設(shè)置獨(dú)立的采樣時(shí)間
? External trigger option with configurable edge detection for both regular and injected
conversions //外部觸發(fā)模式對(duì)規(guī)則和注入轉(zhuǎn)換模式均支持可配置的邊沿觸發(fā)方式
? Discontinuous mode //非連續(xù)模式
? ADC conversion time: 1 μs at full speed (ADC clocked at 16 MHz) down to 4 μs at low speed (ADC clocked at 4 MHz), independent of the APB clock//最低采樣時(shí)間
? Automatic power-up/power-down to reduce the power consumption//自動(dòng)的上下電便于節(jié)能
? ADC supply requirements:
– 2.4 V to 3.6 V at full speed or with reference zooming (VREF+ 《 VDDA)
– down to 1.8 V at slower speeds //工作電壓范圍
? ADC input range: VREF– ≤ VIN ≤ VREF+
? Automatic programmable hardware delay insertion between conversions
? DMA request generation during regular channel conversion //規(guī)則轉(zhuǎn)換支持DMA
從官方的描述中可以了解到STM32ADC所提供的強(qiáng)大功能,及一些工作特性,那么如何才能使用這些功能呢?
ADC轉(zhuǎn)換就是輸入模擬的信號(hào)量,單片機(jī)轉(zhuǎn)換成數(shù)字量。讀取數(shù)字量必須等轉(zhuǎn)換完成后,完成一個(gè)通道的讀取叫做采樣周期。采樣周期一般來說=轉(zhuǎn)換時(shí)間+讀取時(shí)間
轉(zhuǎn)換時(shí)間=采樣時(shí)間+12.5個(gè)時(shí)鐘周期。采樣時(shí)間是你通過寄存器告訴STM32采樣模擬量的時(shí)間,設(shè)置越長越精確。
二、STM32 ADC采樣頻率時(shí)間、周期、計(jì)算方法分析
1. :先看一些資料,確定一下ADC的時(shí)鐘:
?。?),由時(shí)鐘控制器提供的ADCCLK時(shí)鐘和PCLK2(APB2時(shí)鐘)同步。CLK控制器為ADC時(shí)鐘提供一個(gè)專用的可編程預(yù)分頻器。
?。?) 一般情況下在程序 中將 PCLK2 時(shí)鐘設(shè)為 與系統(tǒng)時(shí)鐘 相同
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
?。?)在時(shí)鐘配置寄存器(RCC_CFGR) 中 有 為ADC時(shí)鐘提供一個(gè)專用的可編程預(yù)分器
位15:14 ADCPRE:ADC預(yù)分頻
由軟件設(shè)置來確定ADC時(shí)鐘頻率
00:PCLK2 2分頻后作為ADC時(shí)鐘
01:PCLK2 4分頻后作為ADC時(shí)鐘
10:PCLK2 6分頻后作為ADC時(shí)鐘
11:PCLK2 8分頻后作為ADC時(shí)鐘
我們可對(duì)其進(jìn)行設(shè)置 例如:
/* ADCCLK = PCLK2/4 */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
另外 還有 ADC 時(shí)鐘使能設(shè)置
/* Enable ADC1, ADC2 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 |
RCC_APB2Periph_GPIOC, ENABLE);
?。?)16.7 可編程的通道采樣時(shí)間
ADC 使用若干個(gè)ADC_CLK 周期對(duì)輸入電壓采樣,采樣周期數(shù)目可以通過ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位而更改。每個(gè)通道可以以不同的時(shí)間采樣。
總轉(zhuǎn)換時(shí)間如下計(jì)算:
TCONV(轉(zhuǎn)換時(shí)間) = 采樣時(shí)間+ 12.5 個(gè)周期
例如:
當(dāng)ADCCLK=14MHz 和 1.5周期的采樣時(shí)間:
TCONV = 1.5 + 12.5 = 14周期= 1μs
SMPx[2:0]:選擇通道x的采樣時(shí)間
這些位用于獨(dú)立地選擇每個(gè)通道的采樣時(shí)間。在采樣周期中通道選擇位必須保持不變。
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在芯片內(nèi)部分別連到了溫度傳感器和VREFINT。
– ADC2的模擬輸入通道16和通道17在芯片內(nèi)部連到了VSS。
2. 具體分析如下:
?。?)我們的輸入信號(hào)是50Hz (周期為20ms),初步定為1周期200個(gè)采樣點(diǎn),(注:一周期最少采20個(gè)點(diǎn),即采樣率最少為1k) ,每2個(gè) 采樣點(diǎn)間隔為 20ms /200 = 100 us
ADC可編程的通道采樣時(shí)間 我們選最小的 1.5 周期,則 ADC采樣周期一周期大小為
100us /1.5=66us 。 ADC 時(shí)鐘頻率為 1/66us =15 KHz。
ADC可編程的通道采樣時(shí)間 我們選71.5 周期,則 ADC采樣周期一周期大小為
?。?00us /71.5) 。 ADC 時(shí)鐘頻率為 7.15MHz。
?。?)接下來我們要確定系統(tǒng)時(shí)鐘:我們 用的是 8M Hz 的外部晶振做時(shí)鐘源(HSE),估計(jì)得 經(jīng)過 PLL倍頻 PLL 倍頻系數(shù)分別為2的整數(shù)倍,最大72 MHz。為了 提高數(shù)據(jù) 計(jì)算效率,我們把系統(tǒng)時(shí)鐘定為72MHz,(PLL 9倍頻)。則PCLK2=72MHz,PCLK1=36MHz;
我們通過設(shè)置時(shí)鐘配置寄存器(RCC_CFGR) 中 有 為ADC時(shí)鐘提供一個(gè)專用的可編程預(yù)分器,將PCLK2 8 分頻后作為ADC 的時(shí)鐘,則可知ADC 時(shí)鐘頻率為 9MHz
從手冊可知: ADC 轉(zhuǎn)換時(shí)間:
STM32F103xx增強(qiáng)型產(chǎn)品:ADC時(shí)鐘為56MHz時(shí)為1μs(ADC時(shí)鐘為72MHz為1.17μs)
?。?)由以上分析可知:不太對(duì)應(yīng),我們重新對(duì)以上中 內(nèi)容調(diào)整,提出如下兩套方案:
方案一:我們的輸入信號(hào)是50Hz (周期為20ms),初步定為1周期2500個(gè)采樣點(diǎn),(注:一周期最少采20個(gè)點(diǎn),即采樣率最少為1k) ,每2個(gè) 采樣點(diǎn)間隔為 20ms /2500 = 8 us
ADC可編程的通道采樣時(shí)間 我們選71.5周期,則 ADC采樣周期一周期大小為
8us /71.5 。 ADC時(shí)鐘頻率約為 9 MHz。
將PCLK2 8 分頻后作為ADC 的時(shí)鐘,則可知ADC 時(shí)鐘頻率為 9MHz
方案二:我們的輸入信號(hào)是50Hz (周期為20ms),初步定為1周期1000個(gè)采樣點(diǎn),(注:一周期最少采20個(gè)點(diǎn),即采樣率最少為1k) ,每2個(gè) 采樣點(diǎn)間隔為 20ms /1000= 20 us
ADC可編程的通道采樣時(shí)間 我們選239.5周期,則 ADC采樣周期一周期大小為
20us /239.5 。 ADC時(shí)鐘頻率約為 12 MHz。
將PCLK2 6 分頻后作為ADC 的時(shí)鐘,則可知ADC 時(shí)鐘頻率為 12MHz
評(píng)論
查看更多