STM32F4單片機讀取光電編碼器的小理解
大家好! 我是木兔同學,這是我第一次發CSDN的博客,本人接觸的單片機主要是STM32f407,今天談一談STM32F4單片機讀取光電編碼器的小理解,希望大家多多批評指正,>__<
講述方式
1.對單片機的理解往往是對暫存器的理解操作
2. 通過代碼的描述來理解
3. 增加了暫存器的手冊部分
編碼器原理: 

說白了就是編碼器把輪子的轉速轉換成差個相位的兩路可測頻率的方波,單片機通過讀取方波的個數來測速,
一、先看一下配置32定時器編碼器的代碼:
void TIM2_ENC_Init(void)//Motor_A
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //開漏輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource15,GPIO_AF_TIM2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_TIM2);//引腳復用
TIM_EncoderInterfaceConfig(TIM2,TIM_EncoderMode_TI1,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);//編碼器介面配置
TIM_Cmd(TIM2, ENABLE);
}
當然,這塊代碼中最重要的就是
//編碼器介面配置
TIM_EncoderInterfaceConfig(TIM2,TIM_EncoderMode_TI1,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
可以探尋暫存器一下
這個函式有4個引數
第一個是選定定時器
第二個是編碼器模式:指定TIMx編碼器模式
第三四個是指定IC1、IC2極性
第一個不用多說,選哪個定時器,我查了一下,stm32f407直接支持外接編碼器的是定時器TIM1—TIM5和TIM8.
第二個是編碼器模式:一共有3種

對應的暫存器是:TIMx 從模式控制暫存器 (TIMx_SMCR)的位 2:0 SMS:

第三四個是指定IC1、IC2極性:

對應的暫存器是:TIMx 捕獲/比較使能暫存器 (TIMx_CCER)的0-3位:


二、STM32F407的中文參考手冊中也有總體的概括:






(在這里給大家貼的全一點,就不用大家再去翻中文手冊嘍>-<)
三、最后說一下定時器對編碼器的資料提取:

說一下為什么是TIM2->CR1&0x01
又到了暫存器環節(看吧,暫存器真的好重要的)


因為是16位暫存器,0x10就是0000 0000 0001 0000
就是位4,計數的方向,為1就是遞減計數,就是一開始暫存器是最大值,讀取幾個就減幾個,所以有了
Encoder_Date[0] = 0xffffffff-TIM2->CNT;
編碼器提供的資料就儲存在Encoder_Date[0] 這個陣列里,就可以使用了,
好了,這次博客就說這么多了,謝謝大家,希望大家能夠提出寶貴意見,之后博客會持續更新,歡迎大家關注,給大家拜年啦!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259551.html
標籤:其他
