Arduino Uno控制直流电机

版权声明:本博客个人原创,转载请注明!谢谢! https://blog.csdn.net/yongtongguan9284/article/details/81603383

Arduino Uno控制直流电机

这是我本科毕业设计的部分内容,之前回答别人相关问题时留下了QQ号,这几年总有人加我问相关的问题。今天也有一个本科生咨询,趁这个机会,就把相关资料贴出来吧。
其实,三年前的东西都已经记不清楚了。研究生没有做硬件,相关的都快看不懂了!为了让大家看得懂程序,将总的系统设计思路贴出来,如下:
这里写图片描述
整个系统是实现“太阳能智能控制环保路灯控制器设计”,主要是用直流电机控制太阳能电池板转动,确保其在每个时间段能够实现最高的发电效率,仿向日葵实现东西转动。
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);
// }
}
}
}

 这是我本科毕业设计的部分内容,之前回答别人相关问题时留下了QQ号,这几年总有人加我问相关的问题。今天也有一个本科生咨询,趁这个机会,就把相关资料贴出来吧。
 其实,三年前的东西都已经记不清楚了。研究生没有做硬件,相关的都快看不懂了!为了让大家看得懂程序,将总的系统设计思路贴出来,如下:

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);}

}

最近开始上班了,决定在CSDN记录我的程序员人生。这是我之前在新浪写的一篇博客,把它搬过来,顺便熟悉一下CSDN的用法,原博客地址:
http://blog.sina.com.cn/s/blog_bfb629e50102xrau.html

猜你喜欢

转载自blog.csdn.net/yongtongguan9284/article/details/81603383