0.1.5 PID_RT

This commit is contained in:
rob tillaart 2022-11-22 11:48:02 +01:00
parent ddd5c8e42a
commit 1241b83a82
8 changed files with 125 additions and 66 deletions

View File

@ -1,3 +1,18 @@
platforms:
rpipico:
board: rp2040:rp2040:rpipico
package: rp2040:rp2040
gcc:
features:
defines:
- ARDUINO_ARCH_RP2040
warnings:
flags:
packages:
rp2040:rp2040:
url: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
compile:
# Choosing to run compilation tests on 2 different Arduino platforms
platforms:
@ -9,3 +24,4 @@ compile:
- esp32
# - esp8266
# - mega2560
- rpipico

View File

@ -0,0 +1,36 @@
# Change Log PID_RT
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## [0.1.5] - 2022-10-23
- add RP2040 to build-CI
- add changelog.md
- minor edits readme.md
## [0.1.4] - 2021-12-23
- update library.json, license,
- minor edits
## [0.1.3] - 2021-11-12
- update build-CI, update readme
- renamed variables for readability
- added history
- fixed bug in setK
## [0.1.2] - 2021-05-28
- minor edits
## [0.1.1] - 2021-05-27
- add json check
- add lint check
## [0.1.0] - 2020-12-15
- update readme, fix unit test,
- fix library.json
- add 2nd constructor

View File

@ -1,21 +1,9 @@
//
// FILE: PID_RT.h
// FILE: PID_RT.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.1.4
// VERSION: 0.1.5
// PURPOSE: PID library for Arduino
// URL: https://github.com/RobTillaart/PID
//
// HISTORY
// 0.1.0 2020-12-15 update readme, fix unit test,
// fix library.json
// add 2nd constructor
// 0.1.1 2021-05-27 add json check, add lint check
// 0.1.2 2021-05-28 minor edits
// 0.1.3 2021-11-12 update build-CI, update readme
// renamed variables for readability
// added history
// fixed bug in setK
// 0.1.4 2021-12-23 update library.json, license, minor edits
#include "PID_RT.h"
@ -55,13 +43,13 @@ void PID_RT::reset()
__Kd = 0.0;
_reverse = false;
_running = false;
_POI = true; // Proportional On Input - Error
_POI = true; // Proportional On Input - Error
}
bool PID_RT::setK(float Kp, float Ki, float Kd)
{
// prevent short-cut evaluation.
// prevent short-cut evaluation.
bool b = setKp(Kp);
b = b && setKi(Ki);
b = b && setKd(Kd);
@ -83,7 +71,7 @@ bool PID_RT::setKi(float Ki)
{
if (Ki < 0) return false;
_Ki = Ki;
__Ki = _Ki * _interval * 0.001; // milliseconds.
__Ki = _Ki * _interval * 0.001; // milliseconds.
if (_reverse) __Ki = - __Ki;
return true;
};
@ -115,7 +103,7 @@ bool PID_RT::compute(float input)
_error = _setPoint - _input;
float dI = _lastInput - _input;
// P - proportional on input or proportional on error
// P - proportional on input or proportional on error
if (_POI == false)
{
_output = __Kp * _error;
@ -126,15 +114,15 @@ bool PID_RT::compute(float input)
_errorSum += __Kp * dI;
}
// I
// I
_errorSum += __Ki * _error;
if (_errorSum > _rangeMax) _errorSum = _rangeMax;
else if (_errorSum < _rangeMin) _errorSum = _rangeMin;
// D
// D
_output += _errorSum + __Kd * dI;
// limit output to range
// limit output to range
if (_output > _rangeMax) _output = _rangeMax;
else if (_output < _rangeMin) _output = _rangeMin;
@ -148,7 +136,7 @@ bool PID_RT::setInterval(uint32_t interval)
if (interval != _interval)
{
_interval = interval;
// recalculate __Ki and __Kd.
// recalculate __Ki and __Kd.
setKi(_Ki);
setKd(_Kd);
return true;
@ -157,5 +145,5 @@ bool PID_RT::setInterval(uint32_t interval)
}
// -- END OF FILE --
// -- END OF FILE --

View File

@ -2,7 +2,7 @@
//
// FILE: PID_RT.h
// AUTHOR: Rob Tillaart
// VERSION: 0.1.4
// VERSION: 0.1.5
// PURPOSE: PID library for Arduino
// URL: https://github.com/RobTillaart/PID_RT
@ -10,7 +10,7 @@
#include "Arduino.h"
#define PID_LIB_VERSION (F("0.1.4"))
#define PID_LIB_VERSION (F("0.1.5"))
class PID_RT
@ -19,58 +19,58 @@ public:
PID_RT();
PID_RT(float sp, float Kp, float Ki, float Kd);
void reset();
void reset();
void setPoint(float sp) { _setPoint = sp; };
float getSetPoint() { return _setPoint; };
void setPoint(float sp) { _setPoint = sp; };
float getSetPoint() { return _setPoint; };
bool compute(float input);
float getOutput() { return _output; };
bool compute(float input);
float getOutput() { return _output; };
// set PID controller on / off
void start() { _running = true; };
void stop() { _running = false; };
bool isRunning() { return _running; };
// set PID controller on / off
void start() { _running = true; };
void stop() { _running = false; };
bool isRunning() { return _running; };
// reverse the behaviour (not implemented yet)
void setReverse(bool reverse) { _reverse = reverse; };
bool getReverse() { return _reverse; };
// reverse the behaviour (not implemented yet)
void setReverse(bool reverse) { _reverse = reverse; };
bool getReverse() { return _reverse; };
// how often should one do the math
// how often should one do the math
bool setInterval(uint32_t interval);
uint32_t getInterval() { return _interval; };
// tune the output range, default 0..100
void setOutputRange(float rangeMin, float rangeMax) { _rangeMin = rangeMin; _rangeMax = rangeMax; };
float getOutputMin() { return _rangeMin; };
float getOutputMax() { return _rangeMax; };
// tune the output range, default 0..100
void setOutputRange(float rangeMin, float rangeMax) { _rangeMin = rangeMin; _rangeMax = rangeMax; };
float getOutputMin() { return _rangeMin; };
float getOutputMax() { return _rangeMax; };
// set the initial K values,
// runtime updates are allowed - at your own risk
bool setK(float Kp, float Ki, float Kd);
bool setKp(float Kp);
bool setKi(float Ki);
bool setKd(float Kd);
float getKp() { return _Kp; };
float getKi() { return _Ki; };
float getKd() { return _Kd; };
// set the initial K values,
// runtime updates are allowed - at your own risk
bool setK(float Kp, float Ki, float Kd);
bool setKp(float Kp);
bool setKi(float Ki);
bool setKd(float Kd);
float getKp() { return _Kp; };
float getKi() { return _Ki; };
float getKd() { return _Kd; };
// set Proportional on Input or on Error
// set Proportional on Input or on Error
void setPropOnInput() { _POI = true; }; // default
void setPropOnError() { _POI = false; };
bool isPropOnInput() { return _POI == true; };
bool isPropOnError() { return _POI == false; };
// debugging
// debugging
float getInput() { return _input; };
float getLastError() { return _error; };
uint32_t getLastTime() { return _lastTime; };
@ -99,9 +99,9 @@ private:
bool _reverse = false;
bool _running = false;
bool _POI = true; // Proportional On Input - Error
bool _POI = true; // Proportional On Input - Error
};
// -- END OF FILE --
// -- END OF FILE --

View File

@ -44,7 +44,7 @@ Overwrites the values set in the constructor.
- **bool isRunning()** return the enable/disable flag.
### Additional parameters
### Behaviour parameters
- **bool setInterval(uint32_t interval)** set the interval between two **compute()** calls.
Returns **true** if changed, otherwise **false**.
@ -54,12 +54,20 @@ Returns **true** if changed, otherwise **false**.
- **float getOutputMax()** read back setting rangeMax.
- **void setReverse(bool reverse)** reverse behaviour, seldom needed.
- **bool getReverse()** read back the setting.
### K-parameters
- **bool setKp(float Kp)** runtime updates are allowed - at your own risk.
- **bool setKi(float Ki)** runtime updates are allowed - at your own risk.
- **bool setKd(float Kd)** runtime updates are allowed - at your own risk.
- **float getKp()** read back setting.
- **float getKi()** read back setting.
- **float getKd()** read back setting.
### Proportional
- **void setPropOnInput()** this is default behaviour.
- **void setPropOnError()** alternative.
- **bool isPropOnInput()** read back setting.
@ -83,8 +91,20 @@ See examples.
## Future
- update documentation
#### must
- update / improve documentation
- more testing
#### should
- add examples to test more
- improve unit test
-
- move all code to .cpp
#### could
- add reference to PID book / website?
- investigate if it works as PI or P controller too.
- PI as derived or base class?

View File

@ -2,11 +2,10 @@
// FILE: PID_basic.ino
// AUTHOR: Rob Tillaart
// PURPOSE: demo
// DATE: 2020-12-15
//
// connect an LED to the PWM pin
// connect a potentiometer to A0
// play :)
// connect an LED to the PWM pin
// connect a potentiometer to A0
// play :)
#include "PID_RT.h"
@ -15,7 +14,7 @@ PID_RT PID;
const int PWM_PIN = 3; // UNO PWM pin
int op = 0;;
int op = 0;
float input = 0;

View File

@ -15,7 +15,7 @@
"type": "git",
"url": "https://github.com/RobTillaart/PID_RT"
},
"version": "0.1.4",
"version": "0.1.5",
"license": "MIT",
"frameworks": "arduino",
"platforms": "*",

View File

@ -1,5 +1,5 @@
name=PID_RT
version=0.1.4
version=0.1.5
author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Arduino PID library