OpenEdv-开源电子网

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

求大佬帮帮忙 关于编码器的

[复制链接]

3

主题

15

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-8-6
在线时间
7 小时
发表于 2018-8-6 13:27:11 | 显示全部楼层 |阅读模式
2金钱
IMG_20180806_132501.png 就这种电机  哪位大佬帮忙讲解下   有源码更好(stmf103)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2018-8-6 15:00:27 | 显示全部楼层
你的问题是什么?只上传一张图片信息量太少了啊。你需要把你的疑问描述清楚,有哪里不懂,需要什么。你要完成什么功能。还有你手上有没有这种电机的规格书。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-8-6
在线时间
7 小时
 楼主| 发表于 2018-8-6 18:59:12 | 显示全部楼层
光电编码器  想用它测量走过的距离  
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-8-6
在线时间
7 小时
 楼主| 发表于 2018-8-6 19:17:11 | 显示全部楼层
电脑小白 发表于 2018-8-6 15:00
你的问题是什么?只上传一张图片信息量太少了啊。你需要把你的疑问描述清楚,有哪里不懂,需要什么。你要完 ...

目前就知道它有两相,具体怎么测不是很清楚
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-7 09:49:18 | 显示全部楼层
编码器类型比较多,但基本思想是一样的,首先你需要先设计实验测出电机转动的时候编码器的输出数据是什么样子的,然后电机每转动一圈,编码器的数值变化是什么,然后就数编码器数变了多少,通过程序就可以计算出来电机转了多少。

我看淘宝介绍是转一圈11个脉冲,你可以设计一个外部中断和一个定时器,在一个时间间隔内统计外部中断的发生次数,这样就会知道在这段时间内电机转动了多少角度或者多少圈,进而可以计算速度,借助其他的物理量还可以计算出诸如流量,路程,位移等数据。
十六进制带我飞。
回复

使用道具 举报

8

主题

569

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2363
金钱
2363
注册时间
2015-5-8
在线时间
320 小时
发表于 2018-8-7 11:07:41 | 显示全部楼层
有编码器模式可以试试
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2018-8-7 15:55:37 | 显示全部楼层
转一圈只有11个脉冲的话,用中断就可以实现的。(不用去开stm32的编码器模式了)
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-8-6
在线时间
7 小时
 楼主| 发表于 2018-8-7 16:07:24 | 显示全部楼层
电脑小白 发表于 2018-8-7 15:55
转一圈只有11个脉冲的话,用中断就可以实现的。(不用去开stm32的编码器模式了)

方便留下联系方式不
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-8-6
在线时间
7 小时
 楼主| 发表于 2018-8-7 16:27:03 | 显示全部楼层
炫色康康 发表于 2018-8-7 11:07
有编码器模式可以试试

void TIM3_Mode_Config(void)
{
    GPIO_InitTypeDef                 GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_ICInitTypeDef                 TIM_ICInitStructure;                //根据TIM_ICInitStructure的参数初始化结构体,捕获定时器;

        GPIO_StructInit(&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;         //浮空输入
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

        TIM_DeInit(TIM3);                                        /*将TIMx外设寄存器的默认值设置为默认复位值。
                                                                                Deinitializes the TIMx peripheral registers to their default reset values.*/
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);        //Fills each TIM_TimeBaseInitStruct member with its default value.
    TIM_TimeBaseStructure.TIM_Period=65536-1;                        //arr  设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler=20;                //分频        psc
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;                //时钟分割,一般写0  
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        //设置为向上计数模式
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

        /**************编码配置*****初始化TIM3输入捕获参数****/
    TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_BothEdge,TIM_ICPolarity_BothEdge);//使用编码器模式3                双边沿沿触发
        TIM_ICStructInit(&TIM_ICInitStructure);                       
//        TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         选择输入端 IC1映射到TI1上       
//        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 。。6
          TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
    TIM_ICInitStructure.TIM_ICFilter=0;                                // 选择比较滤波器
               
        TIM_ICInit(TIM3,&TIM_ICInitStructure);                //将TIM_ICInitStructure中的指定参数初始化TIM3
        TIM_ClearFlag(TIM3,TIM_FLAG_Update);        //清除TIM3的更新标志位
       
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//运行更新中断
       
//        TIM3->CNT = 0;

//    TIM_CtrlPWMOutputs(TIM3,ENABLE);
//   TIM_ARRPreloadConfig(TIM3,ENABLE);                 /* 中断使能 */
    TIM_Cmd(TIM3,ENABLE);                        /* 使能 */
}
这个是我写的  麻烦看下哪里有问题
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2922
金钱
2922
注册时间
2016-5-13
在线时间
185 小时
发表于 2018-8-7 17:10:41 | 显示全部楼层
dik 发表于 2018-8-7 16:27
void TIM3_Mode_Config(void)
{
    GPIO_InitTypeDef                 GPIO_InitStructure;

你去看看我另一个不用的账号(以前发的)帖子:http://www.openedv.com/forum.php?mod=viewthread&tid=44775
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2018-7-12
在线时间
21 小时
发表于 2018-8-7 19:49:32 | 显示全部楼层
当你意识到正在走弯路,就已经走在了成功的直道上。如果连弯路都没找着,就先忘了成功吧。
回复

使用道具 举报

16

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1909
金钱
1909
注册时间
2015-7-5
在线时间
485 小时
发表于 2018-8-7 20:32:41 | 显示全部楼层
霍尔编码器?
两个相位的,可以检测转动方向,可以通过脉冲宽度计算转速,对脉冲计数可以知道转了多少
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-8-6
在线时间
7 小时
 楼主| 发表于 2018-8-11 08:57:06 | 显示全部楼层
huyounong 发表于 2018-8-7 20:32
霍尔编码器?
两个相位的,可以检测转动方向,可以通过脉冲宽度计算转速,对脉冲计数可以知道转了多少

嗯嗯  了解
回复

使用道具 举报

3

主题

15

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-8-6
在线时间
7 小时
 楼主| 发表于 2018-8-12 10:01:10 | 显示全部楼层
dik 发表于 2018-8-7 16:27
void TIM3_Mode_Config(void)
{
    GPIO_InitTypeDef                 GPIO_InitStructure;

这个可以计数的   正转会自加  反转自减
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-8-17
在线时间
7 小时
发表于 2018-8-18 15:39:59 | 显示全部楼层
这个解决了吗    我现在也用这款电机
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-8-18
在线时间
0 小时
发表于 2018-8-18 15:43:08 | 显示全部楼层
电脑小白 发表于 2018-8-7 17:10
你去看看我另一个不用的账号(以前发的)帖子:http://www.openedv.com/forum.php?mod=viewthread&tid=44 ...

大佬麻烦问下 为什么编码器返回值一直是0和1
GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;        
        TIM_ICInitTypeDef        TIM_ICInitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA, &GPIO_InitStructure);


        GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5);

        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

        TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling
        TIM_TimeBaseStructure.TIM_Period = 60000;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   
        TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);

        TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
        TIM_ICStructInit(&TIM_ICInitStructure);
        TIM_ICInitStructure.TIM_ICFilter = 0;
        TIM_ICInit(TIM5, &TIM_ICInitStructure);

        TIM_ClearFlag(TIM5, TIM_FLAG_Update);
        TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);

        TIM_Cmd(TIM5, ENABLE);

这是程序
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-8-17
在线时间
7 小时
发表于 2018-8-19 18:07:54 | 显示全部楼层
wxblack 发表于 2018-8-18 15:43
大佬麻烦问下 为什么编码器返回值一直是0和1
GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeB ...

编码器模式针脚好像是浮空输入      我是你上面楼的    我基本解决问题了    相互学习
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2018-8-17
在线时间
7 小时
发表于 2018-8-19 18:10:22 | 显示全部楼层
wxblack 发表于 2018-8-18 15:43
大佬麻烦问下 为什么编码器返回值一直是0和1
GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeB ...

我弄的程序希望对你有帮助   我也是在学习
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                         //ÉèÖóɸ¡¿ÕÊäÈë
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //ÊäÈëģʽ×î´óËÙ¶È50MHZ
        GPIO_Init(GPIOB, &GPIO_InitStructure);       
void TIM4_Configuration(void)
{
         TIM_DeInit(TIM4);
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 16200*4;  //É趨¼ÆÊýÆ÷֨װֵ   TIMx_ARR = 359*4
    TIM_TimeBaseStructure.TIM_Prescaler = 0; //TIM4ʱÖÓÔ¤·ÖƵֵ
    TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ;//ÉèÖÃʱÖÓ·Ö¸î T_dts = T_ck_int   
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊý
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);              

    TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);//ʹÓñàÂëÆ÷ģʽ3£¬ÉÏÉýϽµ¶¼¼ÆÊý
   
          TIM_ICInitTypeDef TIM_ICInitStructure;//
    TIM_ICInitStructure.TIM_ICFilter = 6;  //Ñ¡ÔñÊäÈë±È½ÏÂ˲¨Æ÷
    TIM_ICInit(TIM4, &TIM_ICInitStructure);//½«TIM_ICInitStructureÖÐÖ¸¶¨²ÎÊý³õʼ»¯TIM4

                //TIM_ARRPreloadConfig(TIM4, ENABLE);//ʹÄÜÔ¤×°×°ÔØÖµ
    TIM_ClearFlag(TIM4, TIM_FLAG_Update);//Çå³ýTIM4µÄ¸üбê־λ
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);//ÔËÐиüÐÂÖжÏ
    //Reset counter
   TIM4->CNT = 0;//

    TIM_Cmd(TIM4, ENABLE);   //ʹÄÜTIM4

}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 17:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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