当前位置: 首页 > backend >正文

学习STC51单片机36(芯片为STC89C52RCRC)智能小车3(PWM差速小车)

每日一言

        你拥有的此刻,是未来的你回不去的珍贵时光,全力绽放吧。

案例:PWM差速小车

什么叫做差速小车呢?就是我们之前左转和右转我们之前不是 对于左转的logic是当左转的时候,左轮子直接让他不动,右轮子直接全速,那么确实是左转了,但是给我们展示的效果是向左边螺旋旋转,比较抽象,不符合实际   

那么我们要解决这个问题,当然这个也可以单独设置成一个功能,可以保留起来,可以叫做左旋转陀螺丸

我们想要实现正常的左转的话我们不是可以想一下:

我们分别对左轮和右轮分别用定时器中断,就像之前的调速一样,只不过我现在分别控制两个电机,一个转的快一个转的慢实现左右转的平滑性,那么这个就叫做差速

怎么实现??

OK我们来写代码:

我将会将每一段代码的下方进行代码块解释

这个是main.c的代码,那么我们可以看到extern char speedLeft  extern char speedRight  对比我们之前的调速小车的代码,有异曲同工之妙,就是我们之前是将控制一组电机speed,变成了左右电机分别控制,所以需要两个, speedLeft代表左轮的高电平占空比,speedRight  代表右轮的高电平占空比,所以呀,那么我们也需要两个定时器,详情看定时器代码部分

   这个extern char speedLeft 和 extern char speedRight  就是之前讲过的就是用time0.c里面的speedLeft和speedRight的数据,主函数里面先调用定时器0和定时器1,为什么要先调用定时器0,那是因为我定时器0的TMOD写死了,不是用的按位与和按位或的方式,所以先调用定时器0,

while里面就是可以这样理解,在同一时间左轮给18的高电平,右轮给40的高电平,经过一段时间延时后互相切换,那么就形成了左右轮子的速度切换,一会左轮快,一会右轮快 

这个是time0.c部分的代码,因为我们需要对每个轮子分别进行控制快慢,那就是需要设置两个定时器,因为要同步的呀,我们设置定时器1和定时器2,这个两个配置应该不用说了吧我就讲一下这个定时器1的TMOD = 0x1<< 4这个就是0000 0001 这个向左边移4个位置 那就变成了0001 0000 (往左边移动时候空位会补零的哈)

然后我们定义定时器0中断的时候 interrupt  1   定时器1中断的时候 interrupt 4  每个定时器中断有自己的序列号(自己看自己的芯片的手册我是STC89C52RC)

中断函数的话就需要我们定义一个countLeft和countRight函数 这个是在最上面全局变量那边定义就好了,我对左电机进行讲解这个中断函数是怎么写的右电机是一样的写法

首先我们不是定义的0.5ms就中断一次嘛,那我们需要进行一个count++ 计算count的次数,如果count <speedLeft那么就持续高电平  多久呢比如speed在main函数里面写的15,那么这个count就会到第15次中断之前都是高电平,其他的就是都是低电平了,最后到40个count的时候就该清0了,因为我们设计的是20ms一个周期,那么这个PWM波形我们就画出来了,那么这边我们涉及到几个函数也需要提一下这个在mortor.c代码区

原始值  : 0000 0001 (十六进制 0x1)

左移4位: 0001 0000 (十六进制 0x10)

Time0.h的头文件

Motor.h头文件声明函数

Delay.h头文件声明函数

Motor.c文件

这边我们保留了很多没有用的代码,没有关系,我们主要是讲解我们差速小车的函数,我们这边设计了左轮前进函数,左轮停止函数,右轮前进函数,右轮停止函数

左轮函数的前进                                     右电机也是只让前进

左轮函数的停止                                   右轮函数的停止

这个函数是用于定时器中断函数用的,是为了配置PWM波形的,只有前进后退配置得当我们才可以得到想要的差速效果

http://www.xdnf.cn/news/13958.html

相关文章:

  • 【软件安装那些事 4】CAD字体 SHX格式字库 免费 下载 及 使用方法
  • python中的分支结构:单分支、多分支,switch语句
  • JeecgBoot Pro-Online表单开发
  • 【经验篇】自签名TLS证书生成
  • 博客园突发大规模DDoS攻击 - 深度解析云安全防御新范式
  • P10987 [蓝桥杯 2023 国 Python A] 火车运输
  • 第一章 数字电路概述
  • 记一次错误 深拷贝 key值全部小写
  • 三次握手建立连接,四次挥手释放连接——TCP协议的核心机制
  • 上海市计算机学会竞赛平台2022年6月月赛丙组模糊匹配
  • 蚂蚁国际计划在香港和新加坡推出稳定币
  • 关于UEFI:UEFI/BIOS 固件分析
  • 【51单片机】6. 定时器、按键切换流水灯时钟Demo
  • MFC对话框程序使用线程方式更新窗体文本框内容(vs2019)
  • 多平台联动营销:品融电商助食品品牌打造电商“多栖”增长引擎
  • GetX例子:在一个组件里更新状态,在另一个组件里获取更新的数据
  • [Linux] -- 大文件拆分、合并与校验全解析:处理 GB/TB 级文件
  • 2024 一带一路暨金砖国家职业技能大赛(金砖国家未来技能和技术挑战赛)
  • openEuler虚拟机中容器化部署
  • c++虚表的调用
  • CSS 基础选择器、文字控制属性
  • 蓝牙协议GAP(Generic Access Profile)
  • 报表工具顶尖对决系列 — Echarts 展现与导出
  • CC工具箱使用指南:【断线连接】
  • Oracle OCP认证考试考点详解083系列18
  • 如何在SOLIDWORKS工程图中添加材料明细表?
  • 关于联咏(Novatek )自动曝光中Lv值的计算方式实现猜想
  • win11系统安装jdk11教程
  • day22
  • Python 实现一个带进度条的 URL 批量下载工具(含 GUI 界面)