OpenEdv-开源电子网

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

关于stm32测试E6B2欧姆龙的编码器的脉冲不准的问题

[复制链接]

19

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-8-2
在线时间
170 小时
发表于 2020-4-17 11:30:26 | 显示全部楼层 |阅读模式
50金钱
现在我先不求速度,因为目前用2000线的编码器接stm32f407zgt6的芯片的编码器接口。目前是编码器转动很少角度,得出的脉冲数确实接近最大值的脉冲数,我想问一下各位大神是否有类似情况,我应该如何避免,还是我的程序设置有错,麻烦大家了
  1. void TIM3_Encode_init(u16 arr,u16 psc)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4. //        NVIC_InitTypeDef  NVIC_InitStructure;
  5.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  6.   TIM_ICInitTypeDef TIM_ICInitStructure;   

  7.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);   
  8.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);  
  9.        
  10.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3);           //GPIOA6复用为定时器3通道1
  11.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_TIM3);           //GPIOA7复用为定时器3通道2
  12.                
  13.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;          //GPIOA6和GPIOA7
  14.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                    //复用模式
  15.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;              //速度100MHz
  16.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;                //浮空       
  17.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                  //推挽复用输出
  18.   GPIO_Init(GPIOA, &GPIO_InitStructure);                          //初始化PA6和PA7
  19.        
  20.   TIM_TimeBaseStructure.TIM_Period = arr;                               //(编码器线数-1)*4        四倍频原理
  21.         TIM_TimeBaseStructure.TIM_Prescaler=psc;                        //定时器分频
  22.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;       //向上计数模式
  23.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;           //时钟分频因子,不分频
  24.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);                  //初始化TIM3
  25.        
  26.         TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising );//编码器配置(定时器、编码模式、上升沿、上升沿)
  27.        
  28.         TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;                  //选择输入端IC1映射到TI1上
  29.   TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;              //上升沿捕获
  30.   TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;   //映射到TI1上
  31.   TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;                    //配置输入分频,不分频
  32.   TIM_ICInitStructure.TIM_ICFilter =0xF;                            //配置输入滤波器
  33.   TIM_ICInit(TIM3,&TIM_ICInitStructure);
  34. //       
  35. //        TIM_ICInitStructure.TIM_Channel=TIM_Channel_2;                  //选择输入端IC2映射到TI2上
  36. //  TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;              //上升沿捕获
  37. //  TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;   //映射到TI2上
  38. //  TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;                    //配置输入分频,不分频
  39. //  TIM_ICInitStructure.TIM_ICFilter=0xF;                             //配置输入滤波器
  40. //  TIM_ICInit(TIM3,&TIM_ICInitStructure);
  41.        
  42.        
  43.                
  44. //  NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;                   //定时器3中断分组配置
  45. //        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                   //使能
  46. //        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;      //抢占优先级1
  47. //        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0x02;            //响应优先级2
  48. //        NVIC_Init(&NVIC_InitStructure);                                 //配置定时器3
  49. //               
  50.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                        //允许定时器3更新中断
  51.         TIM_SetCounter(TIM3,0);
  52.         TIM_Cmd(TIM3,ENABLE);                                           //使能定时器3
  53. }






  54. /*单位时间编码器计数 输入定时器 输出速度值*/
  55. int Read_Encoder(u8 TIMX)
  56. {
  57.         int Encoder_TIM;   
  58.         switch(TIMX)
  59.         {
  60.                 case 2:  Encoder_TIM= (short)TIM2 -> CNT;  TIM2 -> CNT=0;break;
  61.                 case 3:  Encoder_TIM= (short)TIM3 -> CNT;  TIM3 -> CNT=0;break;       
  62.                 case 4:  Encoder_TIM= (short)TIM4 -> CNT;  TIM4 -> CNT=0;break;       
  63.                 default:  Encoder_TIM=0;
  64.         }
  65.         return Encoder_TIM;
  66. }
复制代码
  1. int main(void)
  2. {
  3.         unsigned int k;
  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //设置系统中断优先级分组2
  5.         delay_init(168);                                 //初始化延时函数
  6.         uart_init(115200);                                           //初始化串口波特率为115200
  7.         LED_Init();                                                                     //初始化LED
  8.         KEY_Init();                                                                     //初始化按键
  9.         TIM3_Encode_init((ENCODER_PPR-1)*4,1);         //编码器初始化
  10.         while(1)
  11.         {
  12.                 k=Read_Encoder(3);
  13.                 printf("k:%d\r\n",k);
  14.                 delay_ms(5);
  15.         }
  16. }
复制代码

最佳答案

查看完整内容[请看2#楼]

找到原因了,NPN的增量式编码器必须加上拉电阻,不然的话就会导致电平不稳定,现在测速基本稳定,误差也不大.A、B、Z相三相接上拉电阻就可以实现
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-8-2
在线时间
170 小时
 楼主| 发表于 2020-4-17 11:30:27 | 显示全部楼层
找到原因了,NPN的增量式编码器必须加上拉电阻,不然的话就会导致电平不稳定,现在测速基本稳定,误差也不大.A、B、Z相三相接上拉电阻就可以实现
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-4-18 01:24:48 | 显示全部楼层
帮顶
回复

使用道具 举报

19

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-8-2
在线时间
170 小时
 楼主| 发表于 2020-4-20 09:23:36 | 显示全部楼层
我这里已经可以正常计数了,就是不知道为什么改变使用内部时钟16MHZ之后编码器才正常,如果使用外部晶振的话,一直会处于不稳定的状态。尤其是通过Stm32CubeMx软件写出来后,只要是时钟修改了,基本都是测不了的。有没有大神知道原因
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2020-7-17
在线时间
16 小时
发表于 2020-8-15 19:51:07 | 显示全部楼层
        NPN电压输出的欧姆龙应该不用接上拉电阻吧?
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2020-7-17
在线时间
16 小时
发表于 2020-8-16 10:44:03 | 显示全部楼层
老哥,上拉电阻怎么接的呀,有没接线的实物图呀?
回复

使用道具 举报

19

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
328
金钱
328
注册时间
2018-8-2
在线时间
170 小时
 楼主| 发表于 2020-9-9 11:54:21 | 显示全部楼层
JIM积木 发表于 2020-8-16 10:44
老哥,上拉电阻怎么接的呀,有没接线的实物图呀?

电阻一端接3.3一端接引脚啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-17 11:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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