1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/GaryPillow-Ananas

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
controller.cpp 23 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Dark-Guan Отправлено 08.06.2016 13:41 4663dab
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
/*
****************************************************************************
* Copyright (c) 2015 Dark Guan <tickel.guan@gmail.com> *
* This file is part of Ananas. *
* *
* Ananas is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* Ananas is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with Ananas. If not, see <http://www.gnu.org/licenses/>. *
****************************************************************************
*/
/*
* controller.cpp
*
* Created on: 2016126
* Author: Dark
*/
#include "controller.h"
#include "configuration.h"
#include "con_configuration.h"
#include "speed_lookuptable.h"
#include "Ananas.h"
#include "stepper.h"
#include "Encoder.h"
//#include "PID_v1.h"
#include "PID_AutoTune_v0.h"
//#include "digitalWriteFast.h"
//#include "MsTimer2.h"
// intRes = longIn1 * longIn2 >> 24
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 48bit result
#define MultiU24X24toH16(intRes, longIn1, longIn2) \
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"mov r27, r1 \n\t" \
"mul %B1, %C2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %C1, %C2 \n\t" \
"add %B0, r0 \n\t" \
"mul %C1, %B2 \n\t" \
"add %A0, r0 \n\t" \
"adc %B0, r1 \n\t" \
"mul %A1, %C2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %B1, %B2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %C1, %A2 \n\t" \
"add r27, r0 \n\t" \
"adc %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"mul %B1, %A2 \n\t" \
"add r27, r1 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r27 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (longIn1), \
"d" (longIn2) \
: \
"r26" , "r27" \
)
// intRes = intIn1 * intIn2 >> 16
// uses:
// r26 to store 0
// r27 to store the byte 1 of the 24 bit result
#define MultiU16X8toH16(intRes, charIn1, intIn2) \
asm volatile ( \
"clr r26 \n\t" \
"mul %A1, %B2 \n\t" \
"movw %A0, r0 \n\t" \
"mul %A1, %A2 \n\t" \
"add %A0, r1 \n\t" \
"adc %B0, r26 \n\t" \
"lsr r0 \n\t" \
"adc %A0, r26 \n\t" \
"adc %B0, r26 \n\t" \
"clr r1 \n\t" \
: \
"=&r" (intRes) \
: \
"d" (charIn1), \
"d" (intIn2) \
: \
"r26" \
)
#define MAX_STEP_FREQUENCY DEFAULT_MAX_FEEDRATE//40000 // Max step frequency for Ultimaker (5000 pps / half step)
static char step_loops;
volatile bool Max_Stop_state;
volatile bool Min_Stop_state;
//global
uint32_t max_feedrate;
volatile bool controldir; //target motor dir
volatile float factor;
volatile float encoderfactor;
volatile unsigned short targertFeedrate; //target speed steps/s
volatile static unsigned short targertFeedrate_OCR1A;
volatile static char step_loops_targertFeedrate;
volatile bool targertdir; //target motor dir
volatile unsigned short currentFeedrate; //current speed steps/s
volatile bool currentdir; //current motor dir
unsigned long acceleration_rate; //accelarate steps/s^2
unsigned short jerk_rate; //the rate to change dir steps/s
static unsigned short jerk_rate_OCR1A;
static char step_loops_jerk_rate;
unsigned short start_rate; //start rate
static unsigned short start_rate_OCR1A;
static char step_loops_start_rate;
//unsigned short lock_rate; //start rate
//static unsigned short lock_rate_OCR1A;
//static char step_loops_lock_rate;
unsigned short timer;
static long acceleration_time, deceleration_time;
static unsigned short acc_step_rate; // needed for deccelaration start point
//static unsigned short OCR1A_nominal;
//static char step_loops_nominal;
//for PID CONTROLLER
//PID for display
double kp;
double ki;
double kd;
//int
unsigned short PIDtime; //PID time ms
unsigned short PIDtimeus; //PID time us
long PIDoutFeedrate; //speed for PID output
short short_PIDoutFeedrate; //speed for PID output
long pulseforPID; //setpoint for PID Compute
long encouforPID; //input for PID Compute
//parameter for PID Compute
//There did not care
//output is short
long error = 0; //setpoint - input error short less than 65536 e(k)
long lasterror = 0; //e(k-1)
long lastlasterror = 0; //e(k-2)
long ITerm; //should less than maxOutput more than minOutput
long outMax; //max outPut
long outMin; //min outPut
long dinput; //input - lastinput
long lastinput; //lastinput
//Kp Ki Kd for calculated
short Kp;
short Ki;
short Kd;
double DKp;
double DKi;
double DKd;
bool PIDauto;
//bool blink;
long aTuneStep = 50000, aTuneNoise = 4, aTuneStartValue = 25000;
unsigned int aTuneLookBack = 20;
//PID AnanasPID(&encouforPID, &PIDoutFeedrate, &pulseforPID, kp, ki, kd, 1);
//PID AnanasPID(&encouforPID, &PIDoutFeedrate, &pulseforPID, kp, ki, kd, 0);
PID_ATune aTune(&encouforPID, &PIDoutFeedrate);
void setmaxfeedrate(unsigned long max);
void setaccelerationrate(unsigned long acc);
void setjerkfeedrate(unsigned short jerk);
void setstartfeedrate(unsigned short start);
//void setlockfeedrate(unsigned short lock);
void setTarget_feedrate(unsigned short target_Rate);
void setTarget_feedrate_long(long &target_Rate);
void refreshPID();
void PID_initial() {
//no eeprom
// kp = KP;
// ki = KI;
// kd = KD;
PIDtime = PIDTIME;
PIDtimeus = PIDTIMEUS;
// controldir = false;
// factor = STRONG_PURSE_FACTOR;
// setlockfeedrate(SPEEDUNIT * STRONG_PURSE_FACTOR);
//refresh
// AnanasPID.SetTunings(kp, ki, kd);
// max_feedrate = USR_MAX_FEEDRATE;
// acceleration_rate = DEFAULT_ACC_RATE;
targertdir = false; //2016.3.21 this must match PID dir
//else there be a bug for start with a dir
currentFeedrate = 0;
targertFeedrate = 0;
currentdir = targertdir;
//initial PID
// AnanasPID.SetMode(AUTOMATIC);
// AnanasPID.SetSampleTime(PIDTIME); //1ms
// AnanasPID.SetOutputLimits(-max_feedrate, max_feedrate);
PIDauto = true; //auto calculate PID
//not run with the timer2 in encoder at the same time
// MsTimer2::set(SPEEDMEASURETIME, PID_compute);
// MsTimer2::start(); //start timer
//PID initial
short_PIDoutFeedrate = 0;
PIDoutFeedrate = 0;
dinput = 0; //input - lastinput
lastinput = 0; //lastinput
//initial timer1
// waveform generation = 0100 = CTC
TCCR1B &= ~(1 << WGM13);
TCCR1B |= (1 << WGM12);
TCCR1A &= ~(1 << WGM11);
TCCR1A &= ~(1 << WGM10);
// output mode = 00 (disconnected)
TCCR1A &= ~(3 << COM1A0);
TCCR1A &= ~(3 << COM1B0);
// Set the timer pre-scaler
// Generally we use a divider of 8, resulting in a 2MHz timer
// frequency on a 16MHz MCU. If you are going to change this, be
// sure to regenerate speed_lookuptable.h with
// create_speed_lookuptable.py
TCCR1B = (TCCR1B & ~(0x07 << CS10)) | (2 << CS10);
OCR1A = 0x4000;
TCNT1 = 0;
ENABLE_STEPPER_DRIVER_INTERRUPT();
}
/* TODO
void StopStepper() {
}
void reStartStepper() {
}
*/
int runTuning() {
// pulseforPID = pulseCount; //delete factor
encouforPID = encodercount; //it should be adjust
setTarget_feedrate_long(PIDoutFeedrate);
return aTune.Runtime();
}
void SetTuning(bool type) {
aTune.SetControlType(type);
aTune.SetNoiseBand(aTuneNoise);
aTune.SetOutputStep(aTuneStep);
aTune.SetLookbackSec((int) aTuneLookBack);
PIDoutFeedrate = aTuneStartValue;
setTarget_feedrate_long(PIDoutFeedrate);
}
void StopTuning() {
aTune.Cancel();
}
void printTuningPID() {
SERIAL_PROTOCOLPGM("T_P: ");
SERIAL_PROTOCOL(aTune.GetKp());
SERIAL_PROTOCOLPGM(";T_I: ");
SERIAL_PROTOCOL(aTune.GetKi());
SERIAL_PROTOCOLPGM(";T_D: ");
SERIAL_PROTOCOLLN(aTune.GetKd());
}
//bool PID_compute() {
//void PID_compute() {
// //refresh
//// unsigned long now = millis();
//// unsigned long timeChange = (now - lastTime);
//// if (timeChange >= SampleTime) {
//// interrupts();
// pulseforPID = pulseCount / factor;
// encouforPID = encodercount;
//
//// printPID();
// if (AnanasPID.Compute()) {
//// Serial.println("PID RUN !");
//// Serial.print("PIDoutFeedrate ");
//// Serial.println(PIDoutFeedrate);
//// Serial.print("OCR1A ");
//// Serial.println(OCR1A);
//// blink = !blink;
//// WRITE(13, blink);
// //refresh the speed
//
//// speedcalculate();
//
// // //responds actively
//// if (absencodercounterfeedrate > 3 * endertostep
// if (PIDoutFeedrate == 0) {
// setTarget_feedrate(0);
// } else if ((PIDoutFeedrate > 0) ^ controldir) {
// setTarget_feedrate(PIDoutFeedrate);
// targertdir = true;
// } else {
// setTarget_feedrate(-PIDoutFeedrate);
// targertdir = false;
// }
//
//// if (absencodercounterfeedrate < currentFeedrate / 3) {
////// Serial.println("PID RUN !");
//// setTarget_feedrate(targertFeedrate / 3);
////// setTarget_feedrate(absencodercounterfeedrate);
////// setTarget_feedrate((targertFeedrate + start_rate) / 5);
////// setTarget_feedrate((absencodercounterfeedrate + start_rate) / 2);
////// return;
//// }
//
//// return true;
//// } //computePID
//// else
//// return false;
//
// }
// // lastTime = now; //interrupting to run
//// }
//}
//FORCE_INLINE
FORCE_INLINE unsigned short calc_timer(unsigned short step_rate) {
unsigned short timer;
if (step_rate > MAX_STEP_FREQUENCY)
step_rate = MAX_STEP_FREQUENCY;
if (step_rate > 40000) { // If steprate > 20kHz >> step 4 times
step_rate = (step_rate >> 3) & 0x1fff;
step_loops = 8;
} else if (step_rate > 20000) { // If steprate > 20kHz >> step 4 times
step_rate = (step_rate >> 2) & 0x3fff;
step_loops = 4;
} else if (step_rate > 10000) { // If steprate > 10kHz >> step 2 times
step_rate = (step_rate >> 1) & 0x7fff;
step_loops = 2;
} else {
step_loops = 1;
}
//
if (step_rate < (F_CPU / 500000))
step_rate = (F_CPU / 500000);
step_rate -= (F_CPU / 500000); // Correct for minimal speed
if (step_rate >= (8 * 256)) { // higher step rate
unsigned short table_address =
(unsigned short) &speed_lookuptable_fast[(unsigned char) (step_rate
>> 8)][0];
unsigned char tmp_step_rate = (step_rate & 0x00ff);
unsigned short gain = (unsigned short) pgm_read_word_near(
table_address + 2);
MultiU16X8toH16(timer, tmp_step_rate, gain);
timer = (unsigned short) pgm_read_word_near(table_address) - timer;
} else { // lower step rates
unsigned short table_address =
(unsigned short) &speed_lookuptable_slow[0][0];
table_address += ((step_rate) >> 1) & 0xfffc;
timer = (unsigned short) pgm_read_word_near(table_address);
timer -= (((unsigned short) pgm_read_word_near(table_address + 2)
* (unsigned char) (step_rate & 0x0007)) >> 3);
}
if (timer < 100) {
timer = 100;
// MYSERIAL.print(MSG_STEPPER_TOO_HIGH);
MYSERIAL.println(step_rate);
} //(20kHz this should never happen)
return timer;
}
//interrupt for step
ISR(TIMER1_COMPA_vect) {
//restart interrupts
interrupts();
if (targertFeedrate > 0) {
// Serial.println("step!");
if (targertdir ^ currentdir) {
// currentdir = targertdir;
// SERIAL_PROTOCOLLNPGM("change dir ");
// Serial.println("change dir ");
//first dec
acceleration_time = 0;
MultiU24X24toH16(acc_step_rate, deceleration_time,
acceleration_rate);
if (acc_step_rate > currentFeedrate) {
currentFeedrate = jerk_rate;
} else {
currentFeedrate -= acc_step_rate;
}
//speed limit
if (currentFeedrate <= jerk_rate) {
currentFeedrate = jerk_rate;
currentdir = targertdir;
}
timer = calc_timer(currentFeedrate);
OCR1A = timer;
deceleration_time += timer;
WRITE(STEP_DIR, currentdir);
} else {
if (targertFeedrate > currentFeedrate) { //need to acc
deceleration_time = 0;
// Serial.println("acc ");
MultiU24X24toH16(acc_step_rate, acceleration_time,
acceleration_rate);
currentFeedrate += acc_step_rate;
if (currentFeedrate > max_feedrate)
currentFeedrate = max_feedrate;
if (currentFeedrate > targertFeedrate) {
currentFeedrate = targertFeedrate;
}
// Serial.print("currentFeedrate ");
// Serial.println(currentFeedrate);
timer = calc_timer(currentFeedrate);
//
// Serial.print("time ");
// Serial.println(timer);
OCR1A = timer;
acceleration_time += timer;
//
} else if (targertFeedrate < currentFeedrate) {
// SERIAL_PROTOCOLLNPGM("dec ");
// Serial.println("dec ");
acceleration_time = 0;
MultiU24X24toH16(acc_step_rate, deceleration_time,
acceleration_rate);
if (acc_step_rate > currentFeedrate) {
currentFeedrate = start_rate;
} else {
currentFeedrate -= acc_step_rate;
}
// speed limit
if (currentFeedrate < start_rate) {
currentFeedrate = start_rate;
}
if (currentFeedrate < targertFeedrate) {
currentFeedrate = targertFeedrate;
}
timer = calc_timer(currentFeedrate);
OCR1A = timer;
deceleration_time += timer;
//
//
} else {
deceleration_time = 0;
acceleration_time = 0;
currentFeedrate = targertFeedrate;
// Serial.print("currentFeedrate_OCR1A ");
// Serial.println(targertFeedrate_OCR1A);
OCR1A = targertFeedrate_OCR1A;
step_loops = step_loops_targertFeedrate;
//
}
}
for (int8_t i = step_loops; i > 0; i--) {
#ifdef USE8825
digitalWriteNoTimer(STEP_STEP, LOW);
#ifdef USEENDSTOP
Max_Stop_state = READ(MAXENDSTOP);
Min_Stop_state = READ(MINENDSTOP);
#endif
digitalWriteNoTimer(STEP_STEP, HIGH);
#else
WRITE(STEP_STEP, LOW);
#ifdef USEENDSTOP
Max_Stop_state = READ(MAXENDSTOP);
Min_Stop_state = READ(MINENDSTOP);
#endif
WRITE(STEP_STEP, HIGH);
#endif
}
} else {
//wait
currentFeedrate = start_rate;
OCR1A = 2000; // 1kHz.
}
//for test
// if (targertFeedrate > 0) {
// if (targertdir ^ currentdir) {
// currentdir = targertdir;
// WRITE(STEP_DIR, currentdir);
// } else {
// currentFeedrate = targertFeedrate;
// OCR1A = targertFeedrate_OCR1A;
// step_loops = step_loops_targertFeedrate;
// for (int8_t i = 0; i < step_loops; i++)
// stepastep();
// }
//
// } else {
// //wait
// currentFeedrate = 0;
// OCR1A = 2000; // 1kHz.
// }
}
void setTarget_feedrate(unsigned short target_Rate) {
//limit targetFeedrate
if (target_Rate) //only when target_Rate>0 enable the stepper
WRITE(STEP_ENABLE, LOW);
if (absencodercounterfeedrate < (currentFeedrate >> 2)) {
// Serial.println("PID RUN !");
target_Rate >>= 2;
// setTarget_feedrate(absencodercounterfeedrate);
// setTarget_feedrate((targertFeedrate + start_rate) / 5);
// setTarget_feedrate((absencodercounterfeedrate + start_rate) / 2);
// return;
}
if (target_Rate <= max_feedrate)
targertFeedrate = target_Rate;
else
targertFeedrate = max_feedrate;
if (target_Rate < start_rate) {
targertFeedrate = 0;
//return to the initial state
// targertdir = false;
// currentdir = targertdir;
}
targertFeedrate_OCR1A = calc_timer(targertFeedrate);
step_loops_targertFeedrate = step_loops;
//message
// SERIAL_PROTOCOLLNPGM("set targertFeedrate ok : ");
// SERIAL_PROTOCOLPGM("targertFeedrate_OCR1A : ");
// SERIAL_PROTOCOLLN(targertFeedrate_OCR1A);
//// SERIAL_ECHOLN("");
// SERIAL_PROTOCOLPGM("step_loops_targertFeedrate : ");
// SERIAL_PROTOCOLLN((long )step_loops_targertFeedrate);
//// SERIAL_ECHOLN("");
//// unsigned short timer = OCR1A;
//// SERIAL_PROTOCOLPGM("OCR1A : ");
//// SERIAL_PROTOCOLLN(timer);
//// SERIAL_ECHOLN("");
////
// SERIAL_PROTOCOLPGM("targertFeedrate : ");
// SERIAL_PROTOCOLLN((long )targertFeedrate);
// SERIAL_ECHOLN("");
}
//refresh maxfeedrate
void setTarget_feedrate_long(long &target_Rate) {
if (target_Rate > outMax)
target_Rate = outMax;
else if (target_Rate < outMin)
target_Rate = outMin;
if ((target_Rate > 0)) {
targertdir = true; //first change the dir
setTarget_feedrate(target_Rate);
} else {
targertdir = false;
setTarget_feedrate(-target_Rate);
}
}
void changecontroldir() {
controldir = !controldir;
refreshPID();
}
//void setfactor(float f) {
// factor = f;
//}
void refreshmaxfeedrate() {
outMax = max_feedrate;
outMin = -max_feedrate;
// AnanasPID.SetOutputLimits(-max_feedrate, max_feedrate);
}
void setmaxfeedrate(unsigned long max) {
max_feedrate = max;
refreshmaxfeedrate();
}
void setaccelerationrate(unsigned long acc) {
acceleration_rate = acc;
}
void setjerkfeedrate(unsigned short jerk) {
jerk_rate = jerk;
jerk_rate_OCR1A = calc_timer(jerk_rate);
step_loops_jerk_rate = step_loops;
}
void setstartfeedrate(unsigned short start) {
start_rate = start;
start_rate_OCR1A = calc_timer(start_rate);
step_loops_start_rate = step_loops;
}
//void setlockfeedrate(unsigned short lock) {
// lock_rate = lock;
// lock_rate_OCR1A = calc_timer(lock_rate);
// step_loops_lock_rate = step_loops;
//}
void change_targertdir() {
targertdir = !targertdir;
}
void us_PID_Compute() {
// pulseforPID = pulseCount / factor;
pulseforPID = pulseCount; //delete factor
//it should be adjust
encouforPID = encodercount;
error = pulseforPID - encouforPID; //divison or time not used
// ITerm += (Ki * error);
ITerm += (DKi * error);
// ITerm += (ki * error);min
if (ITerm > outMax)
ITerm = outMax;
else if (ITerm < outMin)
ITerm = outMin;
//PID
// dinput = (encouforPID - lastinput);
dinput = (error - lasterror); //cal derror
//PID
// lastinput = encouforPID;
lasterror = error;
//PID
PIDoutFeedrate = Kp * error + ITerm - DKd * dinput;
// PIDoutFeedrate = Kp * error + ITerm + Kd * dinput; //PI
// PIDoutFeedrate = Kp * error + ITerm;
// PIDoutFeedrate = kp * error + ITerm - kd * dinput;
// PIDoutFeedrate = kp * error + ITerm + kd * dinput;
// PIDoutFeedrate = DKp * error + ITerm - DKd * dinput;
//
setTarget_feedrate_long(PIDoutFeedrate);
// if (PIDoutFeedrate > outMax)
// PIDoutFeedrate = outMax;
// else if (PIDoutFeedrate < outMin)
// PIDoutFeedrate = outMin;
//
// if ((PIDoutFeedrate > 0)) {
// targertdir = true; //first change the dir
// setTarget_feedrate(PIDoutFeedrate);
// } else {
// targertdir = false;
// setTarget_feedrate(-PIDoutFeedrate);
// }
}
void us_PID_Compute_InCMT() {
pulseforPID = pulseCount; //delete factor
encouforPID = encodercount; //it should be adjust
error = pulseforPID - encouforPID; //divison or time not used
PIDoutFeedrate = PIDoutFeedrate + Kp * (error - lasterror) + Ki * error
+ Kd * (error - 2 * lasterror + lastlasterror);
lasterror = error;
lastlasterror = lasterror;
// SERIAL_PROTOCOLPGM("PIDoutFeedrate : ");
// SERIAL_PROTOCOLLN(PIDoutFeedrate);
// SERIAL_PROTOCOLPGM("outMax : ");
// SERIAL_PROTOCOLLN(outMax);
// SERIAL_PROTOCOLPGM("outMin : ");
// SERIAL_PROTOCOLLN(outMin);
// SERIAL_PROTOCOLPGM("error : ");
// SERIAL_PROTOCOLLN(error);
if (PIDoutFeedrate > outMax)
PIDoutFeedrate = outMax;
else if (PIDoutFeedrate < outMin)
PIDoutFeedrate = outMin;
if ((PIDoutFeedrate > 0)) {
targertdir = true; //first change the dir
setTarget_feedrate(PIDoutFeedrate);
} else {
targertdir = false;
setTarget_feedrate(-PIDoutFeedrate);
}
}
void setPID(double kpin, double kiin, double kdin) {
if (kpin < 0 || kiin < 0 || kdin < 0)
return;
kp = kpin;
ki = kiin;
kd = kdin;
refreshPID();
// AnanasPID.SetTunings(kpin, kiin, kdin);
// AnanasPID.SetControllerDirection(controldir);
}
void refreshPID() {
if (controldir) {
Kp = kp;
Ki = ki;
Kd = kd;
// Ki = (short) (ki * (double) PIDTIMEUS);
// Kd = (short) (kd * (double) PIDTIMEUS);
DKp = kp;
DKi = (ki / (double) (1000000 / PIDTIMEUS));
DKd = (kd * (double) (1000000 / PIDTIMEUS));
} else {
Kp = 0 - kp;
Ki = 0 - ki;
Kd = 0 - kd;
// Ki = 0 - (short) (ki * (double) PIDTIMEUS);
// Kd = 0 - (short) (kd * (double) PIDTIMEUS);
DKp = 0 - kp;
DKi = 0 - (ki / (double) (1000000 / PIDTIMEUS));
DKd = 0 - (kd * (double) (1000000 / PIDTIMEUS));
}
}
void setP(double kpin) {
kp = kpin;
setPID(kpin, ki, kd);
}
void setI(double kiin) {
ki = kiin;
setPID(kp, kiin, kd);
}
void setD(double kdin) {
kd = kdin;
setPID(kp, ki, kdin);
}
//void setPIDmode(int mode) { //0 for mannul 1 for auto
// AnanasPID.SetMode(mode);
//}
void printNewPID() {
SERIAL_PROTOCOLPGM("Kp: ");
SERIAL_PROTOCOLLN(Kp);
SERIAL_PROTOCOLPGM("Ki: ");
SERIAL_PROTOCOLLN(Ki);
SERIAL_PROTOCOLPGM("Kd: ");
SERIAL_PROTOCOLLN(Kd);
SERIAL_PROTOCOLPGM("error: ");
SERIAL_PROTOCOLLN(error);
SERIAL_PROTOCOLPGM("dinput: ");
SERIAL_PROTOCOLLN(dinput);
SERIAL_ECHOLN("");
}
void printPID() {
SERIAL_PROTOCOLPGM("kp: ");
SERIAL_PROTOCOLLN(kp);
// SERIAL_PROTOCOLLN(AnanasPID.GetKp());
SERIAL_PROTOCOLPGM("DKp: ");
SERIAL_PROTOCOLLN(DKp);
// SERIAL_ECHOLN("");
SERIAL_PROTOCOLPGM("ki: ");
SERIAL_PROTOCOLLN(ki);
// SERIAL_PROTOCOLLN(AnanasPID.GetKi());
SERIAL_PROTOCOLPGM("DKi: ");
SERIAL_PROTOCOLLN(DKi);
// SERIAL_ECHOLN("");
SERIAL_PROTOCOLPGM("kd : ");
SERIAL_PROTOCOLLN(kd);
// SERIAL_PROTOCOLLN(AnanasPID.GetKd());
SERIAL_PROTOCOLPGM("DKd");
SERIAL_PROTOCOLLN(DKd);
// SERIAL_ECHOLN("");
SERIAL_PROTOCOLPGM("pulseforPID : ");
SERIAL_PROTOCOLLN(pulseforPID);
// SERIAL_ECHOLN("");
SERIAL_PROTOCOLPGM("encouforPID : ");
SERIAL_PROTOCOLLN(encouforPID);
// SERIAL_ECHOLN("");
// SERIAL_PROTOCOLPGM("start_rate : ");
// SERIAL_PROTOCOLLN(start_rate);
//// SERIAL_ECHOLN("");
//
// SERIAL_PROTOCOLPGM("start_rate_OCR1A : ");
// SERIAL_PROTOCOLLN((long )start_rate_OCR1A);
//// SERIAL_ECHOLN("");
//
// SERIAL_PROTOCOLPGM("step_loops_start_rate : ");
// SERIAL_PROTOCOLLN((long )step_loops_start_rate);
//// SERIAL_ECHOLN("");
// unsigned short timer = OCR1A;
// SERIAL_PROTOCOLPGM("OCR1A : ");
// SERIAL_PROTOCOLLN(timer);
// SERIAL_PROTOCOLPGM("targertFeedrate : ");
// SERIAL_PROTOCOLLN(targertFeedrate);
// SERIAL_ECHOLN("");
SERIAL_PROTOCOLPGM("PIDoutFeedrate : ");
SERIAL_PROTOCOLLN(PIDoutFeedrate);
SERIAL_PROTOCOLPGM("targertdir : ");
SERIAL_PROTOCOLLN(targertdir);
// SERIAL_ECHOLN("");
SERIAL_PROTOCOLPGM("currentFeedrate: ");
SERIAL_PROTOCOLLN(currentFeedrate);
// SERIAL_ECHOLN("");
SERIAL_PROTOCOLPGM("currentdir : ");
SERIAL_PROTOCOLLN(currentdir);
// SERIAL_ECHOLN("");
SERIAL_PROTOCOLPGM("targertFeedrate : ");
SERIAL_PROTOCOLLN(targertFeedrate);
// SERIAL_PROTOCOLPGM("endertostep : ");
// SERIAL_PROTOCOLLN(endertostep);
SERIAL_ECHOLN("");
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/GaryPillow-Ananas.git
git@api.gitlife.ru:oschina-mirror/GaryPillow-Ananas.git
oschina-mirror
GaryPillow-Ananas
GaryPillow-Ananas
PID