小车PWM调速-左右轮差速转弯

小车PWM调速-左右轮差速转弯

小车PWM调速-左右轮差速转弯

之前写的左转和右转函数都是一个轮子停止,另一个轮子转动,才实现了转弯效果,那差速就是,两个轮子都转动,只不过一个轮子快,一个轮子慢,这样就实现了较平滑的转弯

左转:右轮快,左轮慢

右转:右轮慢,左轮快

程序

程序文件

1.main.c:调用定时器0和定时器1初始化函数,while循环内隔一段时间改变左右轮的速度,赋不同的值实现差速转弯

2.Motor.c:小车前进、后退、左转、右转和停止的函数

3.Delay.c:延时函数

4.Timer.c:定时器0和定时器1初始化函数,定时器0中断处理函数PWM控制左轮前进,定时器1中断处理函数PWM控制右轮前进

1.拿之前的小车PWM调速-写死的代码进修修改,因为要分别控制两个轮子,两个轮子的速度要不一样,所以要往Motor.c电机驱动头文件中增加单独控制左右轮的函数

其他前进后退等函数不变,只是增加下面的函数即可

/**

* @brief 控制小车左轮前进

* @param 无

* @retval无

*/

void GoForwardLeft()

{

leftA = 0;

leftB = 1;

}

/**

* @brief 控制小车左轮停止

* @param 无

* @retval无

*/

void StopLeft()

{

leftA = 0;

leftB = 0;

}

/**

* @brief控制小车右轮前进

* @param无

* @retval无

*/

void GoForwardRight()

{

rightA = 0;

rightB = 1;

}

/**

* @brief控制小车右轮停止

* @param无

* @retval无

*/

void StopRight()

{

rightA = 0;

rightB = 0;

}

2.因为之前的代码已经初始化了定时器0,用作两个轮子的PWM调速,所以这里需要再加入定时器1,定时器0用于左轮的PWM控制,定时器1用于右轮的PWM控制,在各自的中断处理函数中,定时器0中断调用左轮前进和停止,定时器1中断调用右轮前进和停止

#include

#include "Motor.h"

#include "Delay.h"

unsigned char CountLeft;

unsigned char SpeedLeft;

unsigned char CountRight;

unsigned char SpeedRight;

/**

* @brief 定时器0初始化函数,左轮PWM控制

* @param 无

* @retval 无

*/

void Timer0Init(void) //0.5毫秒@11.0592MHz

{

TMOD &= 0xF0;

TMOD |= 0x01; //设置定时器模式

TL0 = 0x33; //设置定时初值

TH0 = 0xFE; //设置定时初值

TF0 = 0; //清除TF0标志

TR0 = 1; //定时器0开始计时

EA = 1; //开启总中断

ET0 = 1; //开启定时器0中断

}

//Timer0中断处理函数,每隔0.5毫秒进入一次中断

void Timer0_Rountine() interrupt 1

{

CountLeft++;

TL0 = 0x33;

TH0 = 0xFE;

if(CountLeft < SpeedLeft)

{

//左轮前进

GoForwardLeft();

}

else

{

//左轮停止

StopLeft();

}

if(CountLeft == 40) //20ms

{

CountLeft = 0;

}

}

/**

* @brief 定时器1初始化,右轮PWM调速

* @param 无

* @retval无

*/

void Timer1Init(void) //0.5毫秒@11.0592MHz

{

TMOD &= 0x0F;

TMOD |= 0x10; //设置定时器模式

TL1 = 0x33; //设置定时初值

TH1 = 0xFE; //设置定时初值

TF1 = 0; //清除TF1标志

TR1 = 1; //定时器1开始计时

EA = 1; //开启总中断

ET1 = 1; //开启定时器1中断

}

//Timer1中断处理函数,每隔0.5毫秒进入一次中断

void Timer1_Rountine() interrupt 3

{

CountRight++;

TL1 = 0x33;

TH1 = 0xFE;

if(CountRight < SpeedRight)

{

//右轮前进

GoForwardRight();

}

else

{

//右轮停止

StopRight();

}

if(CountRight == 40) //20ms

{

CountRight = 0;

}

}

3.main函数中外部声明左右轮的速度变量,在while循环内给左右轮变量赋不同的值即可实现差速转弯

extern unsigned char SpeedLeft;

extern unsigned char SpeedRight;

void main()

{

Timer0Init();

Timer1Init();

while(1)

{

//左轮慢,右轮快,右转

SpeedLeft = 15;

SpeedRight = 35;

Delay1ms(2000);

//左轮快,右轮慢,左转

SpeedLeft = 35;

SpeedRight = 15;

Delay1ms(2000);

}

}

相关文章

365体育投注网址亚洲下载 詩經/蒹葭

詩經/蒹葭

🗓️ 07-20 👁️ 9435
365结束投注 周扬青罕露额头被问“什么整形医院整的” 她一看直接回应了!
彩票365苹果版怎么下载不了 预定义变量

预定义变量

🗓️ 08-06 👁️ 9079
365体育投注网址亚洲下载 LOL:干扰水晶几乎没人使用,为何还不删除?拳头的理由让人感动
365体育投注网址亚洲下载 您所访问的页面不存在

您所访问的页面不存在

🗓️ 07-16 👁️ 5477
365体育投注网址亚洲下载 推荐22个热门国外BT种子下载网站

推荐22个热门国外BT种子下载网站

🗓️ 07-03 👁️ 3209