定時(shí)器回調(diào)函數(shù)怎么寫_STM32CubeMXEC11旋轉(zhuǎn)編碼器普通IO口外部中斷+定時(shí)器實(shí)_第1頁
定時(shí)器回調(diào)函數(shù)怎么寫_STM32CubeMXEC11旋轉(zhuǎn)編碼器普通IO口外部中斷+定時(shí)器實(shí)_第2頁
定時(shí)器回調(diào)函數(shù)怎么寫_STM32CubeMXEC11旋轉(zhuǎn)編碼器普通IO口外部中斷+定時(shí)器實(shí)_第3頁
定時(shí)器回調(diào)函數(shù)怎么寫_STM32CubeMXEC11旋轉(zhuǎn)編碼器普通IO口外部中斷+定時(shí)器實(shí)_第4頁
定時(shí)器回調(diào)函數(shù)怎么寫_STM32CubeMXEC11旋轉(zhuǎn)編碼器普通IO口外部中斷+定時(shí)器實(shí)_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Signal信號(hào)CCAV.逆時(shí)針方向A(TenninalA-C)A(A-C端子間B(Teiinii)aB-C)ECE-C端子間)OFFONOFFONcw順時(shí)針方向A(TeniiinalA-C)A(扣匚端子間)B(TenmiialB-C)端了仙)OFFONOFFNumb住ofimh嚴(yán)如;召0口ro址ti20pul沁Z?fbitad)卩1訊弭5-4.Ptas:difference相位差從這個(gè)數(shù)據(jù)手冊(cè)中,我動(dòng)作,一個(gè)相對(duì)的電平McasuiementshallbemadeundertheiauditionwliichttediafiisicUitedio360耳計(jì)(constantspeed).以/啲

2、速度測(cè)量耳OM圖WC.CAV逆時(shí)針方向A信號(hào)乂間)SignalABIS號(hào)3C間SignalBCW煩時(shí)片方向_A信號(hào)間)們可以設(shè)計(jì)出我們的思路AT,主要就是,以A信OFONOFONOF號(hào)作為一個(gè)時(shí)鐘信號(hào),01NIn(6g-4J見圖4也就是基準(zhǔn)信號(hào),檢測(cè)到A之后,再去判斷B的列如,當(dāng)檢測(cè)到A信號(hào)下降沿觸發(fā),臉測(cè)B信號(hào)此時(shí)如果是高電平那SignalB是逆時(shí)針,如果是低電平,那就是順時(shí)針。ON定時(shí)器回調(diào)函數(shù)怎么寫_STM32CubeMXEC11旋轉(zhuǎn)編碼器普通10口外部中斷+定時(shí)器實(shí)。文章目錄EC11旋轉(zhuǎn)編碼器中斷標(biāo)志位外部函數(shù)中實(shí)現(xiàn)中斷回調(diào)函數(shù)中實(shí)現(xiàn)中斷函數(shù)中實(shí)現(xiàn)項(xiàng)目背景是在STM32平臺(tái)上的普通10

3、口PE13PE14使用外部中斷+定時(shí)器實(shí)現(xiàn),這里因?yàn)樵O(shè)計(jì)沒有選擇可以支持ENCODEMODE的端口。EC11旋轉(zhuǎn)編碼器Sliaftrotalioualdirection軸回轉(zhuǎn)方向/*漩轉(zhuǎn)編碼開關(guān),版本1*/uint8_tECIIDirection(void)whileif(A_flag=1)/A下降沿觸發(fā)外部中斷,A_flag=1if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14)=1)檢測(cè)B信號(hào)電平printf(正轉(zhuǎn)rn);Direction_flag=1;break;elseif(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14)=0)print

4、f(反轉(zhuǎn)rn);Direction_flag=2;break;returnDirection_flag;這個(gè)是最簡(jiǎn)單的判斷方法,這個(gè)方法不是特別完善,容易出現(xiàn)干擾和誤判斷現(xiàn)象。不過整體是思路是這樣走的。中斷標(biāo)志位外部函數(shù)中實(shí)現(xiàn)第一個(gè)實(shí)現(xiàn)版本,因?yàn)槠鸪鯇?duì)于中斷的不熟悉,沒有直接在中斷中直接寫,而是只使用了中斷產(chǎn)生的標(biāo)注為來作為判斷。這個(gè)的設(shè)計(jì)思路主要是,A信號(hào)中斷,消抖,確定A信號(hào)下降沿觸發(fā),打開定時(shí)器,1Oms檢測(cè)B信號(hào)是否上/下降沿觸發(fā),關(guān)閉定時(shí)器,判斷B信號(hào)的電平高低。中檢訓(xùn)是否榊上/旌沿觸發(fā)外部中斷Hrri5內(nèi)蝕發(fā),TIM2_fll?關(guān)閉定時(shí)an*伽內(nèi)瞰發(fā)中斷,關(guān)軟件設(shè)計(jì)流程圖如下閉定時(shí)

5、器在函數(shù)中實(shí)際代碼如下延時(shí)HAL_Delay(q防抖,羋flnr1/*漩轉(zhuǎn)編碼開關(guān),版本2*/返回值1正轉(zhuǎn)返回值2反轉(zhuǎn)uint8_tEC11Direction_2(void)charDirection_flag=0;whileif(A_flag=1)/A下降沿觸發(fā)外部中斷HAL_Delay(1);延時(shí)消抖if(HAL_GPIO_ReadPin(GPIOE,GPI0_PIN_13)=0)/A下降沿觸發(fā)1ms后判斷是否穩(wěn)定在了低電平HAL_TIM_Base_Start_IT(&htim2);開啟定時(shí)器while(TIM2_flag1),關(guān)閉TIM2_flag=0;/清除定時(shí)器標(biāo)志位A_flag=0

6、;/清除A中斷的標(biāo)志位if(Direction_flag=1|Direction_flag=2)break;returnDirection_flag;在main.c中的定時(shí)器的標(biāo)志位設(shè)置,使用了TIM2定時(shí)器,溢出就+1voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim)-”-一2HAL_IncTick();TIM2_flag+;斥7IN2ir.itfunctionvoidNX_7IN2_nitEaic)3636465舫676S69707172374757b777S379808182TIM2的時(shí)鐘輸入是75MHZ,所以設(shè)置分在stm

7、32f4xx_hal_gpio.c文件中,我們j找到外位就可以了。在tim.c文件中TIM2的配置P7TZlfl_ClockConfiaTypeCefsClckSourceCcnfig=3;TZsterCon:igS-peDgfeBaster;onfi=0;h:inZhTin2.h:inZhTin2.h:inZhTin2.ILonv.stance匚it.Pre匚it.Co匚it.Per?匚it.Clock匚it.AiiTEeloai:iHAL_TN_EaDe_Init(Mitini2jaler=750-1:termed-=7IN_COUN1BRrO2E_UP;HrrCT_HandlerC1;二

8、130-1iXKD:?ISION_DIYlTH_AL7CREL0AD_FRELCAD_DIS.LE=Hk_0M)=TIM.CIOCKS2URCE.:TEF.HAL;ECloScurceConfi.SlockSojrce_.i:;HAL_TIN_Cor.fiC1oSource(&ktin.2,iisClock3curceCon:ig)!=船L_OK)HrrCT_HandlerC1:eHasterZoifi.asterOjtpiiTTriger=TZ?fl_TT.GC_SESE7;EnasterZofig.asterSlavellde=TIKjA;TEF.SLA7EH2Di_DISABLE;分頻和

9、計(jì)數(shù)分別為750-嚴(yán)和昶1001,這樣的話妣個(gè)時(shí)間周期就是1mS1頻率是10o0hZ。申找到外部中斷對(duì)應(yīng)的回調(diào)函數(shù)HAL_GPIO_EXTLCallback,直接判斷到外部電平觸發(fā)后返回標(biāo)志voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin)/*Preventunusedargument(s)compilationwarning*/UNUSED(GPIO_Pin);/*NOTE:ThisfunctionShouldnotbemodified,whenthecallbackisneeded,theHAL_GPIO_EXTI_Callbackcouldbeimp

10、lementedintheuserfile*/if(GPIO_Pin=A_Pin)A_flag=1;if(GPIO_Pin=B_Pin)B_flag=1;這樣寫,雖然可以實(shí)現(xiàn)對(duì)于旋轉(zhuǎn)編碼器的檢測(cè),但是有一個(gè)問題,沒有辦法很方便的運(yùn)用到實(shí)際工程中,以為進(jìn)入到這個(gè)函數(shù)后才能進(jìn)行編碼器的判斷,顯然我們的編碼器要實(shí)現(xiàn)的是一個(gè)翻頁的功能,觸發(fā)就要有操作的,而不是等著。雖然可以設(shè)計(jì)進(jìn)去超時(shí)函數(shù)讓編碼器跳出,但是還是沒有辦法實(shí)現(xiàn)實(shí)際項(xiàng)目的需要。于是準(zhǔn)備直接寫到中斷回調(diào)函數(shù)中。中斷回調(diào)函數(shù)中實(shí)現(xiàn)按理說直接寫到中斷回調(diào)函數(shù)應(yīng)該挺容易的,直接改就行了,邏輯反正是通的,但是遇到了幾個(gè)問題,一個(gè)是延時(shí)消抖的問題。HA

11、L_Delay本質(zhì)也是一個(gè)中斷服務(wù)函數(shù),這種延時(shí)函數(shù)中斷的嵌套是非常危險(xiǎn)的操作,很容易卡死程序,比較有隱患,所以HAL_Delay函數(shù)是不能用了。同時(shí),因?yàn)榛卣{(diào)函數(shù)是這樣來使用的voidEXTI15_10_IRQHandler(void)中檢測(cè)到外部中斷,調(diào)用HAL_GPIO_EXTI_IRQHandler(GPIO_PIN);函數(shù),然后再調(diào)用里面的回調(diào)函數(shù)voidHAL_GPIO_EXTI_Callback(uintl6_tGPIO_Pin)。我們這個(gè)里面用到了兩個(gè)外部中斷,PE13和PE14,也就是都會(huì)使用同一個(gè)回調(diào)函數(shù),也就是無法完成這種操作if(GPIO_Pin=A_Pin)/A下降沿

12、觸發(fā)外部中斷if(GPIO_Pin=B_Pin)這里就是舉了個(gè)例子,因?yàn)榛卣{(diào)函數(shù)的調(diào)用邏輯,沒有辦法在檢測(cè)了A信號(hào)觸發(fā)后在操作里面檢測(cè)B信號(hào)的觸發(fā)。這是做不到的,這是回調(diào)函數(shù)限制了操作。為了避免這種,最好的方法還是直接寫在voidEXTI15_10RQHandler(void)函數(shù)中,HAL_GPIO_EXTI_IRQHandler(GPIO_PIN);函數(shù)和voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin)都不使用,把他們實(shí)現(xiàn)的服務(wù)函數(shù)還有中斷標(biāo)志位清除操作全都直接寫在AL_GPIO上XTI_IRQHandler(GPIO_PIN);函數(shù)中,這個(gè)也就是我

13、后面的一個(gè)方法。注入GPI0夕嘟中斷檢測(cè)的回調(diào)函數(shù)A卞降沿觸發(fā)回調(diào)函數(shù)中想要實(shí)現(xiàn),可以采用這個(gè)方法fiOor1來確定正轉(zhuǎn)反voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin)/*Preventunusedargument(s)compilationwarning*/UNUSED(GPIO_Pin);if(GPIO_Pin=A_Pin)/A下降沿觸發(fā)外部中斷/printf(A下降沿觸發(fā)rn);HAL_TIM_Base_Start_IT(&htim2);/開始TIM2定時(shí)器Bast=HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14);記錄此狀

14、態(tài)的B狀態(tài)while(TIM2_flag=60)/定時(shí)器一個(gè)周期1ms,計(jì)時(shí)20ms內(nèi)看看B有沒有電跳變/printf(-等待B的觸發(fā)rn);if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14)!=B_last)在20ms內(nèi),檢測(cè)到電平變化/printf(B下降沿觸發(fā)rn);HAL_TIM_Base_Stop_IT(&htim2);/printf(TIM2定時(shí)器關(guān)閉rn);TIM2_flag=0;if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14)=1)printf(Arn);break;elseif(HAL_GPIO_ReadPin(GPIOE

15、,GPIO_PIN_14)=0)printf(Brn);break;break;HAL_TIM_Base_Stop_IT(&htim2);TIM2_flag=0;也就是相較于之前,去掉了消抖的函數(shù),然后也不是檢測(cè)B的邊沿觸發(fā),而是判斷B信號(hào),在一個(gè)時(shí)間范圍內(nèi),有沒有發(fā)生電平的變化,直接檢測(cè)B信號(hào)電平高低的變化,實(shí)現(xiàn)了一樣的目的。中斷函數(shù)中實(shí)現(xiàn)直接寫在voidEXTI15_10RQHandler(void);函數(shù)中無非就是多了步在中斷觸發(fā)之后需要手動(dòng)清除中斷標(biāo)志位,其他都大同小異的思路,這里就可以檢測(cè)A中斷觸發(fā)后,然后檢測(cè)B中斷觸發(fā),就不會(huì)出現(xiàn)什么問題了。STM32CubeMX外部中斷定時(shí)器嵌套

16、問題及實(shí)驗(yàn)現(xiàn)象寫在回調(diào)函數(shù)中的這些實(shí)驗(yàn)現(xiàn)象和問題,現(xiàn)在的話就都不存在了。voidEXTI15_10口RQHandler(void)/*USERCODEBEGINEXTI15_10_IRQn0*/*USERCODEENDEXTI15_10_IRQn0*/HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);/HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);/HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);/*USERCODEBEGINEXTI15_10_IRQn1*/if(_HAL_GPIO_EXTI_GET_IT(G

17、PIO_PIN_13)!=RESET)/A下降沿觸發(fā)/printf(A下降沿觸發(fā)rn);_HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);HAL_TIM_Base_Start_IT(&htim2);開始TIM2定時(shí)器while(TIM2_flag=10)/定時(shí)器一個(gè)周期1ms,計(jì)時(shí)20ms內(nèi)看看B有沒有電跳變if(_HAL_GPIO_EXTI_GET_IT(GPIO_PIN_14)!=RESET)/printf(B下降沿觸發(fā)rn);_HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_14);HAL_TIM_Base_Stop_IT(&htim2);/printf(TIM2定時(shí)器關(guān)閉rn);TI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論