精华内容
下载资源
问答
  • stm32正交解码

    2015-07-16 09:51:22
    基于arm3的stm32 定时器的正交解码程序。用于编码器的脉冲计数和编码器的熟读反馈。 最大计数值65536
  • 关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧 看一下我用过的一种编码器 ...如果直接利用STM32正交解码功能,,直接读这个值,,这样呢就会出现很麻烦的问题,,,,
  • 1、STM32CubeIDE 2、STM32F030C8T6 3、使用定时器3(TIM3) 配置 TIM3配置为编码器模式。由于1和2通道已被编码器占用,所以为灰色。 在main.c中STM32Cube已自动生成,并已自动调用。 static void MX_TIM3_Init...

    环境

    环境为:
    1、STM32CubeIDE
    2、STM32F030C8T6
    3、使用定时器3(TIM3)

    配置

    在这里插入图片描述
    TIM3配置为编码器模式。由于1和2通道已被编码器占用,所以为灰色。
    在这里插入图片描述
    在main.c中STM32Cube已自动生成,并已自动调用。

    static void MX_TIM3_Init(void);
    

    只需在程序中手动调用以下代码即可

    HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
    

    然后定期获取编码器的值即可

    short encoder = (short)(__HAL_TIM_GET_COUNTER(&htim3));
    

    正反转问题

    在网上有不少人被编码器的正反转判断问题困扰。STM32的正交解码使用的是一个16bit寄存器储存解码值,当正转时数字上升,反转时下降,当低于0时会向下溢出变为0xFFFF。
    利用此性质,可直接强转寄存器值为short,采用补码的形式编码,完美解决此问题。
    效果如下:
    正转
    反转

    展开全文
  • stm32正交编码模式

    2016-03-01 19:07:02
    基于stm32定时器高级功能正交编码模式,配合编码器可准确得出刚体转动方向,角速度,加速度,速度,和角度。
  • 关于STM32正交解码通道的选择以及遇到正反转读取通道值的问题 (以下内容基于STM32f407ZET6) 对于F407来说,可以用作编码器模式的只有高级定时器TIM1和TIM8,通用定时器有TIM2 TIM3 TIM4 TIM5。且每个定时器只有...

    关于STM32正交解码通道的选择以及遇到正反转读取通道值的问题

    (以下内容基于STM32f407ZET6)

    对于F407来说,可以用作编码器模式的只有高级定时器TIM1和TIM8,通用定时器有TIM2 TIM3 TIM4 TIM5。且每个定时器只有通道1和通道2能作为正交解码。还要注意一下定时器5和定时器2是32位定时器,装载数值时注意要装载0xffffffff。

    本人在配置正交解码时读取编码器的值出现当读取数字为负时数字会变为65535的情况,当时我用的是long int 型变量来储存读取到的速度值,经过查阅资料发现STM32的正交解码使用的是一个16bit寄存器储存解码值,当正转时数字上升,反转时下降,当低于0时会向下溢出变为0xFFFF。利用此性质,可直接强转寄存器值为short,采用补码的形式编码,即用short型变量来储存读取到的速度,完美解决此问题。

    展开全文
  • 关于stm32正交解码

    千次阅读 2016-12-16 01:09:00
    关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧 看一下我用过的一种编码器 编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,,,说明这个编码器转一圈...

    关于正交解码,我先解释何为正交解码,,,,其实名字挺高大上的,,,,还是先说编码器吧

    看一下我用过的一种编码器

    编码器的 线 数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,,,说明这个编码器转一圈对应的信号线会输出500个脉冲,,,,为什么说是对应的,,,对于上面的编码器而言是这样的,,,,但是有的编码器里面有好多线,,,有的信号线是转一圈就输出对应多少线的脉冲,,,有的信号线是转一圈就输出一个脉冲,,,,这就要看编码器的资料了......

    看我上面用过的这个编码器,,使用A,B,VCC,GND这四根线,,

    编码器转一圈A信号线会输出500个脉冲,,,,B信号线也会输出500个脉冲,,不过

    正转的时候

    反转的时候

    正转的时候信号线A先输出信号,B信号线后输出

    反转的时候信号线B先输出信号,A信号线后输出

    假设只是单纯的测正转脉冲或者单纯的测反转脉冲,那么只需要用单片机随意选择一个信号线就行了,,然后就是脉冲计数,,,,

    如果说要是一个电机既有正转又有反转,,,,我想知道这个电机绝对正转了多少圈

    那么就需要用正转的圈数减去反转的圈数了,,,,,,那么问题来了,,,怎么测正转圈数和反转圈数

    其实传统的做法

    关于D触发器,,,,当clk引脚来一个上升沿,D引脚是什么电平,,那么Q就输出什么电平,,Q非,,与Q相反

    现在如果说电机正转

    可以看到每当B来上升沿的时候,A信号总为高电平,,,所以Q会输出高电平

    设置A为上升沿进入其,,,中断函数

    然后判断一下Q是否为高电平,如果为高电平正转变量自加一

    如果电机反转

     

    可以看到每当B来上升沿的时候,A信号总为低电平,,,所以Q会输出低电平

    设置B为上升沿进入其,,,中断函数

    然后判断一下Q是否为低电平,如果为低电平反转变量自加一

     然后 正转变量减去反转变量就能得到电机到底正转了多少圈......这样就会得到一个相对的变量,,这个变量呢,就是单片机正交解码的值

    说白了单片机的正交解码功能就是得到一个正反转,,,相对的变量,,,,这个变量呢,,你正转的时候他会加,你反转的时候他会减,

    不过呢,,,,STM32的这个变量有点坑,,,是太坑了,,,他内部定义的这个变量的类型是无符号整形,,,也就是说0---65535,,,,,,,,,,,,,

    如果直接利用STM32的正交解码功能,,直接读这个值,,这样呢就会出现很麻烦的问题,,,,

    假设你正转转到10,然后反转转到0之后还是反转,,他就会开始从65535开始往下减了,,,,假设转到了60000,,你又开始正转了,一直越过65535之后,他又开始从0开始往上加了,,,,要是你的电机就是这样的反反复复,而且正转与反转次数每次都在变化,,,,,,,你如何写程序来得到到底正转了多少圈??????????所以说STM32真是太坑了,,,害的我和我同学写算法测试算法耽搁了两天,,,,,,,最后还是会出现BUG,,,,,,,,网上也有大神写类似的算法来计算出到底转的圈数,,,,,,,,,,,,,,

    最总我决定用最本质的方法也就是利用D触发器,,,,,,,不过因为手头并没有D触发器,,,但是STM32正交解码内部实质就是用的D触发器来做判断的,,,,,

    而且他提供了一个寄存器来判断是正转还是反转

    if((TIM3->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)//向下计数

    else

    就是向上计数......也就是能指明正反转,,,,,

    所以我就打开他的正交解码功能,,就是把A,B信号线既接正交解码引脚上,又接在脉冲计数中断引脚上

    void EXTI0_IRQHandler(void)//反转中断
    {
    if(EXTI_GetITStatus(EXTI_Line0) != RESET) //???????EXTI Line??
    {
    EXTI_ClearITPendingBit(EXTI_Line0); //???????
    if((TIM3->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)//???
    {
    cnt--;

    }
    }
    }

    /*************** ????1??,???? B1 *********************/
    void EXTI1_IRQHandler(void)//正转中断
    {
    if(EXTI_GetITStatus(EXTI_Line1) != RESET) //???????EXTI Line??
    {
    EXTI_ClearITPendingBit(EXTI_Line1); //???????
    if((TIM3->CR1 & TIM_CounterMode_Up) == TIM_CounterMode_Up)//???
    {

    if((TIM3->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down);//???
    else
    cnt++;

    }
    }
    }

     

     这样的话省了D触发器了,,,,,,,

    看了一眼K60的正交解码的变量

    虽然是32位了但是,,,,,,,是无符号的,,,,,,如果只用正交解码功能,,反转又要考虑算法了,,,,,,,,,,,,,,,,,,,,,

     

     最后附上程序下载地址,,,,B1,A6接正转的那条信号线,,,,B0,A7接反转的那条信号线,,串口1,PA9..PA10,,,波特率115200会打印出来到底转了多少圈

    链接:https://pan.baidu.com/s/1YvEzo6fC8zmlrCRGZY2ABg 密码:xxjs

    其实并不是在说正交解码怎么用,,而是说正交解码是个怎么回事,,,,,,,

    展开全文
  • STM32】 定时器---正交解码编码器模式详解

    万次阅读 多人点赞 2019-08-07 20:53:24
    增量式编码器也成为正交编码器,是通过两个信号线的脉冲输出来进行数据处理,一个输出脉冲信号就对应于一个增量位移,编码器每转动固定的位移,就会产生一个脉冲信号 通过读取单位时间脉冲信号的数量,便可以达到...

    增量式编码器

    增量式编码器也成为正交编码器,是通过两个信号线的脉冲输出来进行数据处理,一个输出脉冲信号就对应于一个增量位移,编码器每转动固定的位移,就会产生一个脉冲信号  通过读取单位时间脉冲信号的数量,便可以达到测速的效果(v=s/t),通过对脉冲信号的累加,和编码器的码盘的周长(转一圈对应距离)  便可以达到计算行走距离的效果(s=n*d)

    编码器信号: 

    • A 脉冲输出 
    • B 脉冲输出 
    • Z 零点信号 当编码器旋转到零点时,Z信号会发出一个脉冲表示现在是零位置 表示编码器转了1圈,可用来记录编码器转了多少圈,从而知道运行距离
    • VCC 电源线
    • GND 地线

    编码器线数:

    编码器的线数 ,是说编码器转一圈输出多少个脉冲,,,如果一个编码器是500线,说明这个编码器转一圈对应的信号线会输出500个脉冲, A B两相转一圈发出的脉冲数一样的,不过存在90°相位差

    线数越高代表编码器能够反应的位置精度越高

    编码器原理:

    增量式编码器有两个脉冲输出,A相和B相,并且两个相位永远存在90°相位差。 如果两个信号相位差为90度,则这两个信号称为正交。由于两个信号相差90度,因此可以根据两个信号哪个先哪个后来判断方向、并且可以根据AB相脉冲信号数量测得速度,位移等,

    编码器正反转:

    这里写图片描述

    正转的时候信号线A先输出信号,信号线B后输出  A相超前B相90度  证明是正转

    反转的时候信号线B先输出信号,信号线A后输出 B相超前A相90度 证明是反转

    STM32定时器编码器模式


       

    STM32的编码器模式共有三种:

    •  仅在TL1计数(A相)
    •  仅在TL2计数(B相)
    •  在TL1和TL2都计数(A相和B相都计数)

     

    仅在TL1计数(A相)

                      

    TI2(B相)为高电平时:

    1时刻: TI1(A相)下降沿,  则向上计数(正转)。

    2时刻:TI1(A相)上升沿,   则向下计数(反转)

    TI2(B相)为低电平时:

    3时刻: TI1(A相)上升沿,  则向上计数(正转)。

    4时刻:TI1(A相)下降沿,   则向下计数(反转)

    仅在TL2计数(B相)

    TI1(A相)为高电平时:

    1时刻: TI2(B相)上升沿,  则向上计数(正转)。

    2时刻:TI2(B相)下降沿,   则向下计数(反转)

    TI2(B相)为低电平时:

    3时刻: TI2(B相)下降沿,  则向上计数(正转)。

    4时刻:TI2(B相)上升沿,   则向下计数(反转)

    在TL1和TL2都计数(A相和B相都计数)

    一个脉冲信号周期完成4次跳变。精度提高

    1时刻:TI2为低电平,TI1上升沿跳变,计数器向上计数;

    2时刻:TI1为高电平,TI2上升沿跳变,计数器仍然向上计数;

    3时刻:TI2为高电平,TI1下降沿跳变,计数器仍然向上计数;

    4时刻:TI1为低电平,TI2下降沿跳变,计数器仍然向上计数。
     

    毛刺:只有一个相位脉冲   过滤掉 编码器转动过程中可能产生的毛刺过滤掉

    计数器向下计数原理相同   看图即可很好理解。

    计数器向下计数:

    A下降沿,B低电平
    B下降沿,A高电平
    B上升沿,A低电平
    A上升沿,B高电平

    上升沿与下降沿参看 《外部中断----高低电平触发,(边沿触发)上升沿触发和下降沿触发区别》

    注意事项:

    • 需要增加测量的精度时,可以采用4倍频方式,即分别在A、B相波形的上升沿和下降沿计数,分辨率可以提高4倍,
    • 如果只是测速,不要求方向,那么只需要用单片机随意选择一个信号线就行了,,然后定时器边沿触发,检测脉冲计数即可
    • 一般是定时器的通道1和2才能作为编码器输入口,对应编码器输出的两相。
    • GPIO配置为配置为上拉输入模式
    • 一个定时器做一种工作,如果你配置了编码器模式,那么剩下的通道就不能配置其他模式
    • 两相计数模式下,  读出来数需要/4          一个脉冲信号对应四次计数   

     

    编码器配置标准外设库

    TIM_EncoderInterfaceConfig,它就是编码器接口的配置函数。简单的只需要配置该函数,使能TIM,即可实现采集编码器上面的信息

    void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,
                                    uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity)

    TIMx参数就是使用哪个定时器作为编码器接口的捕捉定时器。

    TIM_EncoderMode参数是模式,是单相计数(仅在TL1计数或仅在TL2计数)还是两相计数(在TL1和TL2都计数)

    TIM_IC1Polarity和TIM_IC2Polarity参数就是通道1、2的捕捉极性。

     

    相关寄存器配置

    ● CC1S=’01’ (TIMx_CCMR1寄存器,IC1FP1映射到TI1)

    ● CC2S=’01’ (TIMx_CCMR2寄存器,IC2FP2映射到TI2)

    ● CC1P=’0’ (TIMx_CCER寄存器,IC1FP1不反相,IC1FP1=TI1)

    ● CC2P=’0’ (TIMx_CCER寄存器,IC2FP2不反相,IC2FP2=TI2)

    ● SMS=’011’ (TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效).

    ● CEN=’1’ (TIMx_CR1寄存器,计数器使能) 

     

    如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则置SMS=011 

    编码器模式功能:

    •   stm32f407中定时器1、2、3、4、5、8提供编码器接口模式 
    •   可以对输入信号TI1,TI2进行滤波处理,数字滤波器由事件器组成,每N个事件才视为一个有效边沿,可以在TIMx_CCMR1、TIMx_CCMR2中的IC1F位域设置      也就是可以设置每产生几次脉冲才视为1次有效  

    各个值的计算:

    转速计算方法:用捕获值(一秒内输出的脉冲数)/编码器线数(转速一圈输出脉冲数)/电机减数比(内部电机转动圈数与电机输出轴转动圈数比,即减速齿轮比    没有则不用除)

    运动距离计算:输出的总脉冲数 / 编码器线数*编码器齿轮周长

    所转角度计算:    输出的总脉冲数 / 编码器线数 *360     或    溢出中断次数*360+当前计数值 

    转动方向: 方向在定时器CR1的DIR位里   dir=(TIMX->CR1 & 0x0010)>>4;     //取方向标志位
    if(dir > 0)  //向下计数     else     //向上计数

     

    那么我们直接看代码:

    定时器初始化设置

    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 = 359*4;  //重装载值   
        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 = 0;//滤波器值
        TIM_ICInit(TIM3, &TIM_ICInitStructure);  //将TIM_ICInitStructure中的指定参数初始化TIM3
    //溢出中断设置--------------------------------------------------------------  
        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);
    
    
      TIM_SetCounter(TIM3,0); //TIM3->CNT=0
      TIM_Cmd(TIM3, ENABLE); 
    }
    

    重装载值:    (编码器线数-1 ) *4                因为我们是两相计数,一个脉冲信号4次计数,所以乘4,保证转完1整圈才触发中断

    中断设置:

    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); 
    }
    

    各个值的计算:

    脉冲数:  TIM_GetCounter(TIM3)/4  

    int angle=0;  //转过总角度
    int Realyangle = 0;  //当前实际角度 0~360
    int Distiance=0;   //运行距离
    extern int circle_count;   //转过圈数
    
    
    Realyangle = TIM_GetCounter(TIM3)/4/360 ;      //先除4   最后除编码器线数
    
    angle=Realyangle +circle_count*360;//当前角度
    
    
    Distiance = angle/360*编码器齿轮周长  + circle_count*编码器齿轮周长
    展开全文
  • stm32正交编码器例程

    2019-02-10 21:01:59
    STM32正交编码器例程,5线编码器A B Z GND和VCC,OC门输出记得接上拉
  • 编码器测速的两种方式外部中断和正交编码。-Two ways external interrupt and speed encoder quadrature encoder.有需要的朋友请下载
  • 文件只有一个.c一个.h文件 需要放到Stm32F407文件中才可以使用 代码实现配置四路编码器解码 实现效果是编码器正转 TIMx->CNT ++++反转----- 只有配置函数 没有相应的计算函数 想要计算函数的可以看我写的麦轮车的...
  • STM32正交编码器测速

    千次阅读 2020-01-11 21:24:43
    一、正交编码解码原理 参考链接:https://blog.csdn.net/as480133937/article/details/98750922 二、解码思路 (1)方法一:使用定时器的输入捕获功能,配置好TIM_ICInitTypeDef即可获取一定时间内的脉冲个数,并可...
  • STM32正交编码器接口

    万次阅读 2017-12-18 11:45:08
    STM32四路正交编码器接口 芯片型号、使用引脚及初始化程序源码 TIM2端口重映射问题 与JTAG接口冲突时的现象及解决方法
  • 本资源是在网上找的现成的基于stm32f103控制旋转编码器(EC11)的程序(采用正交解码的方法),本来只有定时器2345,本人把高级定时器1的配置也加了进去。
  • 由于最近干活遇到需要获取正交编码的功能,所以返回来研究一下STM32CubeMX的编码器功能,之前也更新过STM32的定时器功能,但是因为之前搞平衡车的正交编码器没有搞清楚原理,就直接用了脉冲输入功能草草了事,现在也...
  • 基于STM32F429IG HAL库配置编码器,定时器,pwm输出控制电机pid的程序。 基于STM32F429IG HAL库配置编码器,定时器,pwm输出控制电机pid的程序。 基于STM32F429IG HAL库配置编码器,定时器,pwm输出控制电机pid的...
  • 基于STM32正交编码器接口应用含源程序
  • 可以支持霍尔编码器的解码,自己编写的,亲测成功。...是定时器的正交编码器模式,面对的是STM32F4,但是修改头文件也可以支持STM32其他系列。 很简单的驱动函数,接口留出来了。 赚点小分,多多支持,有问题可留言。
  • STM32正交编码器编程

    千次阅读 2015-03-18 19:48:58
    如图,STM32的每个TIMER都有正交编码器输入接口,TI1,TI2经过输入滤波,边沿检测产生TI1FP1,TI2FP2接到编码器模块,通过配置编码器的工作模式,即可以对编码器进行正向/反向计数。   如下图,编码器使用了A,B...
  • STM32F407使用定时器TIM3获取正交编码器的值,然后在主函数里通过串口打印输出
  • 正交解码.rar

    2019-06-17 10:35:43
    STM32通过正交解码获取编码器脉冲值和编码器方向。测试可用
  • STM32F407编码器正交解码

    千次阅读 2019-09-23 18:23:48
    最近写了一个STM32F407VET6编码器的正交解码模式,发现网上资料较少,就把自己的代码贴上来。对于F407来说,可以用作编码器模式的只有高级定时器TIM1和TIM8,通用定时器有TIM2 TIM3 TIM4 TIM5。且每个定时器只有通道...
  • STM32F103正交解码采集编码器圈数和方向程序

    千次阅读 热门讨论 2019-06-17 10:31:51
    我的硬件连接是PA0->TIM2_CH1,PA1->TIM2_CH2 需要注意的是编码器需要接上拉电阻,下面是代码 GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO结构体变量 TIM_TimeBaseInitTypeDef TIM_...
  • 原理: 当计数值向上溢出或者向下溢出时,对应增加和减少重装载的值 0xFFFF。 对此读取 (TIM1->CNT+abs_count)是为了防止中途被中断打断而破坏组包数据。不建议屏蔽中断去读取,查询过快时也会造成中断开启...
  • 记录下采集编码器数据的一些问题: 1.

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 226
精华内容 90
关键字:

stm32正交解码