6617|4

654

帖子

26

TA的资源

版主

楼主
 

15“万里”树莓派小车——光电编码器学习(正反转的判断) [复制链接]

  本帖最后由 lb8820265 于 2021-12-7 00:23 编辑

市面上没有使用直接使用树莓派控制的纳姆轮小车,我猜测是因为Linux系统的非实时性,导致没法准确的获取四个轮子的速度,进而无法很好控制小车。

那我就首先啃下这个硬骨头:准确的获取车轮速度。

树莓派电机驱动板中编码电机接口是直接接在树莓派的引脚上的,卖家并没有给出获取编码器值的历程,我来自己探索。

光电编码器原理

买的电机编码器称为霍尔编码器,输出有A相和B相,两相相差90度相位,例如正转和反转的AB相输出波形分别如下图上下部分。

如果以AB相跳变的时刻作为判断触发点,那么一共有8种情况,如下表。

正反转

跳变沿

电平

正转

A上升沿

B低电平

B上升沿

A低电平

A下降沿

B高电平

B下降沿

A低电平

反转

B上升沿

A低电平

A上升沿

B低电平

B下降沿

A高电平

A下降沿

B低电平

树莓派可以设置上升沿或者下降沿触发中断,但是在中断中并不能获取到底是上升沿还是下降沿触发的,可以在中断函数中读取当前引脚电平,用以判断是上升沿还是下降沿触发。

编码器转一圈产生15个脉冲,一次脉冲产生4次中断,而电机减速比为34,也就是轮子转一圈产生2040个值。

编码器连接

将编码器连接在电机扩展板的接口1上,对应WPi接口的21和22号引脚,同时,让电机匀速转动起来。

代码测试

编写测试代码,每次中断发生,就判断是正转和反转,正转就输出“+”,反转就输出“-”,文件名“Encoder_Direction.c”

#include <stdio.h>
#include <wiringPi.h>
long Cnt;
int A_pin=21;
int B_pin=22;
void AInterrupt (void) {
  if(digitalRead (A_pin) ==1){//上升沿
    if(digitalRead (B_pin) ==1){//高电平
      Cnt++;
      printf ("+");
    }else{
      Cnt--;
       printf ("-");
    }
  }else{
    if(digitalRead (B_pin) ==1){//高电平
      Cnt--;
       printf ("-");
    }else{
      Cnt++;
      printf ("+");
    }
  }
  //printf ("%ld\n",Cnt);
}
void BInterrupt (void) {
  if(digitalRead (B_pin) ==1){//上升沿
    if(digitalRead (A_pin) ==1){//高电平
      Cnt--;
       printf ("-");
    }else{
      Cnt++;
      printf ("+");
    }
  }else{
    if(digitalRead (A_pin) ==1){//高电平
      Cnt++;
      printf ("+");
    }else{
      Cnt--;
       printf ("-");
    }
  }
 // printf ("%ld\n",Cnt);
}
int main (void)
{
  wiringPiSetup () ;
  wiringPiISR (A_pin, INT_EDGE_BOTH, &AInterrupt) ;
  wiringPiISR (B_pin, INT_EDGE_BOTH, &BInterrupt) ;
for(;;){
}
  return 0 ;
}

运行结果

        结果中,并不是都是“+”,这说明在判断中发生了错误,错误率大概百分之一,而且并没有明显的规律,这应该是由于非实时性导致的。在运行其他的任务导致没有及时响应中断函数。

之后,我也用python编写了外部中断来获取编码器转向的代码,结果真是惨不忍睹,轮子都停止转动了,数据还在不停的刷新,根本没法用,代码详见帖子最下方。

问题

所以使用树莓派来获取编码器的正反转方法失败了。果然是坑呀,那应该怎么做呢?

源码

GitHub:

C++编码器方向判断:

链接已隐藏,如需查看请登录或者注册

python编码器计数:

链接已隐藏,如需查看请登录或者注册

Gitee:将GitHub链接中github改为gitee

最新回复

"万里"树莓派小车汇总贴: lb8820265的“万里”树莓派小车开源分享 - DIY/开源硬件专区 - 电子工程世界-论坛 (eeworld.com.cn)   目录:   “万里”树莓派小车开张贴  1“万里”树莓派小车——建立项目仓库 2“万里”树莓派小车——python学习(Thonny的使用) 3“万里”树莓派小车——python学习(定时任务) 4“万里”树莓派小车——C++学习(编译与运行,geany使用) 5“万里”树莓派小车——wiringPi学习(延时与线程模拟定时器) 6“万里”树莓派小车——wiringPi学习(PWM与外部中断模拟定时器) 7“万里”树莓派小车——RPi.GPIO学习(PWM与外部中断模拟定时器) 8“万里”树莓派小车——socket学习(本机通讯) 9“万里”树莓派小车——socket学习(TCP两机通讯) 10“万里”树莓派小车——socket学习(UDP两机通讯) 11“万里”树莓派小车——socket学习(Android发送) 12“万里”树莓派小车——socket学习(Android收发) 13“万里”树莓派小车——配件准备 14“万里”树莓派小车——电机驱动学习 15“万里”树莓派小车——光电编码器学习(正反转的判断) 16“万里”树莓派小车——光电编码器学习(转速的获取) 17“万里”树莓派小车——VSCode学习(编译和调试) 18“万里”树莓派小车——Makefile学习 19“万里”树莓派小车——VSCode学习(多C文件链接调试) 20“万里”树莓派小车——电机控制学习(控制速度) 21“万里”树莓派小车——电机控制学习(4轮速度控制) 22“万里”树莓派小车——手机遥控电机转动 23“万里”树莓派小车——无屏幕连接树莓派 24“万里”树莓派小车——树莓派64位系统bullseye跑分测试 25“万里”树莓派小车——纳姆轮控制 26“万里”树莓派小车——程序开机启动 27“万里”树莓派小车——固定和获取树莓派IP地址 28“万里”树莓派小车——小车组装 29“万里”树莓派小车——直行偏向问题与新控制模式 30.“万里”树莓派小车——第一阶段完成展示(从零开始介绍)   详情 回复 发表于 2022-3-21 13:40
点赞 关注
个人签名QQ:252669569
 
 

回复
举报

1万

帖子

2854

TA的资源

管理员

来自 2楼
 

"万里"树莓派小车汇总贴:

lb8820265的“万里”树莓派小车开源分享 - DIY/开源硬件专区 - 电子工程世界-论坛 (eeworld.com.cn)

 

目录:

 

“万里”树莓派小车开张贴 

1“万里”树莓派小车——建立项目仓库

2“万里”树莓派小车——python学习(Thonny的使用)

3“万里”树莓派小车——python学习(定时任务)

4“万里”树莓派小车——C++学习(编译与运行,geany使用)

5“万里”树莓派小车——wiringPi学习(延时与线程模拟定时器)

6“万里”树莓派小车——wiringPi学习(PWM与外部中断模拟定时器)

7“万里”树莓派小车——RPi.GPIO学习(PWM与外部中断模拟定时器)

8“万里”树莓派小车——socket学习(本机通讯)

9“万里”树莓派小车——socket学习(TCP两机通讯)

10“万里”树莓派小车——socket学习(UDP两机通讯)

11“万里”树莓派小车——socket学习(Android发送)

12“万里”树莓派小车——socket学习(Android收发)

13“万里”树莓派小车——配件准备

14“万里”树莓派小车——电机驱动学习

15“万里”树莓派小车——光电编码器学习(正反转的判断)

16“万里”树莓派小车——光电编码器学习(转速的获取)

17“万里”树莓派小车——VSCode学习(编译和调试)

18“万里”树莓派小车——Makefile学习

19“万里”树莓派小车——VSCode学习(多C文件链接调试)

20“万里”树莓派小车——电机控制学习(控制速度)

21“万里”树莓派小车——电机控制学习(4轮速度控制)
22“万里”树莓派小车——手机遥控电机转动

23“万里”树莓派小车——无屏幕连接树莓派

24“万里”树莓派小车——树莓派64位系统bullseye跑分测试

25“万里”树莓派小车——纳姆轮控制

26“万里”树莓派小车——程序开机启动

27“万里”树莓派小车——固定和获取树莓派IP地址

28“万里”树莓派小车——小车组装

29“万里”树莓派小车——直行偏向问题与新控制模式

30.“万里”树莓派小车——第一阶段完成展示(从零开始介绍)

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

玩板看这里:

https://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!

 
 
 

回复

1295

帖子

0

TA的资源

纯净的硅(中级)

板凳
 

很简洁不错,和以前turbo c编程风格类似。c语言对硬件操作非常好!这个对51芯片来说容易实现的。

 
 
 

回复

5219

帖子

239

TA的资源

管理员

4
 

汇总(已更新16篇):lb8820265的“万里”树莓派小车开源分享

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

7462

帖子

2

TA的资源

五彩晶圆(高级)

5
 

有意思,等你做完!

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表