arduino智能车带编码盘测速的 速度闭环控制 及 蓝白巡线(基于PID反馈控制)

本文介绍了使用Arduino实现智能车的编码盘测速和PID速度闭环控制,详细阐述了PID原理和参数调整,以及蓝白巡线的实现方法,包括驱动、巡线思路和相关程序代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.项目内容

常见的智能车巡线功能。

2.说明及问题概述

关于驱动———驱动的原理,从程序的角度看,就是给驱动模块一个特定占空比的PWM,让轮子转。占空比越大,轮子转速越快。

关于巡线———一般有摄像头,红外,光电这几种方式。其实原理大致相同,就是通过这几种传感器,反馈小车所处的状态,然后据此调整,做出相应的动作来让小车保持巡线。这就已经很明显有可以用PID反馈控制的意思了。

3.思路

关于驱动———我们已知的其实只有,PWM的占空比越大轮子转速越快这样的一个正相关关系。然后一定的PWM与轮子转速还要受到电压,地面摩擦,等等各种因素的影响。如果“裸的”直接给轮子PWM进行控制,就要面临老是要调PWM的情况,控制缺少稳定性。为了能够“直接”控制轮子的转速,需要在软件的底层中加一层对速度的PID反馈控制,作为对车运动的基本控制。具体来说,是写了一个类似Keep_one_speed(aimed_speed,speed)函数,功能是控制一个轮子的速度保持在一定的值。

关于巡线———这就很常见了,根据不同的情况,给PID的error项编码不同的值,然后做相应的控制,具体看后面的解释。

4.过程

4.1 PID解释

我是在这个里面学的PID原理https://blog.youkuaiyun.com/weibo1230123/article/details/80812211

4.2 速度闭环控制

4.2.1 框图在此:

我们使用的是带编码器的电机,可以测距并且测速。这里的error显然就是目标速度与输出速度的差,然后PID_calculation用增量式u[k]=Kp e[k]+Ki e[i]+Kd(e[k]-e[k-1]), PWM_decision 用的是  motor_speed=BASE+PID_value 得到PWM值; BASE 是设置的基础PWM,其实0应该也行。

4.2.2 相关程序:

//文件"Keep_one_speed.h"
 #ifndef _KEEP_ONE_SPEED_H__
 #define _KEEP_ONE_SPEED_H__
 #include "Arduino.h"

 class Keep_one_speed{
    private:
    public:
    const int Lin1=6,Lin2=7,Lout=10,Rin1=9,Rin2=8,Rout=11;
    const double LENGTH=20.6;
    int flag;
    Keep_one_speed(int f);
  
  
    float Kp = 5, Ki = 0.1, Kd = 0.02;                         //pid参数 
    float error = 0, P = 0, I = 0, D = 0, PID_value = 0; 
    float previous_error = 0, previous_I = 0;                                        
    int pre_motor_speed =0,left_motor_speed=0;                      
    const int BASE=80;
    void Run(double speedL,double speedR);
  
    void Initial();
    void track_pinint();
    void motor_pinint();
    void read_sensor_values(double aim_speed,double cur_speed);   
    void calc_pid();
    void motor_control();
    void motorsWrite(int speedL, int speedR);
    void _stop();
  
 };
 #endif

 

//文件"Keep_one_speed.cpp" 
 #include "Arduino.h"
 #include "Keep_one_speed.h"

Keep_one_speed::Keep_one_speed(int f):flag(f){}//初始化时要给一个flag值,flag=0为左                                                                                          
                                               //轮,flag=1为右轮
void Keep_one_speed::Run(double aim_speed,double cur_speed){   
    read_sensor_values(aim_speed,cur_speed);                 
    calc_pid();
    motor_control();
  }
void Keep_one_speed::Initial(){
    motor_pinint();      //L298N引脚初始化
}

void Keep_one_speed::motor_pinint()
{
  /*
  pinMode (leftA_PIN, OUTPUT); //设置引脚为输出引脚
  pinMode (leftB_PIN, OUTPUT); //设置引脚为输出引脚
  pinMode (righA_PIN, OUTPUT); //设置引脚为输出引脚
  pinMode (righB_PIN, OUTPUT); //设置引脚为输出引脚*/

  pinMode(Lin1,OUTPUT);
  pinMode(Lin2,OUTPUT);
  pinMode(Rin1,OUTPUT);
  pinMode(Rin2,OUTPUT);
 // pinMode(Lout,OUTPUT);
 // pinMode(Rout,OUTPUT);
 // digitalWrite(Lout,HIGH);
 // digitalWrite(Rout,HIGH);
}

void Keep_one_speed::read_sensor_values(double aim_speed,double cur_speed)
{
  error=aim_speed-cur_speed;
  //Serial.print("error ");
  //Seri
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值