rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
efi_pid.h
Go to the documentation of this file.
1/**
2 * @file efi_pid.h
3 *
4 * everyone including ChibiOS-Contrib has a version of 'pid.h' so we use unique file name to avoid drama
5 *
6 *
7 * @date Sep 16, 2014
8 * @author Andrey Belomutskiy, (c) 2012-2020
9 */
10
11#pragma once
12
13#include "pid_state_generated.h"
15
16// See PidCic below
17#define PID_AVG_BUF_SIZE_SHIFT 5
18#define PID_AVG_BUF_SIZE (1<<PID_AVG_BUF_SIZE_SHIFT) // 32*sizeof(float)
19
20#define NOT_TIME_BASED_PID 1
21
22// minimal period 5m meaning maximum control frequency 200Hz
23#define PID_MINIMAL_PERIOD_MS 5
24
25#define GET_PERIOD_LIMITED(pid_s_ptr) maxI(PID_MINIMAL_PERIOD_MS, ((pid_s_ptr)->periodMs))
26
27#define MS2SEC(x) (x * 0.001)
28
29struct pid_s;
30
31/**
32 * default basic implementation also known as PidParallelController
33 */
34class Pid : public pid_state_s {
35public:
36 Pid();
37 explicit Pid(pid_s *parameters);
39 bool isSame(const pid_s *parameters) const;
40
41 /**
42 * This version of the method takes dTime from pid_s
43 *
44 * @param Controller input / process output
45 * @returns Output from the PID controller / the input to the process
46 */
47 float getOutput(float target, float input);
48 virtual float getOutput(float target, float input, float dTime);
49 // doesn't limit the result (used in incremental CIC PID, see below)
50 float getUnclampedOutput(float target, float input, float dTime);
51 void updateFactors(float pFactor, float iFactor, float dFactor);
52 virtual void reset();
53 float getP() const;
54 float getI() const;
55 float getD() const;
56 float getOffset() const;
57 float getMinValue() const;
58 float getIntegration(void) const;
59 float getPrevError(void) const;
60 void setErrorAmplification(float coef);
61#if EFI_TUNER_STUDIO
62 void postState(pid_status_s& pidStatus) const;
63#endif /* EFI_TUNER_STUDIO */
64 void showPidStatus(const char* msg) const;
65 void sleep();
67 // todo: move this to pid_s one day
68 float iTermMin = -1000000.0;
69 float iTermMax = 1000000.0;
70protected:
71 pid_s *parameters = nullptr;
72 virtual void updateITerm(float value);
73};
74
75
76/**
77 * A PID implementation with a modified cascaded integrator-comb (CIC) filtering.
78 * Used for incremental auto-IAC control. See autoIdle() in idle_thread.cpp
79 * See pid_cic.md.
80 *
81 * https://rusefi.com/forum/viewtopic.php?f=9&t=1315
82 */
83class PidCic : public Pid {
84
85public:
86 PidCic();
87 explicit PidCic(pid_s *pid);
88
89 void reset(void) override;
90 using Pid::getOutput;
91 float getOutput(float target, float input, float dTime) override;
92
93private:
94 // Circular running-average buffer for I-term, used by CIC-like filter
95 float iTermBuf[PID_AVG_BUF_SIZE];
96 // Needed by averaging (smoothing) of iTerm sums
98 // Total PID iterations (>240 days max. for 10ms update period)
100
101private:
102 void updateITerm(float value) override;
103};
104
105/**
106 * A PID with derivative filtering (backward differences) and integrator anti-windup.
107 * See: Wittenmark B., Astrom K., Arzen K. IFAC Professional Brief. Computer Control: An Overview.
108 * Two additional parameters used: derivativeFilterLoss and antiwindupFreq
109 * (If both are 0, then this controller is identical to PidParallelController)
110 *
111 * TODO: should PidIndustrial replace all usages of Pid/PidParallelController?
112 */
113class PidIndustrial : public Pid {
114public:
116 explicit PidIndustrial(pid_s *pid);
117
118 using Pid::getOutput;
119 float getOutput(float target, float input, float dTime) override;
120
121public:
122 // todo: move this to pid_s one day
123 float antiwindupFreq = 0.0f; // = 1/ResetTime
124 float derivativeFilterLoss = 0.0f; // = 1/Gain
125
126private:
127 float limitOutput(float v) const;
128};
float iTermInvNum
Definition efi_pid.h:97
float getOutput(float target, float input, float dTime) override
Definition efi_pid.cpp:219
int totalItermCnt
Definition efi_pid.h:99
float iTermBuf[PID_AVG_BUF_SIZE]
Definition efi_pid.h:95
void reset(void) override
Definition efi_pid.cpp:210
void updateITerm(float value) override
Definition efi_pid.cpp:223
Definition efi_pid.h:34
void sleep()
Definition efi_pid.cpp:153
float iTermMax
Definition efi_pid.h:69
void updateFactors(float pFactor, float iFactor, float dFactor)
Definition efi_pid.cpp:96
float iTermMin
Definition efi_pid.h:68
bool isSame(const pid_s *parameters) const
Definition efi_pid.cpp:39
virtual void updateITerm(float value)
Definition efi_pid.cpp:178
void setErrorAmplification(float coef)
Definition efi_pid.cpp:138
void postState(pid_status_s &pidStatus) const
Definition efi_pid.cpp:144
float getP() const
Definition efi_pid.cpp:110
float getOffset() const
Definition efi_pid.cpp:130
void showPidStatus(const char *msg) const
Definition efi_pid.cpp:160
float getD() const
Definition efi_pid.cpp:126
float getI() const
Definition efi_pid.cpp:114
Pid()
Definition efi_pid.cpp:16
virtual void reset()
Definition efi_pid.cpp:103
float getUnclampedOutput(float target, float input, float dTime)
Definition efi_pid.cpp:62
pid_s * parameters
Definition efi_pid.h:71
float getPrevError(void) const
Definition efi_pid.cpp:118
void initPidClass(pid_s *parameters)
Definition efi_pid.cpp:24
int resetCounter
Definition efi_pid.h:66
float getIntegration(void) const
Definition efi_pid.cpp:122
float getMinValue() const
Definition efi_pid.cpp:134
float getOutput(float target, float input)
Definition efi_pid.cpp:56
float getOutput(float target, float input, float dTime) override
Definition efi_pid.cpp:249
float antiwindupFreq
Definition efi_pid.h:123
float derivativeFilterLoss
Definition efi_pid.h:124
float limitOutput(float v) const
Definition efi_pid.cpp:288