标签:
Arduino真的是好用,
已经上瘾。
这次做的是风洞稳定小球系统
一、元件模块

Arduino正面

Arduino引脚接线

驱动板,反正是freescale小破车上用的那款

电源。

风洞

风扇型号
二、Arduino代码
一言不合就上代码
#include <PID_v1.h>
int inputPin=4; // define ultrasonic signal receiver pin ECHO to D4
int outputPin=5; // define ultrasonic signal transmitter pin TRIG to D5
int pwm = 6; //pwm输出D6
int dis=0;
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint,0.7,5.3,0.8, DIRECT);
void setup()
{
Serial.begin(9600);
pinMode(inputPin, INPUT);
pinMode(outputPin, OUTPUT);
pinMode(pwm, OUTPUT);
Setpoint=160;
Input=150;
myPID.SetMode(AUTOMATIC);
}
void loop()
{
dis=distanceM();
Input=255-map(dis,0,45,20,200);
myPID.Compute();
analogWrite(pwm, Output);
Serial.print(" ");
Serial.print(Input);
Serial.print(" ");
Serial.println(Output);
}
int distanceM()
{
digitalWrite(outputPin, LOW);
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); // Pulse for 10μs to trigger ultrasonic detection
delayMicroseconds(10);
digitalWrite(outputPin, LOW);
int distance = pulseIn(inputPin, HIGH); // Read receiver pulse time
distance= distance/58; // Transform pulse time to distance
Serial.print(distance); //Ourput distance
delay(50);
return distance;
}
之前已经说过连接了
再发一遍
传感器SRF05超声波
VCC ------------5V
GND ------------GND
PIN ECHO -----D4
PIN TRIG ----- D5
代码里使用了一个自带库PID_v1.h
myPID(&Input, &Output, &Setpoint,0.7,5.3,0.8, DIRECT);
输入,输出,稳定收敛位置点,Kp,Ki,Kd,直接方式。
Input=255-map(dis,0,45,20,200);
这里是一个映射,因为我的传感器放在了风洞的上端
这样距离顶端越近数值就越小,所以需要改个符号。
让它的数值和高度成正比。
而PWM正好是0-255的数值,所以这样改。
PWM的输出脚是D6,
频率是1kHz,虽然频率低了但是还够用。
三、参数调试

接下来用串口数据来看
分别是距离,input,output。


我把数据拿下来用matlab来plot

红色代表高度,还是比较稳定的
黄色就是PWM的值。
因为之前测试传感器非常稳定,
所以数据输入我并没有用Kalman filter来处理。

被风扇砍了一刀,
综上,没有烂尾,万岁!
风洞稳定小球系统(二)----- 基于Arduino实现的PID距离PWM控制
标签:
原文地址:http://www.cnblogs.com/MnsterLu/p/5624933.html