Skip to content

Commit c4ee218

Browse files
committed
Improved performance and fixed point algorithm
1 parent 7e48e77 commit c4ee218

File tree

4 files changed

+15
-15
lines changed

4 files changed

+15
-15
lines changed

QuickPID.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,11 @@ bool QuickPID::Compute()
6666
error = *mySetpoint - input;
6767

6868
/*Working error, Proportional on Measurement and Remaining PID output*/
69-
if (!pOnE) {
70-
outputSum += (ki * error);
71-
outputSum -= (kpd * dInput);
72-
}
69+
if (!pOnE) outputSum += FX_MUL(FL_FX(ki) , error) - FX_MUL(FL_FX(kpd), dInput);
70+
7371
/*Working error, Proportional on Error and remaining PID output*/
74-
if (pOnE) {
75-
outputSum += (kpi * error);
76-
outputSum -= (kd * dInput);
77-
}
72+
if (pOnE) outputSum += FX_MUL(FL_FX(kpi) , error) - FX_MUL(FL_FX(kd), dInput);
73+
7874
if (outputSum > outMax) outputSum = outMax;
7975
if (outputSum < outMin) outputSum = outMin;
8076
*myOutput = outputSum;
@@ -232,19 +228,19 @@ bool QuickPID::GetDirection() {
232228
int QuickPID::analogReadFast(int ADCpin) {
233229
#if defined(__AVR_ATmega328P__)
234230
byte ADCregOriginal = ADCSRA;
235-
ADCSRA = (ADCSRA & B11111000) | 6; //64 prescaler
231+
ADCSRA = (ADCSRA & B11111000) | 5; //32 prescaler
236232
int adc = analogRead(ADCpin);
237233
ADCSRA = ADCregOriginal;
238234
return adc;
239235
#elif defined(__AVR_ATtiny_Zero_One__) || defined(__AVR_ATmega_Zero__)
240236
byte ADCregOriginal = ADC0_CTRLC;
241-
ADC0_CTRLC = 0x55; //reduced cap, Vdd ref, 64 prescaler
237+
ADC0_CTRLC = 0x54; //reduced cap, Vdd ref, 32 prescaler
242238
int adc = analogRead(ADCpin);
243239
ADC0_CTRLC = ADCregOriginal;
244240
return adc;
245241
#elif defined(__AVR_DA__)
246242
byte ADCregOriginal = ADC0.CTRLC;
247-
ADC0.CTRLC = ADC_PRESC_DIV64_gc; //64 prescaler
243+
ADC0.CTRLC = ADC_PRESC_DIV32_gc; //32 prescaler
248244
int adc = analogRead(ADCpin);
249245
ADC0.CTRLC = ADCregOriginal;
250246
return adc;

QuickPID.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ class QuickPID
1414
#define P_ON_M 0
1515
#define P_ON_E 1
1616

17+
#define FL_FX(a) (int32_t)(a*256.0) // float to fixed point
18+
#define FX_MUL(a,b) ((a*b)>>8) // fixed point multiply
19+
1720

1821
// commonly used functions ************************************************************************************
1922

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
This API (version 2.02) follows the [ArduinoPID](https://github.com/br3ttb/Arduino-PID-Library) library, however there have been some significant updates as follows:
44

55
- Library named as **QuickPID** and can run concurrently with Arduino **PID**
6-
- Reorganized and more efficient PID algorithms
6+
- Quicker fixed point math in compute function
7+
- Reorganized and more efficient PID algorithm
78
- micros() timing resolution
89
- Faster analog read function
910
- `GetError()`function added for diagnostics
@@ -12,10 +13,10 @@ This API (version 2.02) follows the [ArduinoPID](https://github.com/br3ttb/Ardui
1213

1314
| Compute | Kp | Ki | Kd | Step Time (µS) |
1415
| :----------------------------------- | ---- | ---- | ---- | -------------- |
15-
| QuickPID | 2.0 | 15.0 | 0.05 | 72 |
16+
| QuickPID | 2.0 | 15.0 | 0.05 | 68 |
1617
| Arduino PID | 2.0 | 15.0 | 0.05 | 104 |
1718
| **analogRead, Compute, analogWrite** | | | | |
18-
| QuickPID | 2.0 | 5.0 | 0.2 | 132 |
19+
| QuickPID | 2.0 | 5.0 | 0.2 | 96 |
1920
| Arduino PID | 2.0 | 5.0 | 0.2 | 224 |
2021

2122
#### Self Test Example (RC Filter): P_ON_M

examples/QuickPID_Self_Test/QuickPID_Self_Test.ino

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ void loop()
5959
after = micros();
6060
analogWrite(PIN_OUTPUT, Output);
6161

62-
delay(20);
62+
delay(40);
6363
cnt++;
6464
if (cnt == 100) {
6565
analogWrite(PIN_OUTPUT, 0);

0 commit comments

Comments
 (0)