PID 循跡自走車範例
I8_jWrEJ_X8#include <Arduino.h>#include <Wire.h>
#include <Servo.h>
#include "MePort.h"
#include "MeUltrasonic.h"
#include "MeDCMotor.h"
//double Input, Output ;
float MaxSpeed = 255;
float MaxPower = 180;
float MinPower = 120;
float Error,ErrorAcc,ErrorDec;
float Kp=0.14;
float Kd=0.00020;//23;
float Ki=0.000201;
float nPower;
MePort lightsensor_6(6);
MePort lightsensor_8(8);
MeDCMotor motor_9(9);
MeDCMotor motor_10(10);
unsigned long previousMillis = 0;
const long interval = 1;
void setup(){
lightsensor_6.dWrite1(1);
nPower = 160;
Error=0;
ErrorAcc=0;
}
void loop(){
unsigned long StartTime = millis();
if(ErrorAcc < 18000 && ErrorAcc > -18000){
float nError = lightsensor_6.aRead2() - lightsensor_8.aRead2();
ErrorAcc +=nError*Kd ;
ErrorDec -=nError*Ki ;
Error = int(nError*Kp+ErrorAcc+ErrorDec);
if(nError < 80 && nError > -80){
if(nPower < MaxPower){
nPower += 3;
}
} else{
if(nPower > MinPower){
nPower -= 2;
}
}
MotoL(nPower-Error);
MotoR(nPower+Error);
}else{
motor_9.run(0);
motor_10.run(0);
}
do{}while(millis() - StartTime < interval);
}
void MotoL(int Power){
if (Power > MaxSpeed){
Power = MaxSpeed;
}
if (Power < -MaxSpeed){
Power = -MaxSpeed;
}
motor_9.run(Power);
}
void MotoR(int Power){
if (Power > MaxSpeed){
Power = MaxSpeed;
}
if (Power < -MaxSpeed){
Power = -MaxSpeed;
}
motor_10.run(Power);
}
本帖最後由 Shiichi 於 2016-3-3 14:02 編輯
您好,不知是否能向您請教。
目前和宋修賢老師在處理Ardui Car
雖然已使用較繁雜的方式處理了跑出黑線外的狀況
但基於想追求更精簡的程式所以還是想請問一下
就是如果我只以單純寫PID控制時,常遇到CNY70跑出黑線外後便往前衝
不知道您是否願意教我可以如何處理
以下是我挑出我一般寫純PID控制的Code:int MotoSpeed = 250;
double CNY70Val = 1000;
int interror = 0;
int olderror = 0;
double values;
void CNY70()
{
valuesRR = analogRead(RR)
valuesMR = analogRead(MR);
valuesMM = analogRead(MM);
valuesML = analogRead(ML);
valuesLL = analogRead(LL);
if (valuesRR > CNY70Val)
valuesRR = CNY70Val;
if (valuesMR > CNY70Val)
valuesMR = CNY70Val;
if (valuesMM > CNY70Val)
valuesMM = CNY70Val;
if (valuesML > CNY70Val)
valuesML = CNY70Val;
if (valuesLL > CNY70Val)
valuesLL = CNY70Val;
values = valuesLL * -1 + valuesML * -0.5 + valuesMM * 0 + valuesMR * 0.5 valuesRR * 1;
}
void Car()
{
while (1) {
CNY70();
int error = ((int)values);
interror += error;
int lasterror = error - olderror;
olderror = error;
int power = error / 5 + interror / 10000 + lasterror;
if (power > MotoSpeed)
power = MotoSpeed;
if (power < -MotoSpeed)
power = -MotoSpeed;
if (power > 0)
Speed(MotoSpeed, MotoSpeed - power); //馬達動作,正數正轉 負數反轉。
else
Speed(MotoSpeed + power, MotoSpeed);
}
}
感謝分享 感謝分享
頁:
[1]