双槽型光耦-可测步进电机正反转、计数&防丢步

背景

42步进电机,基本的一步是1.8度,加上程序中的细分之后就更精准了,比如用64细分,一步就已经是1.8°/64=0.028125°.

而硬件上用的不锈钢码盘是25齿的,如下图,遮挡为0,不遮挡为1,一圈50个高低电平状态。如果用双光耦的话一圈有100个高低电平,分辨率也就是360°/100=3.6°,这个精度在步进电机来说没啥意义。

但是,如果因为一些外力干扰,步进电机丢步了,光耦就可以在此时发挥作用,将情况反馈给步进电机。

例如:步进电机到达目标位置后,被人为旋转过,此时的位置与程序中标定的位置不一致了。
例如:安装在设备上,步进电机被机械限位,无法继续运行了。

单个光耦的硬件电路

光耦的内部,左边是一个发光二极管,右边一个光敏三极管。
当发光二极管的光照到右边的时候,就会给右边光敏三极管的基极提供电流,从而三极管导通;否则三极管截止。

单个光耦的硬件电路如下,导通为0,不导通为1,左边的电阻用于发光二极管的导通,右边的电阻用于上拉。

1、光被挡上,在仿真中我把发光二极管的回路断开,此时三极管截止,电压表就是接单片机IO的,检测为5V,即为高电平。

在这里插入图片描述
2、发光二极管导通时,右边光敏三极管也导通,也就是集电极和发射极就导通了,电压表接的是集电极,电压应该是CE的饱和压降零点几伏,所以为低电平,电压电流如下图所示。
在这里插入图片描述

双光耦的电路

就是上面的原理,把两个槽型光耦串起来,接单片机两个IO口。
在这里插入图片描述

程序原理

两个IO口,能记下四种状态,如下四张图为顺时针方向旋转时我拍的,一看明了,挡住为1,不挡为0.
两个IO口记为S1、S2,单片机读取到的值依次为:00,01,11,10.

在这里插入图片描述

代码

解释都写在注释里了,对着代码看容易理解

//Y轴光耦检测,顺时针S1 S2 —— 00  10  11  01
void Y_OPTO_Check()
{
    u8 input = 0;         //存储光耦状态的值
    static u8 opto_last = 0;
    u8 a,b;

    if(Y_OPTO_S2)         //S2
        input|=(1<<0);   
    if(Y_OPTO_S1)         //S1
  	input|=(1<<1);    //input == 0000 0 0 S1 S2

     a = input^opto_last;           
     if(a!=0){      	  //与上一次状态不同,位置变化,光耦更新
  	b = input^(input>>1);
  	if(a&0x02){   		  //S1与上次不同,顺时针可能从00到10,11到01,逆时针可能从10到00,01到11          
   	    if(b&0x01) Y_opto+=1; //S1与S2不同,定位在顺时针,光耦值+       
   	    else       Y_opto-=1; //S1与S2相同,定位在逆时针,光耦值-
      	}else if(a&0x01){   	  //S2与上次不同,顺时针可能从10到11,01到00,逆时针可能从11到10,00到01
   	    if(b&0x01) Y_opto-=1; //S1与S2不同,定位在逆时针,光耦值-        
   	    else       Y_opto+=1; //S1与S2相同,定位在顺时针,光耦值+  
  	}          
  	opto_last = input;
     }
}
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值