PWM控制智能小车速度

用Arduino板子做小车,下面的简单程序基本能实现小车的基本行走

 
#define STOP      0
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT 3
#define TURNRIGHT 4

int leftmotor1=4;
int leftmotor2=5;
int rightmotor1=6;
int rightmotor2=7;
void setup() {
  pinMode(leftmotor1,OUTPUT);
  pinMode(leftmotor2,OUTPUT);
  pinMode(rightmotor1,OUTPUT);
  pinMode(rightmotor2,OUTPUT);
}
void loop() {
  int a;
  for(a=0;a<5;a++)
  {
    run(a);
    delay(2000);
    }
}
void run(int b)
{
  switch(b)
  {
     case FORWORD
     digitalWrite(leftmotor1,HIGH);
     digitalWrite(leftmotor2,LOW);
     digitalWrite(rightmotor1,HIGH);
     digitalWrite(rightmotor2,LOW);
     break;
     case BACKWARD:
     digitalWrite(leftmotor1,LOW);
     digitalWrite(leftmotor2,HIGH);
     digitalWrite(rightmotor1,LOW);
     digitalWrite(rightmotor2,HIGH);
     break;
     
     case TURNLEFT
     digitalWrite(leftmotor1,LOW);
     digitalWrite(leftmotor2,HIGH);
     digitalWrite(rightmotor1,HIGH);
     digitalWrite(rightmotor2,LOW);
     break;
     case TURNRIGHT
     digitalWrite(leftmotor1,HIGH);
     digitalWrite(leftmotor2,LOW);
     digitalWrite(rightmotor1,LOW);
     digitalWrite(rightmotor2,HIGH);
     break;

     default:
     digitalWrite(leftmotor1,LOW);
     digitalWrite(leftmotor2,LOW);
     digitalWrite(rightmotor1,LOW);
     digitalWrite(rightmotor2,LOW);
    }
 }

但是呢,经过测试,可能会出现这样的问题,比如:左右轮子的速度不一样,因此小车怎样都走不了直线。

那可能是因为电源对左右马达的供电不同对轮子的速度存在影响,因此想让轮子速度一样就可用PWM控制轮子的速度使其保持同速,将PWM值赋值给轮子,轮子的速度就可以一样,这样的话小车就不会走斜了。修改后的代码如下:

 

#define STOP 0 #define FORWARD 1 #define BACKWARD 2 #define TURNLEFT 3 #define TURNRIGHT 4 int leftmotor1=4; int leftmotor2=5; int rightmotor1=6; int rightmotor2=7;

int val=200; void setup() { pinMode(leftmotor1,OUTPUT); pinMode(leftmotor2,OUTPUT); pinMode(rightmotor1,OUTPUT); pinMode(rightmotor2,OUTPUT); } void loop() { // put your main code here, to run repeatedly: int a; for(a=0;a<5;a++) { run(a); delay(2000); } } void run(int b) { switch(b) { case FORWORD analogWrite(leftmotor1,val); analogWrite(leftmotor2,0); analogWrite(rightmotor1,val); analogWrite(rightmotor2,0); break; case BACKWARD: analogWrite(leftmotor1,0); analogWrite(leftmotor2,val); analogWrite(rightmotor1,0); analogWrite(rightmotor2,val); break; case TURNLEFT analogWrite(leftmotor1,0); analogWrite(leftmotor2,val); analogWrite(rightmotor1,val); analogWrite(rightmotor2,0); break; case TURNRIGHT analogWrite(leftmotor1,val); analogWrite(leftmotor2,0); analogWrite(rightmotor1,0); analogWrite(rightmotor2,val); break; default: analogWrite(leftmotor1,0); analogWrite(leftmotor2,0); analogWrite(rightmotor1,0); analogWrite(rightmotor2,0); } }

只需将一例程序中数字量改为模拟量即可:digitalWrite--analogWrite,再将HIGH改为PWM值,LOW改为0。

改过的代码还有一个好处就是将PWM值用变量保存,如果要改变速度,只需改一个数字而已。

猜你喜欢

转载自blog.csdn.net/qq_42158309/article/details/80636677