摘要:為了鍛煉學(xué)生單片機(jī)系統(tǒng)軟硬件設(shè)計(jì)能力,為工程實(shí)際應(yīng)用打下堅(jiān)實(shí)基礎(chǔ),根據(jù)學(xué)生專業(yè)特點(diǎn),精心設(shè)計(jì)了基于單片機(jī)的信號(hào)測(cè)量實(shí)踐教學(xué)案例。本案例實(shí)現(xiàn)了信號(hào)的周期、頻率測(cè)量和通過(guò)串口傳輸,經(jīng)過(guò)改進(jìn)后還可以實(shí)現(xiàn)占空比的測(cè)量。
關(guān)鍵詞:CubeMx,前后臺(tái)編程,輸入捕獲,占空比
一、引言
《單片機(jī)原理及應(yīng)用》是計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)嵌入式方向的一門研究微機(jī)原理、接口技術(shù)及程序設(shè)計(jì)的專業(yè)拓展課程。本課程擔(dān)負(fù)著認(rèn)識(shí)理解微控制器工作原理、掌握單片機(jī)控制系統(tǒng)應(yīng)用設(shè)計(jì),為嵌入式專業(yè)課程打下專業(yè)基礎(chǔ)的任務(wù)[1-2]。本課程簡(jiǎn)明扼要地講授STM32單片機(jī)芯片的硬件結(jié)構(gòu)和工作原理,系統(tǒng)討論了單片機(jī)主要系統(tǒng)資源的設(shè)計(jì)方法,并為單片機(jī)系統(tǒng)設(shè)計(jì)進(jìn)行了必要準(zhǔn)備。主要內(nèi)容包括STM32單片機(jī)的硬件結(jié)構(gòu)、C語(yǔ)言程序設(shè)計(jì)、單片機(jī)內(nèi)部主要模塊的功能實(shí)現(xiàn)、外部接口的應(yīng)用設(shè)計(jì)以及初步的單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)等內(nèi)容。
考慮到課程應(yīng)用性強(qiáng)的特點(diǎn),為了鍛煉學(xué)生單片機(jī)系統(tǒng)軟硬件設(shè)計(jì)能力,為工程實(shí)際應(yīng)用打下堅(jiān)實(shí)基礎(chǔ),課程以STM32CubeMX軟件和MDK-ARM軟件來(lái)學(xué)習(xí)單片機(jī)編程,其中STM32CubeMX采用圖形化方式完成外設(shè)初始化的設(shè)計(jì)[3],在MDK-ARM編程中,引入了較多先進(jìn)的編程思想,硬件采用較新的STM32Nucleo開(kāi)發(fā)板和STM32F411RE控制器。
課程在鍛煉學(xué)生軟硬件設(shè)計(jì)能力的同時(shí),引入了前后臺(tái)編程思想、圖形化的初始化設(shè)計(jì)思想、狀態(tài)機(jī)設(shè)計(jì)思想等,并引入了實(shí)際項(xiàng)目開(kāi)發(fā)中自定義幀格式、復(fù)雜信號(hào)測(cè)量等常用的綜合性技能項(xiàng)目,對(duì)于學(xué)生實(shí)踐能力的鍛煉很有好處。本文以信號(hào)測(cè)量項(xiàng)目為案例,可以在較短的課時(shí)內(nèi)讓學(xué)生掌握單片機(jī)定時(shí)器、串口的實(shí)踐應(yīng)用。
二、信號(hào)測(cè)量案例分析
1、任務(wù)內(nèi)容
本次信號(hào)測(cè)量任務(wù)屬于定時(shí)器的輸入捕獲功能應(yīng)用[4-5],并用到之前學(xué)習(xí)的定時(shí)器PWM輸出功能,以及后續(xù)將要介紹的串口通訊。知識(shí)點(diǎn)包括引腳選擇、參數(shù)計(jì)算,數(shù)據(jù)定義,接口函數(shù)調(diào)用等,具體實(shí)現(xiàn)了信號(hào)的周期、頻率測(cè)量和通過(guò)串口傳輸,經(jīng)過(guò)改進(jìn)后還可以實(shí)現(xiàn)占空比的測(cè)量。
外部脈沖信號(hào)利用A定時(shí)器的某通道產(chǎn)生,利用B定時(shí)器的某通道來(lái)測(cè)量一個(gè)外部脈沖信號(hào)的周期、頻率和占空比,通過(guò)杜邦線與前述測(cè)量通道連接。如圖1所示,通過(guò)計(jì)算t2,t3與t1的時(shí)間差,即可實(shí)現(xiàn)信號(hào)測(cè)量,時(shí)間差為對(duì)應(yīng)的計(jì)數(shù)脈沖個(gè)數(shù)乘以計(jì)數(shù)脈沖周期數(shù),計(jì)數(shù)脈沖個(gè)數(shù)通過(guò)輸入捕獲功能進(jìn)行記錄。
2、設(shè)計(jì)思路
1)、設(shè)置某引腳為定時(shí)器A的通道,利用定時(shí)器A的PWM輸出功能,輸出一定頻率和占空比的方波;
2)、配置B定時(shí)器的某通道為輸入捕獲模式,采用上升沿觸發(fā)。設(shè)置合理的預(yù)分頻系數(shù)和最大計(jì)數(shù)值;
3)、采用前后臺(tái)編程模式。在輸入捕獲中斷的回調(diào)函數(shù)中,設(shè)置測(cè)量完成標(biāo)志,主程序中檢測(cè)該標(biāo)志,一旦置位則計(jì)算信號(hào)的周期和頻率,并清除標(biāo)志位。
三、項(xiàng)目設(shè)置
1、引腳選擇
引導(dǎo)學(xué)生在CubeMx軟件的Pinoutview界面查看STM32F411RETx芯片引腳功能。
1)、串口RX、TX引腳選擇。USART1使用PA10、PA9引腳;USART2使用PA3、PA2引腳;USART1使用PC7、PC6引腳。根據(jù)硬件實(shí)際情況,選擇USART2作為示例,使用PA3、PA2引腳。
2)、在本任務(wù)中既需要定時(shí)器作輸入捕獲,也需要作PWM輸出來(lái)使用,經(jīng)觀察,在排除PA3、PA2引腳的條件下,定時(shí)器的引腳列于下方。
TIM1_CH1:PA8;TIM1_CH2:PA9;TIM1_CH3:PA10;TIM1_CH4:PA11;
TIM2_CH1:PA0,PA5,PA15;TIM2_CH2:PA1,PB3;TIM2_CH3:PB10;
TIM3_CH1:PA6,PB4,PC6;TIM3_CH2:PA7,PB5,PC7;TIM3_CH3:PB0,PC8;TIM3_CH4:PB1,PC9;
TIM4_CH1:PB6;TIM4_CH2:PB7;TIM4_CH3:PB8;TIM4_CH4:PB9;
TIM5_CH1:PA0;TIM5_CH2:PA1;
TIM10_CH1:PB8;TIM11_CH1:PB9;
經(jīng)討論,根據(jù)被提問(wèn)學(xué)生的意見(jiàn)選擇一組,比如示例中選擇TIM1_CH1的PA8、TIM2_CH1的PA0,分別作為PWM輸出和輸入捕獲功能使用,實(shí)物中將兩引腳連接起來(lái)。選擇的引腳如圖2所示。
2、TIM1配置:
1)ClockSource:InternalClock,選擇時(shí)鐘源為內(nèi)部時(shí)鐘;
2)Channel1:PWMGenerationCH1,選擇通道1為PWM輸出;
3)如果輸出一個(gè)頻率為50KHz,占空比60%的方波,該如何設(shè)計(jì)參數(shù)?
根據(jù)公式Period=(ARR+1)(PSC+1)/TIM1_CLK,其中周期Period=1/50K=20us,TIM1_CLK=100MHz,引導(dǎo)學(xué)生計(jì)算ARR和PSC的取值,從學(xué)生計(jì)算的結(jié)果中選擇一組,比如ARR=19(CounterSettings的CounterPeriod參數(shù)),PSC=99(CounterSettings的Prescaler參數(shù));
根據(jù)占空比60%,易于算出CCR(PWMGenerationChannel 1 的Pulse參數(shù))應(yīng)為12。
3、TIM2配置:
1)ClockSource:InternalClock,選擇時(shí)鐘源為內(nèi)部時(shí)鐘;
2)Channel1:InputCapturedirectmode,選擇通道1為輸入捕獲模式,捕獲通道為直接輸入方式;
3)引導(dǎo)學(xué)生分析ARR和PSC的值該如何選?。狠斎氲姆讲ㄐ盘?hào)在邊沿處將進(jìn)行捕獲,此時(shí)記錄下計(jì)數(shù)值(最大為ARR),顯然ARR越大,可以測(cè)量的信號(hào)脈寬越大,故此處應(yīng)將ARR設(shè)的足夠大,建議ARR(CounterSettings的CounterPeriod參數(shù))取最大值0XFFFFFFFF;計(jì)數(shù)的周期越小,對(duì)信號(hào)周期的測(cè)量越準(zhǔn)確,故沒(méi)必要預(yù)分頻,建議PSC(CounterSettings的Prescaler參數(shù))取0;
4)在邊沿處進(jìn)行捕獲時(shí),采用中斷方式處理較為方便,故將NVICSettings的TIM4 globalinterrupt使能。
4、系統(tǒng)內(nèi)核設(shè)置
1)在RCC模式和配置中,將HSE來(lái)源設(shè)為旁路時(shí)鐘源(BYPASS Clock Source);
2)在SYS模式和配置中,將debug設(shè)置為串口調(diào)試(SerialWire);
5、時(shí)鐘配置
1)Inputfrequency(輸入時(shí)鐘頻率):8MHz;
2)PLLSourceMux(鎖相環(huán)時(shí)鐘源):HSE;
3)SystemClockMux(系統(tǒng)時(shí)鐘源):PLLCLK;
4)HCLK:100MHz。
四、程序設(shè)計(jì)
1、變量定義
2、用戶初始化設(shè)置
用戶初始化流程如圖3(a)所示,是在由CubeMx軟件自動(dòng)生成的外設(shè)初始化代碼之后,由用戶編寫(xiě)的初始化代碼,實(shí)現(xiàn)了啟動(dòng)TIM2_CH1的輸入捕獲和啟動(dòng)TIM1_CH1的PWM輸出功能。
3、前臺(tái)程序
前臺(tái)程序如圖3(b)所示,其中第一、第二次捕獲分別對(duì)應(yīng)圖1的t1和t3時(shí)刻,完成2次捕獲后,將置位測(cè)量完成標(biāo)志MeasureFlag = 1,供后臺(tái)程序使用。
4、后臺(tái)程序
當(dāng)前臺(tái)(即TIM2的輸入捕獲中斷函數(shù))測(cè)量完成,即捕獲到圖1中的t1和t3時(shí)刻計(jì)數(shù)值,后臺(tái)將在死循環(huán)中計(jì)算捕獲差值,并計(jì)算信號(hào)周期、頻率通過(guò)串口輸出,當(dāng)然還要清除測(cè)量完成標(biāo)志,以利于新的捕獲,其流程如圖4(a)所示。
討論:程序中通過(guò)計(jì)算TIM2兩次捕獲值之差,乘以1個(gè)脈沖的周期(1/100000000s),計(jì)算得到測(cè)量信號(hào)周期。很明顯只適用于測(cè)量信號(hào)周期不太大的情況,因?yàn)橐坏y(cè)量信號(hào)周期太大,TIM2的第二個(gè)捕獲值可能溢出。引導(dǎo)學(xué)生討論測(cè)量信號(hào)周期的最大值,易于計(jì)算得到,應(yīng)為(0xFFFFFFFF+)/100000000=42.95s,足夠滿足普通應(yīng)用需求。
如果想擴(kuò)大對(duì)被測(cè)信號(hào)周期的測(cè)量,可以考慮第二次捕獲加上計(jì)數(shù)溢出值即可。對(duì)應(yīng)的程序流程如圖4(b)所示。當(dāng)然修改后的程序,對(duì)測(cè)量信號(hào)周期仍然有范圍限制,易于想到,其值約為42.95×2=84s。
5、實(shí)驗(yàn)結(jié)果
編譯并燒寫(xiě)可執(zhí)行文件后,可在實(shí)物上觀察對(duì)信號(hào)周期和頻率的測(cè)量結(jié)果。連接串口,接收到的結(jié)果如下框所示,非常準(zhǔn)確。
五、案例的改進(jìn)
在上述案例中,通過(guò)捕獲t1,t3時(shí)刻的計(jì)數(shù)值后計(jì)算差值,即可完成對(duì)信號(hào)周期和頻率的測(cè)量。如果想實(shí)現(xiàn)占空比的測(cè)量,思路也較為簡(jiǎn)單,下面從前后臺(tái)程序分別進(jìn)行介紹。
1、前臺(tái)程序
如圖5所示,第一次捕獲對(duì)應(yīng)t1時(shí)刻(見(jiàn)圖1),將保存捕獲值CapVal1,修改捕獲標(biāo)識(shí)CapIndex=1,以及設(shè)置為下降沿中斷。接下來(lái)在下降沿時(shí),將再次成功捕獲對(duì)應(yīng)t2時(shí)刻,根據(jù)捕獲標(biāo)志即可判斷出屬于第二次捕獲,此時(shí)保存捕獲值CapVal2,修改捕獲標(biāo)識(shí)CapIndex=2,以及設(shè)置為上升沿中斷。接下來(lái)在上升沿時(shí),將再次成功捕獲對(duì)應(yīng)t3時(shí)刻,根據(jù)捕獲標(biāo)志即可判斷出屬于第三次捕獲,此時(shí)保存捕獲值CapVal3,重置捕獲標(biāo)識(shí)CapIndex=0,并置位測(cè)量完成標(biāo)識(shí)MeasureFlag=1,供后臺(tái)程序查詢使用。
2、后臺(tái)程序
后臺(tái)程序流程圖見(jiàn)圖6所示,分別根據(jù)CapVal2與CapVal1的差值、CapVal3與CapVal1的差值是否大于零,判斷TIM2是否在圖1中的t2與t1中間、t3與t1中間存在計(jì)數(shù)溢出情況,如存在將分別加上2^32,從而擴(kuò)大了對(duì)信號(hào)周期的測(cè)量范圍,具體分析與四、4節(jié)的分析類似。
3、實(shí)驗(yàn)結(jié)果
編譯并燒寫(xiě)可執(zhí)行文件后,可在實(shí)物上觀察對(duì)信號(hào)周期、頻率和占空比的測(cè)量結(jié)果。連接串口,接收到的結(jié)果如下所示,非常準(zhǔn)確。
六、總結(jié)
從本案例可以看出,課程體現(xiàn)了較強(qiáng)的應(yīng)用性,學(xué)生通過(guò)STM32CubeMX軟件的圖形化操作完成外設(shè)初始化的設(shè)計(jì),將在MDK-ARM軟件中自動(dòng)生成初始化代碼;在MDK-ARM編程應(yīng)用時(shí),采用了前后臺(tái)的編程思想,使得程序結(jié)構(gòu)較為清晰;案例實(shí)踐中,引入了定時(shí)器計(jì)數(shù)溢出、通過(guò)修改邊沿捕獲方式計(jì)算信號(hào)占空比等討論,對(duì)定時(shí)器的設(shè)計(jì)應(yīng)用學(xué)習(xí)更為深入。通過(guò)對(duì)本案例的設(shè)計(jì)、討論與實(shí)現(xiàn),培養(yǎng)了硬件設(shè)計(jì)和軟件設(shè)計(jì)技能,開(kāi)發(fā)了學(xué)生的創(chuàng)新思維,提高學(xué)生的自學(xué)、分析和解決問(wèn)題的能力。
參考文獻(xiàn)
[1]許江河, 高緒紅. 基于單片機(jī)的多路信號(hào)采集測(cè)量系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 電子科學(xué)技術(shù), 2015, 2(005):547-551.
[2]金國(guó)華, 滕君華. 基于單片機(jī)的出租車計(jì)價(jià)器實(shí)驗(yàn)教學(xué)案例設(shè)計(jì)[J]. 信息技術(shù)與信息化, 2019, 000(003):93-95.
[3]羅清龍, 馮敏, 李清濤. 基于STM32CubeMX嵌入式實(shí)驗(yàn)教學(xué)改革實(shí)踐[J]. 計(jì)算機(jī)教育, 2018, 000(001):155-158.
[4]李建波, 張永亮, 梁振華. STM32CubeMX定時(shí)器中斷回調(diào)函數(shù)的研究[J]. 電腦知識(shí)與技術(shù), 2020, v.16(08):254-255+279.
[5]李建波, 潘必超, 邱陽(yáng)林. 基于STM32CubeMX外部中斷回調(diào)函數(shù)的研究[J]. 電子世界, 2020, No.586(04):13-14.
作者簡(jiǎn)介:李向陽(yáng)(1984-),男,浙江寧波人,博士,副教授,主要研究方向?yàn)榍度胧较到y(tǒng)開(kāi)發(fā)
[項(xiàng)目]教育部2019年第二批產(chǎn)學(xué)合作協(xié)同育人項(xiàng)目:《單片機(jī)原理及應(yīng)用》重構(gòu)式教學(xué)示范課程(項(xiàng)目編號(hào):201902312002);寧波市公益項(xiàng)目(項(xiàng)目編號(hào):2019C10051)