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] 这个数组里,就可以使用了。
好了,这次博客就说这么多了,谢谢大家,希望大家能够提出宝贵意见,之后博客会持续更新,欢迎大家关注,给大家拜年啦!!!