找回密码
 立即注册

QQ登录

双H桥如何进行调速

来源: 已解决 laobulang 2015-3-22 18:46 显示全部楼层 |阅读模式
根据示例代码改写了RP5的控制程序,想要减慢小车行进的速度请问应该调整以下代码的什么参数?
感激不尽~!

void setup()
{
  Serial.begin(115200);  //启动串行通讯,波特率为115200b/s
  pinMode(8,OUTPUT);//定义输入、输出接口
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
/*
  pinMode(11,INPUT);
  pinMode(12,INPUT);
  pinMode(14,INPUT);
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
*/
}
void Backward(int speed)
{
     analogWrite(10,speed);//输入模拟值进行设定速度
     analogWrite(5,speed);
     
     digitalWrite(9,HIGH);//使直流电机(右)顺时针转
     digitalWrite(8,LOW);
     digitalWrite(7,HIGH);//使直流电机(左)逆时针转
     digitalWrite(6,LOW);
}
void TurnRight()//右转
{
     
     digitalWrite(10,100);//输入数字量进行设定速度
     digitalWrite(5,100);
     digitalWrite(6,LOW);//使直流电机(右)逆时针转
     digitalWrite(7,HIGH);
     digitalWrite(8,HIGH);//使直流电机(左)逆时针转
     digitalWrite(9,LOW);
}
void TurnLeft()//左转
{
     
     digitalWrite(10,100);//输入数字量进行设定速度
     digitalWrite(5,100);
     digitalWrite(6,HIGH);//使直流电机(右)顺时针转
     digitalWrite(7,LOW);
     digitalWrite(8,LOW);//使直流电机(左)顺时针转
     digitalWrite(9,HIGH);
}
void Stop()//停止
{
     digitalWrite(6,HIGH);//使直流电机(右)制动
     digitalWrite(7,HIGH);
     digitalWrite(8,HIGH);//使直流电机(左)制动
     digitalWrite(9,HIGH);
}
void Forward()//前进
{
     digitalWrite(10,300);//输入模拟值进行设定速度
     digitalWrite(5,300);
     
     digitalWrite(6,HIGH);//使直流电机(右)逆时针转
     digitalWrite(7,LOW);
     digitalWrite(9,LOW);//使直流电机(左)顺时针转
     digitalWrite(8,HIGH);
}
void loop()
{
   char received;
    if(Serial.available() > 0)//如果上位机发送来了字符
    {
       received = Serial.read();
      Serial.println(received);
      if( received == 'F')
      {
        Forward();
        Serial.println("forward");
      }
       if( received == 'B')
      {
        Backward(200);
        Serial.println("backward");
      }
      if( received == 'L')
      {
        TurnLeft();
        Serial.println("turnleft");
      }
         if( received == 'R')
      {
        TurnRight();
        Serial.println("turnright");
      }
         if( received == 'S')
      {
        Stop();
        Serial.println("stop");
      }
    }
}
回复

使用道具 举报

大神点评9

您好,双H桥驱动板的EA和EB引脚为调速引脚,需要接到UNO的有PWM输出的引脚上,通过改变PWM信号的占空比来实现调速
int pin1=8;               //定义I1是D8
int pin2=9;               //定义I2是D9
int speedpin=10;          //定义调速引脚EA是D10
int pin3=7;               //定义I3是D7
int pin4=6;               //定义I4是D6
int speedpin1=5;          //定义调速引脚EB是D10
void setup()
{                         //将各个引脚置于输出模式
pinMode(pin1,OUTPUT);
pinMode(pin2,OUTPUT);
pinMode(speedpin,OUTPUT);
pinMode(pin3,OUTPUT);
pinMode(pin4,OUTPUT);
pinMode(speedpin1,OUTPUT);
}
void loop()
{
analogWrite(speedpin,180); //定义PWM引脚输出占空比
digitalWrite(pin1,LOW);    //定义pin1引脚输出低电平
digitalWrite(pin2,HIGH);   //定义pin2引脚输出高电平
digitalWrite(pin3,LOW);    //定义pin3引脚输出低电平
digitalWrite(pin4,HIGH);   //定义pin4引脚输出高电平
delay(1000);
analogWrite(speedpin1,180);//定义PWM引脚输出占空比
digitalWrite(pin1,HIGH);        
digitalWrite(pin2,LOW);
digitalWrite(pin3,HIGH);        
digitalWrite(pin4,LOW);
delay(1000);
}
以上是一个双H桥控制的例程,其中analogWrite(speedpin,x)就是定义PWM引脚输出占空比,其中x的范围是0到255.
回复 支持 反对

使用道具 举报

laobulang 2015-3-23 20:16 显示全部楼层
奥松-Neil 发表于 2015-3-23 08:58
您好,双H桥驱动板的EA和EB引脚为调速引脚,需要接到UNO的有PWM输出的引脚上,通过改变PWM信号的占空比来实 ...

谢谢Neil, 我检查了程序和接线,是按照你说的接的,但是我调整analogWrite( )的第二个参数,设置了10 50 200,但没有感觉到速度差异,请问是什么原因啊?谢谢!
回复 支持 反对

使用道具 举报

能把您双H桥部分的接线图片及您的程序发上来一下吗?另外如果是PWM信号给10的话,那么PWM的占空比太小
回复 支持 反对

使用道具 举报

laobulang 2015-3-24 13:25 显示全部楼层
奥松-Neil 发表于 2015-3-24 08:55
能把您双H桥部分的接线图片及您的程序发上来一下吗?另外如果是PWM信号给10的话,那么PWM的占空比太小 ...

  1. void setup()
  2. {
  3.   Serial.begin(115200);  //启动串行通讯,波特率为115200b/s
  4.   pinMode(8,OUTPUT);//定义输入、输出接口
  5.   pinMode(9,OUTPUT);
  6.   pinMode(10,OUTPUT);
  7.   pinMode(5,OUTPUT);
  8.   pinMode(6,OUTPUT);
  9.   pinMode(7,OUTPUT);
  10. /*
  11.   pinMode(11,INPUT);
  12.   pinMode(12,INPUT);
  13.   pinMode(14,INPUT);
  14.   pinMode(2,INPUT);
  15.   pinMode(3,INPUT);
  16.   pinMode(4,INPUT);
  17. */
  18. }
  19. void Backward(int speed)
  20. {
  21.      analogWrite(10,speed);//输入模拟值进行设定速度
  22.      analogWrite(5,speed);
  23.      
  24.      digitalWrite(8,LOW);//使直流电机(右)顺时针转
  25.      digitalWrite(9,HIGH);
  26.      digitalWrite(6,LOW);//使直流电机(左)逆时针转
  27.      digitalWrite(7,HIGH);
  28. }
  29. void TurnRight()//右转
  30. {
  31.      
  32.      digitalWrite(10,100);//输入数字量进行设定速度
  33.      digitalWrite(5,100);
  34.      digitalWrite(6,LOW);//使直流电机(右)逆时针转
  35.      digitalWrite(7,HIGH);
  36.      digitalWrite(8,HIGH);//使直流电机(左)逆时针转
  37.      digitalWrite(9,LOW);
  38. }
  39. void TurnLeft()//左转
  40. {
  41.      
  42.      digitalWrite(10,100);//输入数字量进行设定速度
  43.      digitalWrite(5,100);
  44.      digitalWrite(6,HIGH);//使直流电机(右)顺时针转
  45.      digitalWrite(7,LOW);
  46.      digitalWrite(8,LOW);//使直流电机(左)顺时针转
  47.      digitalWrite(9,HIGH);
  48. }
  49. void Stop()//停止
  50. {
  51.      digitalWrite(6,HIGH);//使直流电机(右)制动
  52.      digitalWrite(7,HIGH);
  53.      digitalWrite(8,HIGH);//使直流电机(左)制动
  54.      digitalWrite(9,HIGH);
  55. }
  56. void Forward()//前进
  57. {
  58.      digitalWrite(10,200);//输入模拟值进行设定速度
  59.      digitalWrite(5,200);
  60.      
  61.      digitalWrite(6,HIGH);//使直流电机(右)逆时针转
  62.      digitalWrite(7,LOW);
  63.      digitalWrite(9,LOW);//使直流电机(左)顺时针转
  64.      digitalWrite(8,HIGH);
  65. }
  66. void loop()
  67. {
  68.    char received;
  69.     if(Serial.available() > 0)//如果上位机发送来了字符
  70.     {
  71.        received = Serial.read();
  72.       Serial.println(received);
  73.       if( received == 'F')
  74.       {
  75.         Forward();
  76.         Serial.println("forward");
  77.       }
  78.        if( received == 'B')
  79.       {
  80.         Backward(50);
  81.         Serial.println("backward");
  82.       }
  83.       if( received == 'L')
  84.       {
  85.         TurnLeft();
  86.         Serial.println("turnleft");
  87.       }
  88.          if( received == 'R')
  89.       {
  90.         TurnRight();
  91.         Serial.println("turnright");
  92.       }
  93.          if( received == 'S')
  94.       {
  95.         Stop();
  96.         Serial.println("stop");
  97.       }
  98.     }
  99. }
复制代码

1.jpg
2.jpg
回复 支持 反对

使用道具 举报

laobulang 2015-3-24 13:30 显示全部楼层
奥松-Neil 发表于 2015-3-24 08:55
能把您双H桥部分的接线图片及您的程序发上来一下吗?另外如果是PWM信号给10的话,那么PWM的占空比太小 ...

我调整analogWrite(pin,speed)中speed, 速度都不改变,如果可以请问我这个代码应该怎么调整?  我要实现的功能是接收到前进(或 后退 或 向左 或 向右)的命令后,以一个特定的速度运动,因为控制源不是传统的方式,故控制起来可能不稳定,因此我需要一个比较慢的速度运动。
回复 支持 反对

使用道具 举报

您这个程序中,左转、右转、前进里面设置电机速度的语句,需要修改成
     analogWrite(10,200);//输入模拟值进行设定速度
     analogWrite(5,200);
回复 支持 反对

使用道具 举报

laobulang 2015-3-24 14:56 显示全部楼层
奥松-Neil 发表于 2015-3-24 14:00
您这个程序中,左转、右转、前进里面设置电机速度的语句,需要修改成
     analogWrite(10,200);//输入模 ...

你好,我修改之后发出命令,板子会鸣叫,请问是什么原因?板子能接受的最慢的速度PWM占空比映射为多少?谢谢
回复 支持 反对

使用道具 举报

奥松-Sam 2015-3-25 13:41 显示全部楼层
laobulang 发表于 2015-3-24 14:56
你好,我修改之后发出命令,板子会鸣叫,请问是什么原因?板子能接受的最慢的速度PWM占空比映射为多少? ...

板子会鸣叫? 你仔细确认下是不是电机发出的声音。若是的话应该是你给的脉宽值太低了,可以适当调高些
回复 支持 反对

使用道具 举报

laobulang 2015-3-25 14:09 显示全部楼层
奥松-Sam 发表于 2015-3-25 13:41
板子会鸣叫? 你仔细确认下是不是电机发出的声音。若是的话应该是你给的脉宽值太低了,可以适当调高些 ...

我听了,的确是RP5底板里的电机声音,我已经把PWM调到200仍然叫。。。
回复 支持 反对

使用道具 举报

您可能感兴趣的文章

您需要登录后才可以回帖 登录 | 立即注册

关注0

粉丝2

帖子9

发布主题
社区热门 MORE+
    社区热帖 MORE+