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