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