查看: 407|回复: 0

[未解决] Arduino智能车PID参数调校

[复制链接]
  • TA的每日心情
    郁闷
    2020-12-2 08:38
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2020-11-25 10:15 | 显示全部楼层 |阅读模式
    您好!请问有大神,能解决这个问题吗?
    long L1,L2,L3,Sensor;                 //三颗传感器读取值

    int PWM_L,PWM_R,PWM_PD,Bias,Bias_Last;    //左右轮驱动电机的PWM值,PD计算后PWM的增量,偏差值,上一次偏差值

    static int PWM_ini = 180;             //驱动电机的PWM初始值

    float Kp = (), Kd = ();               //Kp影响过弯后抖动幅度,Kd太大小车直线抖动

    #define ENA_R 10         //右边电机转速控制

    #define IN1 9         //右边电机正反转控制

    #define IN2 8       //右边电机正反转控制

    #define ENA_L 5         //左边电机转速控制

    #define IN3 6         //左边电机正反转控制

    #define IN4 7       //左边电机正反转控制

    #define stopPin 2      //红外避障传感器信号连接端子



    void setup() {

      pinMode(IN1,OUTPUT);

      pinMode(IN2,OUTPUT);

      pinMode(IN3,OUTPUT);

      pinMode(IN4,OUTPUT);

      pinMode(ENA_L,OUTPUT);

      pinMode(ENA_R,OUTPUT);

      pinMode(stopPin,INPUT_PULLUP);    //外部中断输入上拉

      attachInterrupt(0, carStop, LOW); //触发外部中断,进入停车子程序

      Serial.begin(9600);

      delay(1000);

    }



    void loop() {

      readSensor();

      PDcontrol();

    }



    void readSensor(){                 //传感器信号读取处理子程序

      L1 = analogRead(A1);

      L2 = analogRead(A2);

      L3 = analogRead(A3);

      if ((L1 + L2 + L3)> 100){              //合理设置该值可以让小车跑偏时停车

        Sensor = (L1 * 1 + L2 * 50 + L3 * 99) / (L1 + L2 + L3);   //归一化处理

      }

      else{                                  //当传感器值低于预期时,进入停车子程序,防止小车冲出跑道

        carStop();

      }

    }



    void motorDrive(int leftVel,int rightVel){   //电机驱动子程序

      digitalWrite(IN1,HIGH);

      digitalWrite(IN2,LOW);

      digitalWrite(IN3,LOW);

      digitalWrite(IN4,HIGH);

      analogWrite(ENA_L,leftVel);

      analogWrite(ENA_R,rightVel);

    }



    void PDcontrol(){                   //PD算法处理子程序

      Bias = Sensor - 50;

      PWM_PD = Kp*Bias + Kd*(Bias - Bias_Last);

      Bias_Last = Bias;

      PWM_L = PWM_ini - PWM_PD;

      PWM_R = PWM_ini + PWM_PD;

      if(PWM_L > 255){

        PWM_L = 255;

      }

      if(PWM_L < 0){

        PWM_L = 0;

      }

      if(PWM_R > 255){

        PWM_R = 255;

      }

      if(PWM_R < 0){

        PWM_R = 0;

      }

      motorDrive(PWM_L,PWM_R);

    }



    void carStop(){              //终点停车子程序

      digitalWrite(IN1,HIGH);

      digitalWrite(IN2,HIGH);

      digitalWrite(IN3,HIGH);

      digitalWrite(IN4,HIGH);

      digitalWrite(ENA_L,HIGH);

      digitalWrite(ENA_R,HIGH);

    }

    微信截图_20201125101233.png
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    (开源)微信小程序控制esp8266,可远程
    (开源)微信小程序控制es
    流程说明:首先要使esp8266能够联网,能联网就可以控制,使用示例程序,修改WIFI、
    arduino封装了一个无线串口模块LC12S的操作库
    arduino封装了一个无线串
    前一段时间接触到一个比较好用的2.4G无线串口通信模块LC12S, 在淘宝上仅四五块钱,收
    【花雕动手做】快餐盒盖,极低成本搭建机器人实验平台
    【花雕动手做】快餐盒盖,
    吃完快餐粥,除了粥的味道不错之外,我对个快餐盒的圆盖子产生了兴趣,能否做个极低成
    全新AVR芯片ATMEGA328P烧录程序的教程
    全新AVR芯片ATMEGA328P烧
    潜水多年,觉得有义务贡献一些内容,此贴作为最近学习Arduino的一个总结。 玩Arduino
    【Arduino】168种传感器模块系列实验(90)--- ULN2003步进电机
    【Arduino】168种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表