电子原理
直播中

刘丽

7年用户 1247经验值
私信 关注
[问答]

怎样去编写PID算法的控制程序?

怎样利用Arduino Uno去控制直流电机?如何去编写其实验代码?
怎样去编写PID算法的控制程序?

回帖(1)

李婷婷

2021-7-27 17:15:58
  Arduino Uno控制直流电机,将总的系统设计思路贴出来,如下:
  
  整个系统是实现“太阳能智能控制环保路灯控制器设计”,主要是用直流电机控制太阳能电池板转动,确保其在每个时间段能够实现最高的发电效率,仿向日葵实现东西转动。
  Arduino Uno手册上有其关于控制直流电机的详细介绍,如果仔细阅读,实现起来很简单的。可以结合本文的系统,对其进一步理解,则可以编写响应的代码。
  主程序
  //#include
  int pinI1=8;
  int pinI2=9;
  int pinI3=2;
  //int pinI4=3;
  int pinI5=4;
  //int pinI6=5;
  //int pinI7=6;
  int speedin=11;
  volatile int state=LOW;
  void setup()
  {
  pinMode(pinI1,OUTPUT);
  pinMode(pinI2,OUTPUT);
  pinMode(pinI3,INPUT);
  // pinMode(pinI4,OUTPUT);
  pinMode(pinI5,OUTPUT);
  // pinMode(pinI6,OUTPUT);
  // pinMode(pinI7,OUTPUT);
  pinMode(speedin,OUTPUT);
  // myPID.SetMode(AUTOMATIC);
  // attachInterrupt(0,light,HIGH);
  }
  void loop()
  {
  while(1)
  {
  int m=analogRead(A0);
  int n=analogRead(A1);
  int err,err1,err2;
  int pidspeed1;
  float kp=0.1 ,ki=0,kd=0;
  err=m-n;
  pidspeed1=(int)(err*kp-err1*ki+err2*kd);
  err1=err;
  err2=err1;
  state=digitalRead(pinI3);
  digitalWrite(pinI5,state);
  if (m》n)
  {
  // while(1)
  // {
  digitalWrite(pinI1,LOW);
  digitalWrite(pinI2,HIGH);
  analogWrite(speedin,100+pidspeed1);
  // }
  // delay(2000);
  }
  else if(m
  {
  // while(1)
  // {
  digitalWrite(pinI1,HIGH);
  digitalWrite(pinI2,LOW);
  analogWrite(speedin,100-pidspeed1);
  // delay(2000);
  // }
  } else
  {
  // while(1)
  // {
  digitalWrite(pinI1,HIGH);
  digitalWrite(pinI2,HIGH);
  //delay(2000);
  // }
  }
  }
  }
   PID算法控制程序
  该部分系统原理图如下,有助于理解代码,可根据应用环境不同修改代码:
  
  int m=analogRead(A0);
  int n=analogRead(A1);
  int err,err1,err2;
  int pidspeed1;
  float kp=0.1 ,ki=0,kd=0;
  err=m-n;
  pidspeed1=(int)(err*kp-err1*ki+err2*kd);
  err1=err;
  err2=err1;
  void light();
  SetMotor(Output);
  void SetMotor()
  {
  if (m》n)
  { digitalWrite(pinI1,LOW); digitalWrite(pinI2,HIGH); analogWrite(speedin,100+pidspeed1);}
  else if(m
  { digitalWrite(pinI1,HIGH); digitalWrite(pinI2,LOW); analogWrite(speedin,100-pidspeed1);} else
  {digitalWrite(pinI1,HIGH);
  digitalWrite(pinI2,HIGH);}
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分