伺服电机脉冲控制的多种方式(AB相脉冲,方向脉冲,CW/CCW脉冲)

脉冲信号可以分为AB相脉冲,脉冲+方向,CW/CCW脉冲。

这三种信号格式,在十几年前或者还有明显的相对优缺点和适用场合,现在就已经无所谓了,即使在使用上还是有所区分,也基本上是由于历史习惯。

1、A/B信号:

  位置传感器最喜欢的格式。因为,早期的编码器直接就是用两个传感器输出两路信号的。靠传感器安装的相对位置确保两个信号的相对相位关系。在传感器后面直接加上两个电压比较器,就直接得到了A/B的方波信号输出。如果要让编码器输出两位两种信号,都还需要特定的信号转换。

现在,高分辨率的编码器/光栅尺/磁栅尺……,虽然内部传感器上产生的还是相位差1/4周期的两路信号,但在输出时都要经过细分处理,而细分以后输出什么形式的脉冲信号,其实在技术上没有什么区别。还采用A/B信号的形式,基本上是由于传统。因为这样可以匹配各种现成的接收器。

对于A/B信号的所谓“四倍频”,是对信号的解读方式,所以不存在“输出本身就被4倍频”这种概念。所谓四倍频,是指接受信号的计数器,不是每个脉冲周期计数一次,而是A/B的每个上升沿/下降沿都各计数一次,一个完整的信号周期会计数四次。

对于编码器类的产品本身标称的分辨率是只一个完整信号周期对应的长度/角度,还是1/4信号周期对应的长度/角度,在习惯上各有不同。一般来说,旋转编码器说XXX线/转的时候,是指完整的信号周期。直线的光栅磁栅在说分辨率的时候,是指1/4周期。但是也不敢保证所有产品都是这样标称,具体产品,还是问清楚厂家或商家比较有谱。不过,国内有些商家,由于行业竞争激烈,养不起技术服务人员,甚至有些厂家也养不起做服务的技术人员。客户能接触到的人,也不一定真的清楚细节吧。

 

比如下面这个周期

A 1 0 0 1

B 1 1 0 0

假设静止在 A0B1这个位置,A被干扰多了1个高电平脉冲,变成A1B1了,当干扰过去之后,就会恢复A0B1。而其它2种,多一个脉冲就真的多一个脉冲了。并且在高速运动中,因为必然是向一个方向走,比如上面这个例子,所有数字量逻辑都必须符合从左到右这个规律。任何反方向的移动都可以认为是干扰排除。还是在A0B1这个位置,下一个位置必须是A0B0,如果是A1B1,就认为A被干扰了。

 

脉冲+方向,CW/CCW脉冲这2种,相对而言我认为CW/CCW相对好一点,因为脉冲+方向必须是方向正确后的脉冲才有正确的方向。如果切方向切在脉冲输入后,那么切方向前的脉冲就反了。

 

2、脉冲/方向信号

  控制器最喜欢的信号格式,因为只要一个高速脉冲输出口就可以实现一个电机的控制。现在,对于各种控制核心(MCU、FPGA、DSP等等)来说,高速脉冲输出口已经不算是什么宝贵资源了。而且不同形式的脉冲格式转换也很简单,但是这个传统依然还在。而且一些完整的控制产品,比如PLC上,高速脉冲输出口也还是一种有限的资源。

 

3、CW/CCW脉冲

  驱动器最喜欢的格式,因为这种格式解读起来最简单。A/B格式,要识别每个上升沿和下降沿,CW和CCW只要识别各自的一个边沿就可以了。脉冲/方向信号虽然也很简单,但是存在一个匹配的问题,当匹配不好的时候,在特定情况下会出现解读错误,造成可累计的误差。

 

综上所述,

A/B脉冲:有一点绝对值的味道,可以纠错。

CW/CCW脉冲:对电磁干扰无法免疫,但是2个输出独立。

脉冲+方向:对电磁干扰无法免疫,2个输出相互影响必须同时作用。

  • 9
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于伺服电机控制方法有很多种,以下是一种可能的实现方式,仅供参考: module servo_controller( input clk, // 时钟信号 input reset, // 复位信号 input [7:0] target_position, // 目标位置信号,8位二进制数 output reg [7:0] current_position, // 当前位置信号,8位二进制数 output reg direction, // 转动方向信号,0表示逆时针,1表示顺时针 output reg enable // 使能信号,1表示允许转动,0表示停止转动 ); // 定义状态机状态 parameter IDLE = 2'b00; // 空闲状态 parameter MOVE_CCW = 2'b01; // 逆时针转动状态 parameter MOVE_CW = 2'b10; // 顺时针转动状态 reg [1:0] state; // 当前状态寄存器 // 初始化 always @ (posedge clk, posedge reset) begin if (reset) begin state <= IDLE; current_position <= 8'b00000000; direction <= 1'b0; enable <= 1'b0; end else begin state <= IDLE; current_position <= 8'b00000000; direction <= 1'b0; enable <= 1'b1; end end // 状态机逻辑 always @ (posedge clk) begin case (state) IDLE: begin if (enable && target_position != current_position) begin if (target_position > current_position) begin direction <= 1'b1; // 顺时针转动 state <= MOVE_CW; end else begin direction <= 1'b0; // 逆时针转动 state <= MOVE_CCW; end end end MOVE_CCW: begin if (enable && target_position != current_position) begin current_position <= current_position - 1; if (current_position == target_position) begin state <= IDLE; end end else begin state <= IDLE; end end MOVE_CW: begin if (enable && target_position != current_position) begin current_position <= current_position + 1; if (current_position == target_position) begin state <= IDLE; end end else begin state <= IDLE; end end default: begin state <= IDLE; end endcase end endmodule 以上程序实现了一个简单的伺服电机控制器,能够根据目标位置信号控制电机转动。其中使用了一个状态机来控制电机的转动方向和停止。由于实际情况可能会有很多不同的要求,以上代码仅供参考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值