旋转编码器(STM32)
生活随笔
收集整理的這篇文章主要介紹了
旋转编码器(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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MULTISIM 仿真 数据选择器构成无
- 下一篇: HSY 点餐(数论)