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

学习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波形的,只有前进后退配置得当我们才可以得到想要的差速效果

相关文章:

  • Redis 安装实践:基于鲲鹏 ARM 架构 Ubuntu 环境
  • 随记:sw2urdf插件导出urdf模型在ROS2-rviz2显示
  • 电流传感器在工业自动化中的应用
  • Tess4J:基于 Java 的 OCR 解决方案
  • 【doris】doris集成ranger控制权限,ranger配置无法存储doris密码password信息
  • 代码随想录训练营第三十天 | 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间
  • 【Net】OPC UA(OPC Unified Architecture)协议
  • 图片压缩工具类
  • 深入剖析 C++ 默认函数:拷贝构造与赋值运算符重载
  • 你管这玩意叫网络?网络图解
  • CANoe入门(1)-- 创建新CANoe工程
  • 开源综合性网络安全检测和运维工具-TscanClient
  • 【Python打卡Day36】信贷项目的神经网络训练@浙大疏锦行
  • docker-compose容器单机编排
  • NLP基础与词嵌入:让AI理解文字(superior哥深度学习系列第13期)
  • Apache 反向代理Unity服务器
  • 使用VSCode开发FastAPI指南
  • pandas 字符串列迁移至 PyArrow 完整指南:从 object 到 string[pyarrow]
  • JFLASH 提示license 配置操作 Sorry,no valid license for I-Flash found.
  • ABP vNext + Redis Streams:构建实时事件驱动架构
  • 新疆网站开发报价/黄页88网络营销宝典
  • 做公司网站员工保险/太原seo网络优化招聘网
  • 宁波建网站外包/怎么建公司网站
  • wordpress模板转为emlog/江北seo综合优化外包
  • 宠物店网站模板/深圳全网营销方案
  • 网站开发是自己开发还是外包的/2023第二波疫情已经到来了吗