小车电机调试右电机编码器返回数据异常

本人在电动轮椅的基础上进行改装,在两个轮椅后轮安装电机编码器,实现闭环调速。

使用如下LPD3806型号的光电编码器,如下图所示:

将该电机编码器与后轮的电机轴用联轴器相连接,同时设计出编码器之间来固定编码器。

在将arduino和电机编码器连接后进行调试,使用修改过后的ros_arduino_bridge在arduino中对左右电机进行了调试,发现左右电机都能够正常驱动转动,调试过程中遇到如下问题:

由图中可以看出,左编码器读数正常,右编码器读数异常,一直显示为0,起初我怀疑是右电机编码器存在问题,于是将左电机卸下,把右电机接上左电机的连线,发现编码器也能有数据反馈,且数据是变动的,可以发现右电机编码器正常。

于是我又怀疑是右电机配备的编码器引线存在问题,但是用万用表进行测试后发现,编码器信号线都是存在电流的,那应该信号线没有问题。

最后,我将右编码器的引线连接arduino的引脚更换,发现arduino读数恢复正常,通过查阅资料得知,之前连接的arduino引脚无法为编码器提供出发电平,所以一直没有读数,而更换的引脚可以出发电平,进而计数成功。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用Arduino Mega2560来控制双轮驱动小车行走40cm x 40cm正方形路线的代码: ``` //引入编码器库 #include <Encoder.h> //定义左两个电机的控制引脚 #define motor1Pin1 6 #define motor1Pin2 7 #define motor2Pin1 8 #define motor2Pin2 9 //定义两个编码器的引脚 #define encoder1PinA 2 #define encoder1PinB 3 #define encoder2PinA 18 #define encoder2PinB 19 //定义两个编码器对象 Encoder encoder1(encoder1PinA, encoder1PinB); Encoder encoder2(encoder2PinA, encoder2PinB); //定义小车轮子直径 #define wheelDiameter 65 //定义左两个电机的速度 #define motorSpeed 150 void setup() { //初始化电机引脚 pinMode(motor1Pin1, OUTPUT); pinMode(motor1Pin2, OUTPUT); pinMode(motor2Pin1, OUTPUT); pinMode(motor2Pin2, OUTPUT); //设置编码器引脚为输入模式 pinMode(encoder1PinA, INPUT); pinMode(encoder1PinB, INPUT); pinMode(encoder2PinA, INPUT); pinMode(encoder2PinB, INPUT); //打开串口调试信息 Serial.begin(9600); } void loop() { //小车行走40cm的距离 for (int i = 0; i < 4; i++) { //计算每个轮子需要转动的步数 int steps = (40 / (wheelDiameter * PI)) * 500; //重置编码器计数器 encoder1.write(0); encoder2.write(0); //左轮子同时向前转动 digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, HIGH); digitalWrite(motor2Pin2, LOW); //循环直到两个轮子都转动了指定步数 while (encoder1.read() < steps || encoder2.read() < steps) { Serial.print(encoder1.read()); Serial.print(","); Serial.println(encoder2.read()); } //停止左轮子的转动 digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, LOW); //等待一段时间 delay(1000); //左轮子向前转动 digitalWrite(motor1Pin1, HIGH); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, LOW); //循环直到左轮子转动了指定步数 while (encoder1.read() < steps) { Serial.print(encoder1.read()); Serial.print(","); Serial.println(encoder2.read()); } //停止左轮子的转动 digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); //等待一段时间 delay(1000); //轮子向前转动 digitalWrite(motor1Pin1, LOW); digitalWrite(motor1Pin2, LOW); digitalWrite(motor2Pin1, HIGH); digitalWrite(motor2Pin2, LOW); //循环直到轮子转动了指定步数 while (encoder2.read() < steps) { Serial.print(encoder1.read()); Serial.print(","); Serial.println(encoder2.read()); } //停止轮子的转动 digitalWrite(motor2Pin1, LOW); digitalWrite(motor2Pin2, LOW); //等待一段时间 delay(1000); } } ``` 这段代码使用了两个GMR为500线的编码器来控制小车的行走距离和方向,利用了轮子直径和编码器的计数来计算需要转动的步数。通过控制左两个电机的转动来实现小车的前进、后退、左转和转。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值