


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