循迹原理 - PWM讲解
循迹原理
循迹小车为何会像是长了眼睛一样,紧紧跟着黑线走呢?到底是什么束缚着它不脱轨呢?
小车底部有一个循迹传感器,在传感器两侧各有一对发射和接收的探头。当小车沿着白色地毯上的黑线行走的时候,刚好两侧探头处于黑线两侧,也就是处于白色背景之上。
从工作原理上看,循迹的传感器有红外传感器和灰度传感器两类,以下进行详细介绍。
红外传感器
• 红外传感器的发射二极管会不断发射红外线。
• 当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态。
• 被检测物体出现在检测范围内时,红外线被反射回来且足够强大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。
灰度传感器
• 灰度传感器是模拟传感器,它由一个发光二极管和一个光敏电阻组成并安装在同一平面。
• 工作时二极管会发光,地面会反射二极管的光从而被光敏电阻感知。由于不同颜色的检测面对光的反射程度的不同,灰度传感器的光敏电阻对不同检测面返回光所激发的电阻值也不同,由此进行**灰度值(不同颜色的深浅)**的检测。
• 灰度的工作电压范围比较宽,当电源电压波动比较大的时候也可以正常工作。它输出的是连续的模拟信号,所以很容易通过A/D转换器或者简单的比较器实现对物体反射率的判断。
循迹原理
当安装循迹模块的小车在黑线轨道时,两边的传感器位于黑线两侧。此时定义两只传感器检测到地面为白色的时候,小车两侧轮子都同样转速向前。
对于小车,主要会有以下几种状态:
• 两只轮子同速向前——前进
• 两只轮子同速向后——后退
• 左边轮子转速大于右边轮子转速——右转
• 右边轮子转速大于左边轮子转速——左转
• 转速为0——停止
根据传感器返回值调整小车状态
因此,当我们任意一个传感器检测到地面为黑色的时候(此时说明小车传感器来到黑线上方,即将偏离黑线轨道),根据循迹传感器返回值,小车被控制进行左/右转。
如何实现左右转?
上面已经提到,当两只轮子转速不同步的时候可以实现左右转。
我们循迹小车用的是直流电机作为动力,因此可以通过控制电机的电压从而控制电机的速度,从而让小车左右轮子产生速度差,实现左右转弯。
如何控制直流电机电压呢?
我们引出新的知识——PWM(脉冲宽度调制)
由于Arduino的I/O口标准输出为5V,我们可以控制周期内占空比来实现输出不同的电压。
PWM讲解
脉冲宽度调制(PWM)
PWM是英文 “Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
——摘自百度百科
PWM的单位是:Hz,可看出PWM表示的是频率。
T(周期) = 1/f(频率)
f = 1/T
对于Arduino的IO口输出,信号从高电平到低电平再到高电平的时间为一个周期 T ,可知 PWM 的频率 f 表示的就是一秒钟内PWM有多少个周期。
占空比
• 占空比是一个脉冲周期内,高电平的时间占整个周期时间的比例。
• 简单理解:占空比可以理解为在1个周期 T 的输出中,高电平的状态占整个周期 T 的比例。
• 当一个周期内IO口仅输出高电平时,那么我们的占空比就为100%。因为一个周期的时间发生的变化是人眼无法观察到的,所以我们可以当作一个周期内,我们输出的电压是5V(Arduino IO口高电平状态下的标准输出电压为5V)。
• 当输出高电平的时间为1/2T时,我们的占空比就为50%,此时我们输出的电压就可以当作2.5V。
PWM控制循迹小车转弯
之前的文章中提到控制循迹小车转弯是利用左右轮子转速不同。
对于直流电机,转速和电压相关,因此我们可以控制输入给电机的电压从而控制左右轮子的转速。
已知Arduino的IO口输出的是数字信号,并且IO口只能输出高电平或者低电平。
假设高电平为5V,低电平则为0V,那么我们完全可以通过PWM模拟输出任意大于0V小于等于5V的电压。这个时候我们就需要用到Arduino开发板上的模拟输出引脚以及analogWrite (pin,value) 语法来控制该引脚的PWM信号。
具体实现:
- 假设一个周期为 T ,高电平状态输出为5V,低电平状态输出为0V。
- 通过改变IO口输出的方波的占空比,我们可以将数字信号改变为模拟电压信号,并且理论上我们可以模拟出任意范围在0V(低电平)到5V(高电平)之间的电压。
- 我们在1个脉冲周期内输出高电平的时间占总周期的1/2,那么我们输出的电压就是2.5V了。
- 1个脉冲周期内输出高电平的时间占总周期的 75%,那么我们输出的电压就是3.75V了。
- 以上例子中的 1/2、75% 就是占空比。此时我们就很轻松通过PWM技术,也就是改变高电平的占空比来控制输入到直流电机的电压,从而使不同电机的运转产生速度差,完成差速转弯。
Arduino Uno的PWM引脚
在Arduino Uno的众多数字引脚中,只有数字前带 ~ 符号的引脚支持PWM,这个大家一定要注意。
学习资料
关于PWM具体详细解释、Arduio编程中如何使用……在此附上部分优质教程网址,大家自主学习。
- 郭天祥老师讲PWM视频(哔哩哔哩)
https://www.bilibili.com/video/BV1Fp4y1s7Qr/?spm_id_from=333.337.search-card.all.click&vd_source=6a1fcd351fb9b00796e2e41ad793d678
Arduino官网讲解PWM
https://create.arduino.cc/projecthub/muhammad-aqib/arduino-pwm-tutorial-ae9d71
- PWM原理及Arduino使用PWM详解 (CSDN)
https://blog.csdn.net/m0_46336441/article/details/120962470?ops_request_misc=%257B%2522request%25
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?