精华内容
下载资源
问答
  • 正交编码器 STM32F107的程序 提供主要的程序 及参考文献
  • 旋钮编码器STM32F407

    2019-01-06 19:48:29
    基于STM32F407的旋钮编码器程序,亲测可用,打印转动时产生的脉冲数
  • 基于STM32编写的多圈绝对值传感器测试程序,编码器协议为串行SSI协议,亲测可用。资源为整个工程,可直接运行。
  • EC11编码器STM32代码

    2018-02-12 11:45:07
    两脚那侧是一个开关,按一下则导通, 三脚那侧:中间的那个脚是接地,旁边两个脚接10K的上拉电阻。
  • 旋转编码开关EC11有一个按键和AB相编码输出,通过相位变化来判断顺时针还是逆时针旋转,由编码产生外部中断配合STM32进行解析,本程序采用软件滤波,得到的编码值直接控制0.96寸OLED的多级菜单显示
  • 测试通过了STM32F0的硬件I2C最大速度1M读取as5600的角度值的工程,同理也可以读写其他寄存器
  • AB旋转编码器用于测量电机的正反转,以及对脉冲计数
  • STM32 编码器

    2016-04-01 14:00:26
    STM32F103C8T6 增量式编码器 STM32F103C8T6 增量式编码器
  • STM32——编码器测速原理及STM32编码器模式

    千次阅读 多人点赞 2021-01-19 22:12:53
    本问讲解了编码器测速原理及STM32编码器模式,文末有STM32编码器模式例程。

    1. 编码器概述在这里插入图片描述

    编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感 器,我们可以通过编码器测量到底位移或者速度信息。编码器从输出数据类型上 分,可以分为增量式编码器和绝对式编码器。

    从编码器检测原理上来分,还可以分为光学式、磁式、感应式、电容式。常 见的是光电编码器(光学式)和霍尔编码器(磁式)。

    2. 编码器原理

    光电编码器是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。光电编码器是由光码盘和光电检测装置组成。光码盘是在一 定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴,电动机旋转时,检测装置检测输出若干脉冲信号,为判断转向,一般输出两组存在一 定相位差的方波信号。

    霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。霍尔编码器是由霍尔码盘和霍尔元件组成。霍尔码盘是在一 定直径的圆板上等分地布置有不同的磁极。霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。

    可以看到两种原理的编码器目的都是获取 AB 相输出的方波信号,其使用方法也是一样,下面是一个简单的示意图。
    在这里插入图片描述

    3. 编码器接线说明

    具体到我们的编码器电机,我们可以看看电机编码器的实物。
    在这里插入图片描述
    在这里插入图片描述

    4. 编码器软件四倍频技术

    下面我们说一下编码器倍频的原理。为了提高大家下面学习的兴趣,我们先明确,这是一项实用的技术,可以真正地把编码器的精度提升 4 倍。作用可类比 于单反相机的光学变焦,而并非牺牲清晰度来放大图像的数码变焦。OK,先看看下面编码器输出的波形图。在这里插入图片描述
    这里,我们是通过软件的方法实现四倍频。首先可以看到上图编码器输出的AB 相波形,正常情况下我们使用 M 法测速的时候,会通过测量单位时间内 A 相输出的脉冲数来得到速度信息。常规的方法,我们只测量 A 相(或 B 相)的上升 沿或者下降沿,也就是上图中对应的数字 1234 中的某一个,这样就只能计数 3次。而四倍频的方法是测量 A 相和 B 相编码器的上升沿和下降沿。这样在同样的 时间内,可以计数 12 次(3 个 1234 的循环)。这就是软件四倍频的原理。

    5. STM32编码器模式

    在STM32中,编码器使用的是定时器接口,通过数据手册可知,定时器1,2,3,4,5和8有编码器的功能,而其他没有。编码器输入信号TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
    在这里插入图片描述
    STM32编码器有三种工作模式,其中模式三即为上文中提到的四倍频模式。
    在这里插入图片描述
    在使用编码器模式时需要注意以下几点:

    • 编码器有个转速上限,超过这个上限是不能正常工作的,这个是硬件的限制,原则上线数越多转速就越低,这点在选型时要注意。
    • 定时器初始化好以后,任何时候CNT寄存器的值就是编码器的位置信息,正转他会加反转他会减这部分是不需要软件干预的,初始化时给的TIM_Period 值应该是码盘整圈的刻度值,在减溢出会自动修正为这个数.加超过此数值就回0.
    • 计数值偶尔也会有出错误的情况,一圈多计一个或少计一个数都是很正常的特别是转速比较高的时候尤其明显,有个绝对位置信号做修正是很有必要的.绝对位置信号不需要一定在零位置点,收到这个信号就将CNT修正为一个固定的数值即可.

    6. STM32编码器模式例程

    此例程用于初始化定时器2和定时器3为编码器模式,得到小车底盘上两个直流电机的运转速度。

    #.c文件
    #include "encoder.h"
    
    /**************************************************************************
    *  函数功能:把TIM2初始化为编码器接口模式
    *
    *  入口参数:无
    *
    *  返 回 值:无
    **************************************************************************/
    void Encoder_Init_TIM2(void)
    {
    	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
    	TIM_ICInitTypeDef TIM_ICInitStructure;  
    	GPIO_InitTypeDef GPIO_InitStructure;
    	
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器2的时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);//使能PA PB端口时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;	//端口配置 PA15
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    	GPIO_Init(GPIOA, &GPIO_InitStructure);					      //根据设定参数初始化GPIOA
      
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;	//端口配置 PB3
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    	GPIO_Init(GPIOB, &GPIO_InitStructure);					      //根据设定参数初始化GPIOB
    	
    	TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    	TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器 
    	TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//边沿计数模式 
    	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);  //初始化定时器2
    	
    	TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3
    	
    	TIM_ICStructInit(&TIM_ICInitStructure); //把TIM_ICInitStruct 中的每一个参数按缺省值填入
    	TIM_ICInitStructure.TIM_ICFilter = 10;  //设置滤波器长度
    	TIM_ICInit(TIM2, &TIM_ICInitStructure);//根据 TIM_ICInitStruct 的参数初始化外设	TIMx
     
    	TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新标志位
    	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//使能定时器中断
    	
    	TIM_SetCounter(TIM2,0);
    	TIM_Cmd(TIM2, ENABLE); //使能定时器2
    }
    
    /**************************************************************************
    函数功能:把TIM3初始化为编码器接口模式
    入口参数:无
    返回  值:无
    **************************************************************************/
    void Encoder_Init_TIM3(void)
    {
      	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
      	TIM_ICInitTypeDef TIM_ICInitStructure;  
      	GPIO_InitTypeDef GPIO_InitStructure;
    	
      	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能定时器3的时钟
      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PA端口时钟
      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
      	
     	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;	//端口配置 PA6 PA7
      	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
      	GPIO_Init(GPIOA, &GPIO_InitStructure);					      //根据设定参数初始化GPIOA
      	
      	TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
      	TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器 
     	TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值
      	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
      	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//边沿计数模式 
      	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  //初始化定时器3
    	
      	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3(TIM_ICPolarity_Rising或者TIM_ICPolarity_Falling效果相同,都是4倍频)
    	
      	TIM_ICStructInit(&TIM_ICInitStructure); //把TIM_ICInitStruct 中的每一个参数按缺省值填入
      	TIM_ICInitStructure.TIM_ICFilter = 10;  //设置滤波器长度
      	TIM_ICInit(TIM3, &TIM_ICInitStructure);//根据 TIM_ICInitStruct 的参数初始化外设	TIMx
     
      	TIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM的更新标志位
      	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//使能定时器中断
      	TIM_SetCounter(TIM3,0);
      	TIM_Cmd(TIM3, ENABLE); //使能定时器
    }
    
    /**************************************************************************
    函数功能:单位时间读取编码器A计数
    入口参数:无
    返回  值:计数值
    **************************************************************************/
    float Read_EncoderA(void)
    {
    	int Encoder_TIM = 0;  
    	float Speed = 0.0;  
    	Encoder_TIM= (short)TIM2 -> CNT;   
    	TIM2 -> CNT=0;
    	return -Encoder_TIM;
    }
    /**************************************************************************
    函数功能:单位时间读取编码器B计数
    入口参数:无
    返回  值:计数值
    **************************************************************************/
    float Read_EncoderB(void)
    {
    	int Encoder_TIM = 0;  
    	float Speed = 0.0;  
    	Encoder_TIM= (short)TIM3 -> CNT;   
    	TIM3 -> CNT=0;
    	return Encoder_TIM;
    }
    
    /**************************************************************************
    *  函数功能:TIM2中断服务函数
    *
    *  入口参数:无
    *
    *  返 回 值:无
    **************************************************************************/
    void TIM2_IRQHandler(void)
    { 		    		  			    
    	if(TIM2->SR&0X0001)//溢出中断
    	{    				   				     	    	
    	}				   
    	TIM2->SR&=~(1<<0);//清除中断标志位 	    
    }
    
    
    /**************************************************************************
    *  函数功能:TIM3中断服务函数
    *
    *  入口参数:无
    *
    *  返 回 值:无
    **************************************************************************/
    void TIM3_IRQHandler(void)
    { 		    		  			    
    	if(TIM3->SR&0X0001)//溢出中断
    	{    				   				     	    	
    	}				   
    	TIM3->SR&=~(1<<0);//清除中断标志位 	    
    }
    
    
    #.h文件
    #define __ENCODER_H
    #include <sys.h>	 
    #include "init.h" //include了所有需要的头文件
    #define ENCODER_TIM_PERIOD (u16)(65535)   //不可大于65535 因为F103的定时器是16位的。
    
    void Encoder_Init_TIM2(void);
    void Encoder_Init_TIM3(void);
    	
    float Read_EncoderA(void);
    float Read_EncoderB(void);
    
    void TIM2_IRQHandler(void);
    void TIM3_IRQHandler(void);
    
    #endif
    
    展开全文
  • stm32f4编码器模式

    万次阅读 多人点赞 2018-09-03 02:42:56
    stm32f4编码器模式 花费一下午时间研究编码器的使用,简单总结如下 E6B2-CWZ1X编码器 stm32f407 定时器编码器模式 一、编码器简介 1、分类 编码器可按以下方式来分类。 (1)增量型: 每转过单位的角度就...

    stm32f4编码器模式

    花费一下午时间研究编码器的使用,简单总结如下

    • E6B2-CWZ1X编码器
    • stm32f407 定时器编码器模式

    一、编码器简介

    1、分类

    编码器可按以下方式来分类。

    (1)增量型:

    每转过单位的角度就发出一个脉冲信号,通常为A相、B相(某些包括Z相)输出。A相、B相为相互延迟1/4周期的脉冲输出(即正交信号),根据延迟关系可以区别正反转,而且通过取A相、B相的上升和下降沿可以进行2或4倍频。Z相为单圈脉冲,即每圈发出一个脉冲,常用于校正累计误差。

    (2)绝对值型:

    对应一圈,每个基准的角度发出一个唯一与该角度对应二进制的数值,通过外部记圈器件可以进行多个位置的记录和测量。

    2、编码器中的线、位、分辨率

    请参考:链接

    3、编码器原理


    前文提到编码器通过发送正交脉冲信号表示角度信息,如图为一个示例。(其中TI1和TI2分别对应编码器输出A、B项)

    脉冲信号特性表示信息
    两项先后关系旋转方向
    脉冲个数转过角度

    注意到A、B项信号都可能出现毛刺,需要算法修正毛刺


    二、stm32f4编码器模式

    1、简介

    我们可以利用外部中断分别捕获A、B项边沿,手写逻辑消除毛刺并解析编码器数据,但这是比较复杂的。其实这里的脉冲输入是一种特殊的输入捕获情况,因此stm32专门在定时器中提供了编码器模式,可大大简化解析过程。

    (1)、stm32f407中定时器1、2、3、4、5、8提供编码器接口模式
    (2)、可以对输入信号TI1,TI2进行滤波处理,数字滤波器由事件器组成,每N个事件才视为一个有效边沿,可以在TIMx_CCMR1、TIMx_CCMR2中的IC1F位域设置
    (3)、stm32提供了单项计数(只能测速度)和双项计数模式(可测速度&方向),双项模式可以更好地消除毛刺干扰,一般使用双项模式,具体见下图
    这里写图片描述
    下图为双项模式下计数效果,可见在A、B中仅一项有毛刺时,计数值加减后保持不变,实现了抖动补偿
    这里写图片描述

    (4)、 编码器A、B相输入的信号TI1、TI2经滤波和反相后成为TI1FP1 或 TI2FP2 ,定时器的时钟由他们上的每次有效信号转换提供,也就是说最终计数值即反映转过角度。
    (5)、 TI1FP1 或 TI2FP2反相可以改变计数方向,如下图:
    这里写图片描述
    (6)、定时器配置为编码器接口模式时,会提供传感器当前位置的相关信息。使用另一个配置为捕获模式的定时器测量两个编码器事件之间的周期,可获得动态信息(速度、加速度和减速度)。
    (7)、计数溢出后,定时器会装载“重装载值”,并清零重新计数,此值可设置为编码器旋转一周的脉冲个数,这样既可利用溢出中断次数判断转了几圈。但若只要求旋转角度,此值可以任意。任意时刻角度为:溢出中断次数*重装载值+当前计数值
    (8)、TIMx_CR1寄存器的 DIR 位指示当前旋转方向

    2、示例代码

    (1)定时器初始化设置

    void TIM3_Int_Init() 
    {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
        TIM_ICInitTypeDef TIM_ICInitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
    
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); 
    
    //定时器设置-------------------------------------------------------------    
      TIM_TimeBaseInitStructure.TIM_Period = 3600;  //重装载值
        TIM_TimeBaseInitStructure.TIM_Prescaler=0x0;  //预分频
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割
    
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
    
    //编码器模式设置--------------------------------------------------------------                 
    
        TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//计数模式3
    
        TIM_ICStructInit(&TIM_ICInitStructure); 
        TIM_ICInitStructure.TIM_ICFilter = 10;//滤波器值
        TIM_ICInit(TIM3, &TIM_ICInitStructure);
    //溢出中断设置--------------------------------------------------------------  
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许TIM3溢出中断
    
        NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; 
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; 
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; 
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);
    
     //Reset counter-----------------------------------------------
      TIM_SetCounter(TIM3,0); //TIM3->CNT=0
      TIM_Cmd(TIM3, ENABLE); 
    }
    

    (2)在中断服务函数中进行圈数计算

    int circle_count=0;//全局变量-圈数
    void TIM3_IRQHandler(void)
    {
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
        {       
            if((TIM3->CR1>>4 & 0x01)==0) //DIR==0
                circle_count++;
            else if((TIM3->CR1>>4 & 0x01)==1)//DIR==1
                circle_count--;
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update); 
    }
    

    (3)获取当前角度值

    int Encoder=0;
    extern int circle_count;
    
    Encoder=TIM_GetCounter(TIM3)+3600*circle_count;//当前角度
    • 上述代码在stm32f407平台测试通过
    • 使用另一个配置为捕获模式的定时器测量两个编码器事件之间的周期,可获得动态信息(速度、加速度和减速度)。
    展开全文
  • 关于光电编码器的程序,亲测能用,可以放心使用,主要用光电检测电机转子转速,增量式,基于STM32F103的
  • stm32 编码器接口,stm32编码器接口模式,C,C++源码
  • STM32编码器

    2017-11-05 20:54:43
    STM32上读取并计算(光或者电磁)编码器的数值,然后计算电机转速并返回速度值。
  • stm32正交编码器例程

    2021-02-07 03:00:51
    STM32的正交编码器例程,5线编码器A B Z GND和VCC,OC门输出记得接上拉 STM32的正交编码器例程,5线编码器A B Z GND和VCC,OC门输出记得接上拉
  • STM32编码器Demo

    2019-02-15 16:25:59
    stm32f10x系列读取正交编码器的教程,使用了timer3,一定是正交ab相输出的编码器
  • stm32编码器模式

    2018-05-05 23:04:48
    stm32编码模式配置c和头文件,参照官方stm32进行配置的
  • STM32正交编码器例程

    2021-08-25 02:30:20
    STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。
  • STM32编码器测速代码

    2019-04-15 23:50:00
    STM32使用定时器的编码器模式进行测速 适用于带编码盘的直流减速电机 适用于增量编码器
  • STM32+编码器

    2018-04-27 22:34:04
    STM32+EC11编码器,有助于新手学习,高手借鉴。可能不够全面,希望互相学习。
  • STM32编码器程序

    热门讨论 2014-01-06 16:57:43
    STM32 编码器 程序 亲测可用,串口输出
  • EC11编码器的详细STM32程序,可以检测正转反转,转动位置,支持高速转动,不丢码,代码注释齐全,由串口向上位机打印信息。适合新手学习。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,026
精华内容 3,210
关键字:

编码器stm32