没有正交编码器接口的单片机,,想用,能不能给个解决.....
没有正交编码器接口的单片机,,想用,能不能给个解决 ?? 有没有专门的处理芯片? 呵呵,我也想知道。在需要用编码器的场合,我一直在用带正交编码器接口的stm32芯片。
但是我也想过和楼主同样的问题,至今没找到好的答案。 给马达控制用的一般会带,你不是说 stm32带了么 可以用CPLD,或者专用芯片,例如惠普(安华高)有专用辨向计数芯片。不过成本比mcu就高多了。也可用一片小stm8作为接口。 做飞思卡尔只能用一个可编程的单片机。。求破 health 发表于 2013-12-15 09:44
可以用CPLD,或者专用芯片,例如惠普(安华高)有专用辨向计数芯片。不过成本比mcu就高多了。也可用一片小stm ...
辨向计数芯片 有没有个型号? 同时启用IO的上升沿和下降沿中断(如果不提供则可以用两个IO来分别处理两个边沿),在中断里跑一个状态机就搞定了。 用逻辑电路搭一个 德玛西亚 发表于 2013-12-15 10:14
辨向计数芯片 有没有个型号?
专用解码芯片
http://www.avagotech.cn/pages/cn/motion_control_encoder_products/integrated_circuits/decoder_ic/
成本上来说,还是stm32,stm8合适。 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)
{
}
用4倍频电路
zhouzmt 发表于 2013-12-15 10:47
用逻辑电路搭一个
数电还没有学额。。。 中断里判断下方向就好了,速度用普通计数器 用一个信号做中断,在中断中检测另一个信号的正负就可以了 我就是这样做的,很稳定的 曾经第一个号称1美刀 arm的 LM 有带正交编码器的LM3s6xx。。。不过被Ti杀鸡取卵后,式微了,{:titter:}{:sweat:} stm32 有的。 本帖最后由 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,會跟硬體接法有關嗎?
我已經被困擾好幾個禮拜了,而且問不到人,還煩請站內前輩解答,感謝。 这样要看速度和精度了,就是看信号的最高频率了
其实频率不高的话,扫描方式也够用了 什么是正交编码器? 边沿中断。直接可以的 计数的话用普通计数器,方向的话可以将两个输出口分别接到一个D锁存器的输入和时钟上 本帖最后由 gy54321 于 2014-8-11 02:15 编辑
四倍频电路的单片机高速算法设计:
参考资料:
http://wenku.baidu.com/link?url=GfdZzz1yE-KdLzFHjhYgNDxoAeLPtYlPUcMLl-41ekndlTDaGIlC7MpPVQhuxD-mxxDTEwVmh7_WhQmT_kvE13Dyrxe1XFoBLo_i9ZCGPEu
u8 MotorX_EncoderStore;//状态储存变量
void MotorX_phase_check(void) // 编码器
{
u8 Encoder_temp;
Encoder_temp= MotorX_EncoderStore; //读出上次保存存数据
Encoder_temp=(Encoder_temp<<3)|XEnCoderA; //读A 相状态
Encoder_temp=(Encoder_temp<<1)|XEnCoderB;//读B相状态 ,组成低2位
switch(Encoder_temp)
{
case 1://00 01
MotorX_CounterEncoder--; //编码计数器自减
break;
case 2://00 10
MotorX_CounterEncoder++;//编码计数器自加
break;
case 4://01 00
MotorX_CounterEncoder++;
break;
case 7://01 11
MotorX_CounterEncoder--;//编码计数器自减
break;
case 8://10 00
MotorX_CounterEncoder--;
break;
case 11://10 11
MotorX_CounterEncoder++;
break;
case 13://11 01
MotorX_CounterEncoder++;
break;
case 15://10 00
MotorX_CounterEncoder--;
break;
default: //其他状态为错误,或抖动, 计数值不加减
break;
}
MotorX_EncoderStore=(Encoder_temp&0x03);//保存最后一次AB相位图
} codefish 发表于 2013-12-15 00:34
呵呵,我也想知道。
在需要用编码器的场合,我一直在用带正交编码器接口的stm32芯片。
但是我也想过和楼主 ...
如果只是测量方向的话可以用D触发器,需要编码器输出AB两相脉冲 收藏学习了 {:lol:}以前XS128就是A相B相电平判断正反转和转速的~可以实现哦 gy54321 发表于 2014-8-11 01:46
四倍频电路的单片机高速算法设计:
参考资料:
http://wenku.baidu.com/link?url=GfdZzz1yE-KdLzFHjhYgNDxoA ...
{:lol:} 好东西,感谢分享 HTCL2032芯片 感谢分享,学习了。 当年做飞思卡尔 搞单方向计数,真是痛苦死了。 gy54321 发表于 2014-8-11 01:46
四倍频电路的单片机高速算法设计:
参考资料:
http://wenku.baidu.com/link?url=GfdZzz1yE-KdLzFHjhYgNDxoA ...
Mark,喜欢状态机,这个不错!
测出编码器运行时候的最大频率,按4倍的频率去运行这个状态机。
刚好要控制4个带编码器的减速电机。
页:
[1]