定時器回調函數怎么寫_STM32CubeMXEC11旋轉編碼器普通IO口外部中斷+定時器實_第1頁
定時器回調函數怎么寫_STM32CubeMXEC11旋轉編碼器普通IO口外部中斷+定時器實_第2頁
定時器回調函數怎么寫_STM32CubeMXEC11旋轉編碼器普通IO口外部中斷+定時器實_第3頁
定時器回調函數怎么寫_STM32CubeMXEC11旋轉編碼器普通IO口外部中斷+定時器實_第4頁
定時器回調函數怎么寫_STM32CubeMXEC11旋轉編碼器普通IO口外部中斷+定時器實_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、口PE13PE14使用外部中斷+定時器實現,這里因為設計沒有選擇可以支持ENCODEMODE的端口。EC11旋轉編碼器Sliaftrotalioualdirection軸回轉方向/*漩轉編碼開關,版本1*/uint8_tECIIDirection(void)whileif(A_flag=1)/A下降沿觸發外部中斷,A_flag=1if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14)=1)檢測B信號電平printf(正轉rn);Direction_flag=1;break;elseif(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14)=0)print

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

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

6、;/清除A中斷的標志位if(Direction_flag=1|Direction_flag=2)break;returnDirection_flag;在main.c中的定時器的標志位設置,使用了TIM2定時器,溢出就+1voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim)-”-一2HAL_IncTick();TIM2_flag+;斥7IN2ir.itfunctionvoidNX_7IN2_nitEaic)3636465舫676S69707172374757b777S379808182TIM2的時鐘輸入是75MHZ,所以設置分在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、計數分別為750-嚴和昶1001,這樣的話妣個時間周期就是1mS1頻率是10o0hZ。申找到外部中斷對應的回調函數HAL_GPIO_EXTLCallback,直接判斷到外部電平觸發后返回標志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;這樣寫,雖然可以實現對于旋轉編碼器的檢測,但是有一個問題,沒有辦法很方便的運用到實際工程中,以為進入到這個函數后才能進行編碼器的判斷,顯然我們的編碼器要實現的是一個翻頁的功能,觸發就要有操作的,而不是等著。雖然可以設計進去超時函數讓編碼器跳出,但是還是沒有辦法實現實際項目的需要。于是準備直接寫到中斷回調函數中。中斷回調函數中實現按理說直接寫到中斷回調函數應該挺容易的,直接改就行了,邏輯反正是通的,但是遇到了幾個問題,一個是延時消抖的問題。HA

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

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

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

14、態的B狀態while(TIM2_flag=60)/定時器一個周期1ms,計時20ms內看看B有沒有電跳變/printf(-等待B的觸發rn);if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_14)!=B_last)在20ms內,檢測到電平變化/printf(B下降沿觸發rn);HAL_TIM_Base_Stop_IT(&htim2);/printf(TIM2定時器關閉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;也就是相較于之前,去掉了消抖的函數,然后也不是檢測B的邊沿觸發,而是判斷B信號,在一個時間范圍內,有沒有發生電平的變化,直接檢測B信號電平高低的變化,實現了一樣的目的。中斷函數中實現直接寫在voidEXTI15_10RQHandler(void);函數中無非就是多了步在中斷觸發之后需要手動清除中斷標志位,其他都大同小異的思路,這里就可以檢測A中斷觸發后,然后檢測B中斷觸發,就不會出現什么問題了。STM32CubeMX外部中斷定時器嵌套

16、問題及實驗現象寫在回調函數中的這些實驗現象和問題,現在的話就都不存在了。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下降沿觸發/printf(A下降沿觸發rn);_HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);HAL_TIM_Base_Start_IT(&htim2);開始TIM2定時器while(TIM2_flag=10)/定時器一個周期1ms,計時20ms內看看B有沒有電跳變if(_HAL_GPIO_EXTI_GET_IT(GPIO_PIN_14)!=RESET)/printf(B下降沿觸發rn);_HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_14);HAL_TIM_Base_Stop_IT(&htim2);/printf(TIM2定時器關閉rn);TI

溫馨提示

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

評論

0/150

提交評論