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

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.csdn.net/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 ");
  //Serial.print(flag);
  //Serial.print(" ");
  //Serial.println(error);
}
void Keep_one_speed::cal
  • 22
    点赞
  • 203
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Arduino中,可以使用PID控制来调节直流电机速度。首先,在循环中实现PID控制,不断调整电机的输入电压来控制速度。代码示例如下:\[1\] ``` void loop() { Input = analogRead(A0); // 读取电机实际速度 myPID.Compute(); // 计算PID控制器的输出 motor.run(Output); // 控制电机转动,根据PID输出设置转速和方向 } ``` 接下来,在初始化函数中完成相关参数的设置,并启动PID控制器。代码示例如下:\[2\] ``` void setup() { motor.setSpeed(255); // 设置电机转速,范围为0-255 Setpoint = 100; // 设置期望速度 Input = analogRead(A0); // 读取电机实际速度,假设采用模拟输入 myPID.SetMode(AUTOMATIC); // 设置PID控制器为自动模式 } ``` 在代码中,需要创建电机驱动对象和PID对象,并设置相关参数。代码示例如下:\[3\] ``` AF_DCMotor motor(1); // 创建电机驱动对象,参数为电机连接的引脚号 double Setpoint, Input, Output; // 定义PID控制器的输入、输出和期望值 double Kp = 1, Ki = 1, Kd = 1; // 定义PID控制器的比例、积分和微分系数 ``` 在这个示例中,Kp、Ki和Kd分别代表PID控制器的比例、积分和微分系数,可以根据实际需求进行调整。通过不断计算PID控制器的输出,并将其作为输入电压来控制电机的转速,可以实现直流电机速度PID调控。 #### 引用[.reference_title] - *1* *2* *3* [arduino平台控制直流电机PID速度闭环控制编程实现](https://blog.csdn.net/laobaisoft/article/details/131513967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值