8559|10

117

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

stm32编码器的速度测量,根据我自己的理解想的一种思路。 [复制链接]

在问了一些网友之后,自己想了个办法在官方demo的基础上,测量速度,但是遇到了一些问题,希望大神能帮我分析分析,我这样子哪里不对。官方的demo里有直接能反应转子的位置信息,和转过的角度,在这个基础上,我再加一个定时器用于捕获模式,因为输入信号是A,B两根线,但是我用在捕获时间的时候,只需要一个就够了如图:

于是我把其中的一根信号线再引出来用于测量时间间隔(我不知道这样行不行,理论上感觉是可以的)但是我在实际过程中,这样子好像并不行,不能很精确的实时反应速度,可以说非常不精确,而且反向的时候就不行了。再附上我自己加的程序代码:

void Tim_Test(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
       
  /* TIM4 clock source enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  /* Enable GPIOB, clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_StructInit(&GPIO_InitStructure);
  /* Configure PB.07 as PWM input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       
  /* Enable the TIM4 Update Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel =TIM4_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
       
        TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;
        TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
        TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
        TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
        TIM_ICInitStructure.TIM_ICFilter=0X00;
        TIM_PWMIConfig(TIM4, &TIM_ICInitStructure);
        TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);
        TIM_SelectSlaveMode(TIM4,TIM_SlaveMode_Reset);
        TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);
        TIM_ITConfig(TIM4,TIM_IT_CC2,ENABLE);
        TIM_Cmd(TIM4,ENABLE);
}

void TIM4_IRQHandler(void)
{
        s16 Counter;
        s16 Temp_Counter;
        s16 Speed;
        uint8_t data[6];//用来在oled上显示
        static float Time;//记录脉冲的时间间隔
        Time=TIM_GetCapture1(TIM4);
        Temp_Counter = (uint8_t)TIM_GetCounter(ENCODER_TIMER);//官方demo里的计算位置信息的函数
        if(Temp_Counter>=0)//判断正负
        {
                Counter=Temp_Counter;
                data[0]='+';
        }
        if(Temp_Counter<0)
        {
                Counter=(-Temp_Counter);
                data[0]='-';
        }
        Speed=Counter*1000/Time;放大1000倍后显示
        data[1]=(Speed/10000)+0x30;
        data[2]=((Speed%10000)/1000)+0x30;
        data[3]=(((Speed%10000)%1000)/100)+0x30;
        data[4]=((((Speed%10000)%1000)%100)/10)+0x30;
        data[5]=(((((Speed%10000)%1000)%100)%10)%10)+0x30;
        OLED_P8x16Str(0,6,data);
        TIM_ClearITPendingBit(TIM4,TIM_IT_CC2);
        ENC_Clear_Speed_Buffer();//如果不清除速度缓冲区,就会一直记录转子转过的角度,那么Temp_Counter
                                            // 就会一直增加,因此每次中断都清除一下,这样再除以时间,就可以得到速度。
},另外在附上整个工程,大家也可以看看,修修改改,交流交流 编码器实验1.zip (2.88 MB, 下载次数: 207)

此帖出自stm32/stm8论坛

最新回复

程序中做一个处理,当计数值达到一个值后,重新给对应寄存器赋值。让他重新开始加。你控制好时序。保证重新赋值的操作只是偶尔出现一次。针对这次重新赋值的操作,你也可以计算出计算出,中断的次数。  详情 回复 发表于 2017-5-27 11:38
点赞 关注
 

回复
举报

862

帖子

2

TA的资源

纯净的硅(初级)

沙发
 
你是不是把事情搞复杂了, 定时器正交编码模式的计数值是可读的,所以你定时读取就可以判断速度了
此帖出自stm32/stm8论坛

点评

读哪个寄存器?可否告知小弟一下...  详情 回复 发表于 2017-4-3 13:11
 
个人签名水不撩不知深浅 人不拼怎知输赢
 

回复

117

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
wo4fisher 发表于 2017-4-3 09:00
你是不是把事情搞复杂了, 定时器正交编码模式的计数值是可读的,所以你定时读取就可以判断速度了

读哪个寄存器?可否告知小弟一下...
此帖出自stm32/stm8论坛

点评

这个看官方的demo应该会有答案  详情 回复 发表于 2017-4-4 11:18
 
 

回复

862

帖子

2

TA的资源

纯净的硅(初级)

4
 
赵怡彬 发表于 2017-4-3 13:11
读哪个寄存器?可否告知小弟一下...

这个看官方的demo应该会有答案
此帖出自stm32/stm8论坛
 
个人签名水不撩不知深浅 人不拼怎知输赢
 
 

回复

4008

帖子

0

TA的资源

版主

5
 
CNT就是位置
此帖出自stm32/stm8论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

6
 
一次中断到来,读取计数器的计数值,下一次,中断到来,读取计数值,得到两次差值,结合计数器频率,就知道时间差。
此帖出自stm32/stm8论坛

点评

计数器的频率不就是外部脉冲的频率吗?  详情 回复 发表于 2017-4-5 21:20
 
 
 

回复

117

帖子

0

TA的资源

一粒金砂(中级)

7
 
ienglgge 发表于 2017-4-5 20:10
一次中断到来,读取计数器的计数值,下一次,中断到来,读取计数值,得到两次差值,结合计数器频率,就知道 ...

计数器的频率不就是外部脉冲的频率吗?
此帖出自stm32/stm8论坛

点评

可能是没说清楚,我指的是,单片机内部的那个。定时器也是靠对时钟计数来实现定时的。  详情 回复 发表于 2017-4-5 21:43
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

8
 
赵怡彬 发表于 2017-4-5 21:20
计数器的频率不就是外部脉冲的频率吗?

可能是没说清楚,我指的是,单片机内部的那个。定时器也是靠对时钟计数来实现定时的。
此帖出自stm32/stm8论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

9
 
ienglgge 发表于 2017-4-5 20:10
一次中断到来,读取计数器的计数值,下一次,中断到来,读取计数值,得到两次差值,结合计数器频率,就知道 ...

这样的话下一中断到来时溢出了怎么办呢?
此帖出自stm32/stm8论坛

点评

程序中做一个处理,当计数值达到一个值后,重新给对应寄存器赋值。让他重新开始加。你控制好时序。保证重新赋值的操作只是偶尔出现一次。针对这次重新赋值的操作,你也可以计算出计算出,中断的次数。  详情 回复 发表于 2017-5-27 11:38
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

10
 
楼主速度后来怎么测的啊?能否加QQ1106394949一起探讨下
此帖出自stm32/stm8论坛
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

11
 
Double- 发表于 2017-5-25 15:46
这样的话下一中断到来时溢出了怎么办呢?

程序中做一个处理,当计数值达到一个值后,重新给对应寄存器赋值。让他重新开始加。你控制好时序。保证重新赋值的操作只是偶尔出现一次。针对这次重新赋值的操作,你也可以计算出计算出,中断的次数。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表