OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13762|回复: 24

STM32F4使用增量式编码器的电机速度问题

[复制链接]

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2017-3-22
在线时间
41 小时
发表于 2017-8-4 03:16:58 | 显示全部楼层 |阅读模式


              各位朋友,今天遇到个很奇怪的问题,我用的直流电机带增量式编码器,使用TIM5配置为编码器模式,在电机低速情况下,编码器值读取正确,正反转正确,但是当我提高电机的PWM占空比超过50%,编码器的读数值开始出现严重的丢失现象,比如本来电机转一圈读取到4096脉冲数,现在提高速度以后,只能读取到三千多 个脉冲数,不明白为什么电机速度提高会导致编码器丢失脉冲,编码器频响上限是875HZ,电机转速不可能突破这个上限,好着急啊,求大神指点一二,后天要验收了,突然遇到这个问题,心都碎了。编码器配置代码如下:

         void Encoder_Init_TIM5(void)
{
        GPIO_InitTypeDef            GPIO_Initstruc;
        TIM_TimeBaseInitTypeDef     TIM_TimeBaseInit_Struc;
        TIM_ICInitTypeDef           TIM_ICInit_Struc;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);// TIM5时钟使能
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//  GPIOA时钟使能
       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5);//设置PA0和PA1为复用模式
       
        GPIO_Initstruc.GPIO_Mode=GPIO_Mode_AF;
        GPIO_Initstruc.GPIO_OType=GPIO_OType_OD;
        GPIO_Initstruc.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
        GPIO_Initstruc.GPIO_PuPd=GPIO_PuPd_UP;
        GPIO_Initstruc.GPIO_Speed=GPIO_Speed_100MHz;
       
        GPIO_Init(GPIOA,&GPIO_Initstruc);

        TIM_TimeBaseStructInit(&TIM_TimeBaseInit_Struc);
       
        TIM_TimeBaseInit_Struc.TIM_Prescaler=0x00;                  //定时器预分频
        TIM_TimeBaseInit_Struc.TIM_Period=0xffffffff;                     //设定计数器自动重装值
        TIM_TimeBaseInit_Struc.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInit_Struc.TIM_CounterMode=TIM_CounterMode_Up;
       
        TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInit_Struc);
       
        TIM_EncoderInterfaceConfig(TIM5,TIM_EncoderMode_TI1,
        TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);          //初始化编码器Tim5为TI1边沿计数
       
        TIM_ICStructInit(&TIM_ICInit_Struc);                         //?????????
        TIM_ICInit_Struc.TIM_ICFilter=10;                            //输入滤波器
       
        TIM_ICInit(TIM5,&TIM_ICInit_Struc);
       
        TIM_ClearFlag(TIM5,TIM_FLAG_Update);
        TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
        TIM5->CNT=0;
        TIM_Cmd(TIM5,ENABLE);//启动定时器5
}
/******************************************
单位时间读取编码器计数,返回位置值
********************************************/
int Read_Position(u8 TIMX)
{   
    Encoder_TIM= TIM5 -> CNT;
                return Encoder_TIM;
}
/******************************************
微信截图_20170804031534.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2017-3-22
在线时间
41 小时
 楼主| 发表于 2017-8-4 03:17:33 | 显示全部楼层
最后的图片忽略吧,重复飞了
回复 支持 反对

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2016-3-1
在线时间
42 小时
发表于 2017-8-4 10:01:09 | 显示全部楼层
调pwm的频率吧 调占空比不对吧
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2017-3-22
在线时间
41 小时
 楼主| 发表于 2017-8-4 10:01:19 | 显示全部楼层
呼叫原子哥,求助求助
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2017-3-22
在线时间
41 小时
 楼主| 发表于 2017-8-4 10:07:23 | 显示全部楼层
小卒0x9527 发表于 2017-8-4 10:01
调pwm的频率吧 调占空比不对吧

频率我给的2kHZ,定死的,我通过调占空比来调速的。
回复 支持 反对

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2016-3-1
在线时间
42 小时
发表于 2017-8-6 15:47:46 | 显示全部楼层
Herojie 发表于 2017-8-4 10:07
频率我给的2kHZ,定死的,我通过调占空比来调速的。

编码器测的是脉冲 你的占空比如果达到95%以上 低电平有可能检测不出来
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2017-3-22
在线时间
41 小时
 楼主| 发表于 2017-8-8 17:09:19 | 显示全部楼层
朋友们,问题解决了,把滤波器的值设为0,编码器不管在什么转速下测量值都是稳定的,现在还没搞明白为什么这个滤波器会影响到读数的准确性,问题是这么解决的,哪个高人来给解释下。
回复 支持 反对

使用道具 举报

9

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2017-9-27
在线时间
22 小时
发表于 2018-3-29 18:39:52 | 显示全部楼层
Herojie 发表于 2017-8-8 17:09
朋友们,问题解决了,把滤波器的值设为0,编码器不管在什么转速下测量值都是稳定的,现在还没搞明白为什么 ...

硬件上需要外接上啦电阻么?
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2017-3-22
在线时间
41 小时
 楼主| 发表于 2019-5-27 21:31:28 | 显示全部楼层
RQZ13522564171 发表于 2018-3-29 18:39
硬件上需要外接上啦电阻么?

应该不需要
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2019-4-21
在线时间
17 小时
发表于 2019-5-27 23:51:44 | 显示全部楼层
喜欢这种有过程有结果的帖子
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2019-5-16
在线时间
30 小时
发表于 2019-8-20 14:15:56 | 显示全部楼层
        TIM_EncoderInterfaceConfig(TIM5,TIM_EncoderMode_TI1,
        TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);          //初始化编码器Tim5为TI1边沿计数
想问一下楼主,这个函数里面的TIM_EncoderMode_TI1和TIM_EncoderMode_TI2有啥区别?我看解释不太明白。
还有这个和TIM_ICInit()函数中TIM_ICSelection参数的TIM_ICSelection_DirectTI和TIM_ICSTIM_ICSelection_IndirectTI与啥区别,我这里不太明白,希望有大佬帮忙解释一下,谢谢
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2017-3-22
在线时间
41 小时
 楼主| 发表于 2019-8-28 16:14:15 | 显示全部楼层
玖乌御酒 发表于 2019-8-20 14:15
TIM_EncoderInterfaceConfig(TIM5,TIM_EncoderMode_TI1,
        TIM_ICPolarity_Rising,TIM_ICPo ...

不好意思,这么晚才回你,你常上这个网站,EncoderMode有三种模式,TI1,TI2和TI12,因为编码器是增量式的,他有AB两项分别接入了一个定时器的CH1和CH2,TI1和TI2模式意思是只在CH1的上升沿或者CH2的上升沿计数,TI12是在TI1和TI2的上升沿都技术,如果在把模式选择为上升沿和下降沿均技术,则为编码器4倍频,ICSelection参数貌似不需要去配置,希望对你有所帮助。
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2017-3-22
在线时间
41 小时
 楼主| 发表于 2019-8-28 16:15:07 | 显示全部楼层
17807063505 发表于 2019-5-27 23:51
喜欢这种有过程有结果的帖子

天呐,两年前得帖子了,还有人看
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
277
金钱
277
注册时间
2019-5-16
在线时间
30 小时
发表于 2019-8-28 19:10:47 | 显示全部楼层
Herojie 发表于 2019-8-28 16:14
不好意思,这么晚才回你,你常上这个网站,EncoderMode有三种模式,TI1,TI2和TI12,因为编码器是增量式的 ...

很有帮助,谢谢楼主。
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2015-4-8
在线时间
11 小时
发表于 2019-11-22 00:06:35 | 显示全部楼层
楼主,你的是f429吗?最近淘宝平衡车之家买的带编码器电机,网上很多都没说清楚,能分享下你的代码吗?
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2020-7-10
在线时间
5 小时
发表于 2021-1-22 23:27:29 | 显示全部楼层
楼主请问stm32f407的tim1和tim8要怎么配置编码器模式,我的tim3~5都是可以正常运行的tim1和8不行
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2021-4-15
在线时间
3 小时
发表于 2021-6-12 00:24:33 | 显示全部楼层
Herojie 发表于 2017-8-8 17:09
朋友们,问题解决了,把滤波器的值设为0,编码器不管在什么转速下测量值都是稳定的,现在还没搞明白为什么 ...

高速计数一般都补滤波
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2020-8-25
在线时间
14 小时
发表于 2021-7-14 15:33:25 | 显示全部楼层
有问题请教!
  TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
为什么我这样设置,得到的脉冲数是编码器分辨率的2倍?
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-7-14 18:50:41 | 显示全部楼层
chy1998 发表于 2021-7-14 15:33
有问题请教!
  TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICP ...

//TIM_EncoderMode_TI1 TIM_EncoderMode_TI2  单相单边沿计数,2倍  
//TIM_EncoderMode_TI12                     双相双边沿计数,4倍
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2020-8-25
在线时间
14 小时
发表于 2021-7-15 09:38:25 | 显示全部楼层
nashui_sx 发表于 2021-7-14 18:50
//TIM_EncoderMode_TI1 TIM_EncoderMode_TI2  单相单边沿计数,2倍  
//TIM_EncoderMode_TI12           ...

感谢回复!
但还是不太清楚,“单相单边沿”
我理解的话,TI1模式就是只对CH1通道脉冲计数,Rising是只对上升沿计数,那么编码器转一圈CH1通道接收脉冲数(TIMx→CNT的变化量)就应该对应编码器的分辨率数值,怎么会变成2倍了呢。是我理解不对吗?
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-7-15 10:09:37 | 显示全部楼层
本帖最后由 nashui_sx 于 2021-7-15 10:12 编辑
chy1998 发表于 2021-7-15 09:38
感谢回复!
但还是不太清楚,“单相单边沿”
我理解的话,TI1模式就是只对CH1通道脉冲计数,Rising是只 ...

1.jpg 3.jpg
2.jpg
这个表写的很清楚呀,TIM_ICPolarity_Rising一般人都翻译错了,不是上升沿计数,是表的第3/4大列,另一通道电平高低计数规则,应该翻译成 极性不反相
TIM_ICPolarity_Falling  极性反相
比如第一种情况TIM_ICPolarity_Rising极性不反相    对方高电平自己下降沿数据++     对方低电平 自己上升沿数据++    所以2倍  后两种一样


回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2020-8-25
在线时间
14 小时
发表于 2021-7-15 11:05:03 | 显示全部楼层
nashui_sx 发表于 2021-7-15 10:09
这个表写的很清楚呀,TIM_ICPolarity_Rising一般人都翻译错了,不是上升沿计数,是表的第3/4大列,另 ...

感谢!!我明白啦!
去看了看手册,TI1模式(TI2)是对边沿信号进行计数,包括上升沿和下降沿,所以是计数值是2倍的脉冲数。而rising和falling对应的是表75的(高 低),对应图153的正向反向,这样可以规定编码器转动方向,比如设置rising 顺时针转是正向,CNT增加。设置falling,顺时针是逆向,CNT减小。
之前都是临时抱佛脚看的别人的程序和帖子,,我一直都错误理解了。
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2020-4-1
在线时间
27 小时
发表于 2021-7-15 11:16:48 | 显示全部楼层
Herojie 发表于 2017-8-8 17:09
朋友们,问题解决了,把滤波器的值设为0,编码器不管在什么转速下测量值都是稳定的,现在还没搞明白为什么 ...

TIMx->CCMRx的1C1F位输入滤波器,不为0,N个事件视为有效,应该是速度快了满足不了N次检测,相当于过滤了,(这里很烦要根据实际频率设定采样频率和N的值来达到滤波效果而且只能过滤频率高的—干扰),0是无滤波最高采样频率,一次事件有效,我是这么理解的
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-7-15 13:59:42 | 显示全部楼层
chy1998 发表于 2021-7-15 11:05
感谢!!我明白啦!
去看了看手册,TI1模式(TI2)是对边沿信号进行计数,包括上升沿和下降沿,所以是计 ...

对,明白了就好了,有问题第一反应应该是看手册
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2021-9-23
在线时间
9 小时
发表于 2021-11-29 18:07:57 | 显示全部楼层
楼主!我的PA0捕获脉冲,但是PA1不捕获脉冲!!!很奇怪。。。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 15:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表