日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

旋转编码器(STM32)

發布時間:2024/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 旋转编码器(STM32) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于STM32的旋轉編碼器(多個中斷的使用)


旋轉編碼器的原理

正轉A相為高,B相為低,反之相反

學習內容如下

#include "stm32f10x.h" // Device header int16_t Encoder_Count;//定義一個帶符號的變量void Encoder_Init(void) {//配置RCCRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;//使用到PB0和PB1口GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//配置AFIOGPIO_EXTILineConfig(RCC_APB2Periph_GPIOB,GPIO_PinSource0);GPIO_EXTILineConfig(RCC_APB2Periph_GPIOB,GPIO_PinSource1); //AFIO每個中斷是分開的//配置EXTIEXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line=EXTI_Line1|EXTI_Line0;//使用到中斷0和中斷1EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿觸發EXTI_Init(&EXTI_InitStructure);//配置NVIC,這里配置了倆個中斷NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//調用一次即可,只能有一個,有多個必須保證相同NVIC_InitTypeDef NVIC_InitStructure;//結構體命名一次即可NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//中斷0的配置NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//搶占優先級為1NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//響應優先級為1NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//中斷1的配置NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=2 ;//響應優先級為2,即中斷1的優先級略低于中斷0的優先級NVIC_Init(&NVIC_InitStructure);//NVIC初始化}int16_t Return_Encoder_Count(void) //返回Encoder_Count的值,如果正轉就返回+1,反轉就返回-1。方便共主函數操作 {int16_t Temp;Temp=Encoder_Count; Encoder_Count=0;return Temp;}//中斷0函數 void EXTI0_IRQHandler(void) {if(EXTI_GetFlagStatus(EXTI_Line0)==SET){EXTI_ClearITPendingBit(EXTI_Line0);//清除中斷標志位,以便下一次進入中斷if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1) //如果正轉{Encoder_Count++; }}} //中斷1函數 void EXTI1_IRQHandler(void) {if(EXTI_GetFlagStatus(EXTI_Line1)==SET){EXTI_ClearITPendingBit(EXTI_Line1);if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==1) //如果反轉{Encoder_Count--;}}}

定義Number,編碼器正轉其數值增大,反之減小

#include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Encoder.h" int16_t Number;int main(void) {OLED_Init();Encoder_Init();OLED_ShowString(1, 1, "Number:");//可以用該函數顯示空行來達到清屏的目的while (1){Number+=Return_Encoder_Count();OLED_ShowNum(1,8,Number,4);} }

總結

以上是生活随笔為你收集整理的旋转编码器(STM32)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。