测试程序

#define PinA 2 //外部中断0
#define PinZ 3 //外部中断1
#define PinB 9 //编码器的OUT_B信号连接到数字端口8
#define T 200    //定义采集时间周期单位ms
unsigned long time1 = 0; // 时间标记
volatile long PulSum_CW = 0;   //定义长整型不可修改脉冲数
volatile long PulSum_CCW = 0;   long PulSum_CW_t0 = 0;         //定义记录顺时针方向 t0 时刻脉冲数变量
long PulSum_CW_t0_T = 0;       //定义记录顺时针方向 t0+T 时刻脉冲数变量float Rad_CW_Speed = 0.000;    //定义顺时针角速度
float Rad_CCW_Speed = 0.000;    //定义逆时针角速度long PulSum_CCW_t0 = 0;        //定义记录逆时针方向 t0 时刻脉冲数变量
long PulSum_CCW_t0_T = 0;      //定义记录逆时针方向 t0+T 时刻脉冲数变量// 记录角度
int Rad = 180;void setup(){pinMode(PinA, INPUT_PULLUP);//因为编码器信号为欧姆龙E6B2-CWZ6C,为开漏输出,因此需要上拉电阻,此处采用arduino的内部上拉输入模式,置高pinMode(PinB, INPUT_PULLUP);//同上attachInterrupt(0, Encode, FALLING);//脉冲中断函数:捕捉A相信号,并判断A、B相先后顺序Serial.begin (9600);
}void loop()
{// 角度计算程序Rad = int((PulSum_CW - PulSum_CCW)/6.944) % 360; if (Rad>=180) {Rad = Rad - 360;}PulSum_CW_t0   = PulSum_CW;  PulSum_CCW_t0   = PulSum_CCW;    //采集t0时刻的脉冲数delay(T);                                                     //等待一个T时间PulSum_CW_t0_T = PulSum_CW;  PulSum_CCW_t0_T = PulSum_CCW;    //采集t0+T时刻的脉冲数delay(T);                                                     //等待一个T时间// 如果检测到正向角速度,那么就打印角速度,以及累计的角度if (PulSum_CW_t0_T - PulSum_CW_t0 != 0){Rad_CW_Speed = (PulSum_CW_t0_T - PulSum_CW_t0);   //// 显示正向(CW)角速度 Rad_CW_Speed--->              //打印出来速度//Serial.print("AS:");                            //打印出来速度wSerial.print(Rad_CW_Speed);Serial.print(":");            //Serial.print("/A:");Serial.print(Rad);Serial.print("\n");}  // 如果检测到反向角速度,那么就打印角速度,以及累计的角度if (PulSum_CCW_t0_T - PulSum_CCW_t0 != 0){Rad_CCW_Speed = (PulSum_CCW_t0 - PulSum_CCW_t0_T);//Serial.print("AS:");Serial.print(Rad_CCW_Speed);Serial.print(":");            //Serial.print("/A:");Serial.print(Rad);Serial.print("\n");}}
void Encode()
{//当编码器码盘的OUTA脉冲信号下跳沿每中断一次,//if ((millis() - time1) > 5)//{if ((digitalRead(PinA) == LOW) && (digitalRead(PinB) == HIGH)){PulSum_CW ++;}else{PulSum_CCW ++;}//}//time1 == millis();
}

注意事项

  1. 单片机需要用到中断引脚,因此需要考虑中断数量足够的单片机UNO/Nano。

https://item.taobao.com/item.htm?spm=a1z09.2.0.0.7c462e8dW1JbJF&id=624810490543&_u=g1o5c92q9ce3


How to use the L298N Motor Driver




轮子直径:42mm
一圈的周长为:π⋅d\pi \cdot dπ⋅d = 3.14 * 42 mm = 131.88 mm
观察电机参数可知:旋转一圈产生2个脉冲
其中有个参数为基础脉冲:7ppr,理解为pulses per revolution电机每转的脉冲数,即电机不转编码器也会产生7个脉冲。不过我们使用的测速方式是取一段时间的脉冲差值,所以不影响测速效果。

测试了一些数据,关于电机设置最大PWM=255时,电机在不同的时间间隔产生的脉冲数

PWM 时间间隔 脉冲数(左电机) 脉冲数(右电机)
255 1000 ms 1933, 1936, 1947, 1940, 1951 2074, 2073, 2074, 2079, 2070
100 ms 142, 143, 142, 141, 142 205, 205, 206, 204, 205
200 ms 338, 342, 343, 344, 345 205, 205, 206, 204, 205
500 ms 960, 958, 958, 959, 956 1037, 1037, 1036, 1038, 1040
PWM 时间间隔 脉冲数(左电机) 脉冲数(右电机)
55 1000 ms 1032, 1031, 1029, 1033, 1032 1139, 1151, 1153, 1139, 1156
100 ms 34, 33, 33, 32, 31 61, 59, 61, 61, 60
200 ms 104, 106, 101, 105, 101 173, 173, 173, 175, 175
500 ms 421, 427, 423, 426, 426 551, 552, 553, 554, 555

测量时电池电压:7.44 V

最高输出255时,电机测量脉冲近似为2000个(因为只测量了下降沿,全算上应该是4000个),即转了2000圈。而电机的减速比为40:1,那么编码器的2000就等价于轮子的50圈,与所标参数一致。
换算成实际距离,电机的全速运转时转速为131.88mm/s。这是理论计算出来的速度。

实际测试,8s 运行了3块地砖,也就是120cm,速度大概是150mm/s。

而一圈是131.88mm,等价于1.14转/秒。一秒产生了2000个脉冲。

通过上述分析,暂时建立如下关系

输出功率 时间 圈数 脉冲数 距离 速度
255 1s 1 2000 131.88mm 13.19cm/s
55 1s 1 1000 131.88mm 7.19cm/s

最小速度为 7cm/s。


【小项目关键技术二】UGV电机编码测速相关推荐

  1. 【小项目关键技术】硬件通信三种方式、串口、IIC、SPI

    文章目录 串口UART: IIC SPI SWD 仿真下载接口 串口UART: 引脚 功能 VCC GND TXD 发送数据输出引脚. RXD 接收数据输入引脚. IIC 引脚定义为:SCL.SDA ...

  2. 【小项目关键技术六】控制北斗 GPS 定位 / UWB 室内定位

    文章目录 UWB 定位 GPS 定位 UWB 定位 产品链接:维特智能UWB室内定位传感器模块平面坐标二维厘米级通讯距离测量 产品资料地址:(打开网站搜索型号获取资料) 模块实物如下: 指令 功能 0 ...

  3. 【小项目关键技术五】控制全彩 WS2812 灯环/灯带

    Ref: Arduino控制WS2812灯带(灯环) #include <FastLED.h>#define LED_PIN 13// Information about the LED ...

  4. 【小项目关键技术七】MPU6050

    Ref: MPU 6050 Tutorial | How to Program MPU 6050 With Arduino connections for our Arduino UNO and NA ...

  5. 【小项目关键技术四】液晶显示屏

    分享一个刷新率比较高的,利用的是 UTFT.h 的库. 完整版资料地址为:https://pmdway.com/blogs/product-guides-for-arduino/using-the-0 ...

  6. 100个vc小项目开发:二、一步一点设计音乐播放器 [I]

    100个vc小项目开发:二.一步一点设计音乐播放器 [源码解读] 文章作者: July 软件来源:开源 ================== 1.有不正之处,恳请指正. 2.本文贴出的是关键实现代码部 ...

  7. Python小项目——生成个性二维码

    Python小项目--生成个性二维码 现代社交离不开微信,QQ,那么今天就教你用 Python 生成自己的个性二维码

  8. STC用PCA测量脉宽_利用微处理器设计的电机数字测速系统,抗干扰能力强、测量精确...

    为了满足工业电气控制中对发动机.电动机.机床主轴等旋转设备的转速测量和控制,设计一款基于微控制器控制的霍尔传感器测速系统,此系统具有抗干扰能力强.测量精确等优点, 在电气工程实践中,经常会遇到各种需要 ...

  9. ftp关键技术二:nobody进程创建和使用(一)

    本文将从以下几个方面具体阐述nobody进程的前世今生 为什么需要nobody进程? 进程间通信的协议制定 为什么需要nobody进程 (1)为什么要使用nobody进程和服务进程两个进程? ​ 1. ...

最新文章

  1. MySQL行转列完整SQL示例
  2. chrome浏览器好用的插件
  3. LINQ Order by 排序
  4. method=post和method=get的区别是啥【汇总】
  5. (2)vue.js介绍
  6. et al、e.g.、i.e.读音及释义
  7. jQuery插件_SuperSlide插件(焦点图切换、标签切换、多个slide组合)
  8. ARM Cortex-M0(1)---浅谈ARM Cortex-M0
  9. python matlabplot写字_Matlab中plot基本用法的具体使用
  10. shell脚本编程学习(一)
  11. CAD打断线条的快捷键是什么?CAD打断线条教程
  12. 看机器学习如何预测债券收益率
  13. 新计算机分区,全新的电脑怎么给新硬盘分区?
  14. 记录一个vue项目报错UnhandledPromiseRejectionWarning: Unhandled promise rejection.
  15. 物联网相关技术术语表
  16. VUE项目中安装和使用vant组件
  17. python制作收费_python分段计费demo
  18. svn强制弹出账号密码对话框
  19. Unity3D windows平台视频录制录屏插件 UnityRecorder
  20. sem创意怎么写,10倍创意操作技巧教会你

热门文章

  1. 软件工程(2019)第四次作业-结队作业
  2. [Java]list集合为空或为null的区别
  3. 类成员函数作为函数参数/回调函数 出现error C3867
  4. 对简单单元格的增删改
  5. Java心得--键值、枚举器
  6. Paper Review: Bayesian Shrinkage towards Sharp Minimaxity
  7. UA SIE545 优化理论基础0 优化建模3 线性回归的参数估计问题
  8. Base64的编码规则和C#实现
  9. 字符串的前缀与后缀和简单示例程序win32版
  10. Day24--Part2-伪Ajax(iframe)