搜索
bottom↓
回复: 30

没有正交编码器接口的单片机,,想用,能不能给个解决.....

[复制链接]

出0入0汤圆

发表于 2013-12-15 00:13:55 | 显示全部楼层 |阅读模式
没有正交编码器接口的单片机,,想用,能不能给个解决 ?? 有没有专门的处理芯片?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-12-15 00:34:49 | 显示全部楼层
呵呵,我也想知道。
在需要用编码器的场合,我一直在用带正交编码器接口的stm32芯片。
但是我也想过和楼主同样的问题,至今没找到好的答案。

出0入0汤圆

发表于 2013-12-15 09:32:42 来自手机 | 显示全部楼层
给马达控制用的一般会带,你不是说 stm32带了么

出0入0汤圆

发表于 2013-12-15 09:44:53 | 显示全部楼层
可以用CPLD,或者专用芯片,例如惠普(安华高)有专用辨向计数芯片。不过成本比mcu就高多了。也可用一片小stm8作为接口。

出0入0汤圆

 楼主| 发表于 2013-12-15 10:12:10 | 显示全部楼层
做飞思卡尔只能用一个可编程的单片机。。求破

出0入0汤圆

 楼主| 发表于 2013-12-15 10:14:48 | 显示全部楼层
health 发表于 2013-12-15 09:44
可以用CPLD,或者专用芯片,例如惠普(安华高)有专用辨向计数芯片。不过成本比mcu就高多了。也可用一片小stm ...

辨向计数芯片 有没有个型号?

出0入0汤圆

发表于 2013-12-15 10:19:02 | 显示全部楼层
同时启用IO的上升沿和下降沿中断(如果不提供则可以用两个IO来分别处理两个边沿),在中断里跑一个状态机就搞定了。

出0入0汤圆

发表于 2013-12-15 10:47:01 | 显示全部楼层
用逻辑电路搭一个

出0入0汤圆

发表于 2013-12-15 11:30:29 | 显示全部楼层
德玛西亚 发表于 2013-12-15 10:14
辨向计数芯片 有没有个型号?

专用解码芯片
http://www.avagotech.cn/pages/cn ... ircuits/decoder_ic/

成本上来说,还是stm32,stm8合适。

出100入85汤圆

发表于 2013-12-15 12:06:09 | 显示全部楼层
mhw 发表于 2013-12-15 10:19
同时启用IO的上升沿和下降沿中断(如果不提供则可以用两个IO来分别处理两个边沿),在中断里跑一个状态机就 ...

嗯,我也是这么处理的

IO口可以上升沿和下降沿中断的话就简单

不过如果IO口不能中断的话,对速度不高,精度不高的场合可以用定时器去勉强实现

可中断时实现
//A,B相对应IO口处理

   //必须用暂时变量,IO值处理过程中可能变动
   uint8 itempA;
    uint8 itempB;
    uint8 itemp;
    uint8 iRe;

    itempA = IOPort_GetAState();
    itempB = IOPort_GetBState();

    itemp =Motor_StateJudge(itempA, itempB);
    iRe =Motor_StateJumpOK(itemp, Motor_m_LastState);

    if(!iRe)
    {
        //最后保存新AB的状态;
     Motor_m_LastAState = itempA;
        Motor_m_LastBState = itempB;
        Motor_m_LastState =itemp;
    }  

/****************************************************************
功能:状态编码
原型:uint8 Motor_StateJudge(uint8 a, uint8 b)
输入:AB相即时状态
输出:状态编码号(0~3)
*****************************************************************/
uint8 Motor_StateJudge(uint8 a, uint8 b)
{
    uint8 mTmp;

    if(a==0 &&b==1)
        mTmp =0;
    else if(a==1 &&b==1)
        mTmp =1;
    else if(a==1 &&b==0)
        mTmp =2;
    else if(a==0 &&b==0)
        mTmp =3;

    return mTmp;

}

/****************************************************************
功能:状态转变判别
原型:uint8 Motor_StateJumpOK(uint8 mStateNow, uint8 mStateLast)
输入:当前状态,上一状态;
输出:1非法跳变,0合法跳变
*****************************************************************/
uint8 Motor_StateJumpOK(uint8 mStateNow, uint8 mStateLast)
{

}

出0入0汤圆

发表于 2013-12-15 12:54:21 来自手机 | 显示全部楼层
用4倍频电路

出0入0汤圆

 楼主| 发表于 2013-12-15 13:08:44 | 显示全部楼层
zhouzmt 发表于 2013-12-15 10:47
用逻辑电路搭一个

数电还没有学额。。。

出0入0汤圆

发表于 2013-12-15 15:59:06 | 显示全部楼层
中断里判断下方向就好了,速度用普通计数器

出0入0汤圆

发表于 2013-12-15 19:25:52 | 显示全部楼层
用一个信号做中断,在中断中检测另一个信号的正负就可以了

出0入0汤圆

发表于 2013-12-15 19:26:22 | 显示全部楼层
我就是这样做的,很稳定的

出0入0汤圆

发表于 2013-12-15 20:30:11 | 显示全部楼层
曾经第一个号称1美刀 arm的 LM 有带正交编码器的LM3s6xx。。。不过被Ti杀鸡取卵后,式微了,

出0入0汤圆

发表于 2013-12-15 20:42:01 | 显示全部楼层
stm32 有的。

出0入0汤圆

发表于 2014-1-10 00:41:11 | 显示全部楼层
本帖最后由 wjungle 于 2014-1-10 01:13 编辑

請問我用stm32的encoder interface,使用JGA25-370電機,其規格如下:
給電12V,24KHz, 一圈334 pulse,減速比為1:34
我的stm32是使用TIM3的ch1及ch2來設定為encoder interface,
TIM_EncoderInterfaceConfig (TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
我是可以得到正數及倒數的結果,但是我不知道數的這個數字(getCounter)是代表什麼?
是1秒24K,然後24K * 4嗎?,所以一秒數96K嗎?這樣是超過16 bits ~= 65K
我試著將TIMER的prescaler改為10,得到的數字大約是11000,而不是預期的9600,
另外我是將其電機的白綠線直接接到ch1, ch2,會跟硬體接法有關嗎?
我已經被困擾好幾個禮拜了,而且問不到人,還煩請站內前輩解答,感謝。

出0入0汤圆

发表于 2014-1-10 08:22:48 | 显示全部楼层
这样要看速度和精度了,就是看信号的最高频率了
其实频率不高的话,扫描方式也够用了

出0入0汤圆

发表于 2014-1-10 09:24:22 来自手机 | 显示全部楼层
什么是正交编码器?

出0入0汤圆

发表于 2014-1-10 09:49:22 | 显示全部楼层
边沿中断。直接可以的

出0入0汤圆

发表于 2014-1-10 10:05:37 | 显示全部楼层
计数的话用普通计数器,方向的话可以将两个输出口分别接到一个D锁存器的输入和时钟上

出0入0汤圆

发表于 2014-8-11 01:46:43 | 显示全部楼层
本帖最后由 gy54321 于 2014-8-11 02:15 编辑

四倍频电路的单片机高速算法设计:
参考资料:
http://wenku.baidu.com/link?url=GfdZzz1yE-KdLzFHjhYgNDxoAeLPtYlPUcMLl-41ekndlTDaGIlC7MpPVQhuxD-mxxDTEwVmh7_WhQmT_kvE13Dyrxe1XFoBLo_i9ZCGPEu



  1. u8 MotorX_EncoderStore;  //状态储存变量
  2. void MotorX_phase_check(void) // 编码器
  3. {
  4.         u8 Encoder_temp;

  5.         Encoder_temp= MotorX_EncoderStore;   //读出上次保存存数据
  6.         Encoder_temp=(Encoder_temp<<3)|XEnCoderA;         //读A 相状态
  7.         Encoder_temp=(Encoder_temp<<1)|XEnCoderB;  //读B相状态 ,组成低2位
  8.         switch(Encoder_temp)
  9.         {
  10.                 case 1:  //00 01
  11.                                         MotorX_CounterEncoder--; //编码计数器自减
  12.                                 break;
  13.                
  14.                 case 2:  //00 10
  15.                                         MotorX_CounterEncoder++;//编码计数器自加
  16.                                 break;       
  17.                
  18.                 case 4:  //01 00
  19.                                         MotorX_CounterEncoder++;
  20.                                 break;       
  21.                
  22.                 case 7:  //01 11
  23.                                         MotorX_CounterEncoder--;//编码计数器自减
  24.                                 break;               
  25.                 case 8:  //10 00
  26.                                         MotorX_CounterEncoder--;
  27.                                 break;               
  28.                 case 11:  //10 11
  29.                                 MotorX_CounterEncoder++;
  30.                                 break;       
  31.                 case 13:  //11 01
  32.                                 MotorX_CounterEncoder++;
  33.                                 break;                       
  34.                 case 15:  //10 00
  35.                                         MotorX_CounterEncoder--;
  36.                                 break;       
  37.                 default:     //其他状态为错误,或抖动, 计数值不加减
  38.                                 break;       
  39.         }
  40.         MotorX_EncoderStore=(Encoder_temp&0x03);  //保存最后一次AB相位图
  41. }
复制代码

出0入0汤圆

发表于 2014-10-29 19:29:21 | 显示全部楼层
codefish 发表于 2013-12-15 00:34
呵呵,我也想知道。
在需要用编码器的场合,我一直在用带正交编码器接口的stm32芯片。
但是我也想过和楼主 ...

如果只是测量方向的话可以用D触发器,需要编码器输出AB两相脉冲

出0入0汤圆

发表于 2016-7-27 17:06:55 | 显示全部楼层
收藏学习了

出0入0汤圆

发表于 2016-7-27 17:13:47 | 显示全部楼层
以前XS128就是A相B相电平判断正反转和转速的~可以实现哦

出0入0汤圆

发表于 2016-7-27 17:14:30 | 显示全部楼层
gy54321 发表于 2014-8-11 01:46
四倍频电路的单片机高速算法设计:
参考资料:
http://wenku.baidu.com/link?url=GfdZzz1yE-KdLzFHjhYgNDxoA ...

好东西,感谢分享

出0入0汤圆

发表于 2017-2-25 20:09:48 | 显示全部楼层
HTCL2032芯片

出0入0汤圆

发表于 2017-2-26 10:11:39 | 显示全部楼层
感谢分享,学习了。

出0入0汤圆

发表于 2017-3-25 21:59:02 | 显示全部楼层
当年做飞思卡尔 搞单方向计数,真是痛苦死了。

出5入110汤圆

发表于 2020-11-9 14:42:42 | 显示全部楼层
gy54321 发表于 2014-8-11 01:46
四倍频电路的单片机高速算法设计:
参考资料:
http://wenku.baidu.com/link?url=GfdZzz1yE-KdLzFHjhYgNDxoA ...

Mark,喜欢状态机,这个不错!
测出编码器运行时候的最大频率,按4倍的频率去运行这个状态机。
刚好要控制4个带编码器的减速电机。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 21:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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