Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
2274 linlun 1
#ifndef PID_AUTOTUNE_H
2
#define PID_AUTOTUNE_H
3
#define AUTOTUNE_LIBRARY_VERSION 0.0.2
4
 
5
#include <inttypes.h>
6
#include <stdbool.h>
7
#include <avr/pgmspace.h>
8
 
9
// verbose debug option
10
// requires open Serial port
11
#undef AUTOTUNE_DEBUG
12
 
13
#undef USE_SIMULATION
14
 
15
// defining this option implements relay bias
16
// this is useful to adjust the relay output values
17
// during the auto tuning to recover symmetric
18
// oscillations 
19
// this can compensate for load disturbance
20
// and equivalent signals arising from nonlinear
21
// or non-stationary processes 
22
// any improvement in the tunings seems quite modest 
23
// but sometimes unbalanced oscillations can be 
24
// persuaded to converge where they might not 
25
// otherwise have done so
26
#undef AUTOTUNE_RELAY_BIAS
27
 
28
// average amplitude of successive peaks must differ by no more than this proportion
29
// relative to half the difference between maximum and minimum of last 2 cycles
30
#define AUTOTUNE_PEAK_AMPLITUDE_TOLERANCE 0.05
31
 
32
// ratio of up/down relay step duration should differ by no more than this tolerance
33
// biasing the relay con give more accurate estimates of the tuning parameters but
34
// setting the tolerance too low will prolong the autotune procedure unnecessarily
35
// this parameter also sets the minimum bias in the relay as a proportion of its amplitude
36
#define AUTOTUNE_STEP_ASYMMETRY_TOLERANCE 0.20
37
 
38
// auto tune terminates if waiting too long between peaks or relay steps
39
// set larger value for processes with long delays or time constants
40
#define AUTOTUNE_MAX_WAIT_MINUTES 5
41
 
42
// Ziegler-Nichols type auto tune rules
43
// in tabular form
44
struct Tuning
45
{
46
  uint8_t divisor[3];
47
  /*
48
  bool PI_controller()
49
  {
50
    return pgm_read_uint8_t_near(&_divisor[2]) == 0;
51
  }
52
 
53
  float divisor(uint8_t index)  
54
  {
55
    return (float)pgm_read_uint8_t_near(&_divisor[index]) * 0.05;
56
  }
57
  */
58
};
59
 
60
 
61
 
62
  // constants ***********************************************************************************
63
 
64
  // auto tune method
65
  enum PID_AutoTune_Methods
66
  {
67
    ZIEGLER_NICHOLS_PI = 0,
68
    ZIEGLER_NICHOLS_PID = 1,
69
    TYREUS_LUYBEN_PI,
70
    TYREUS_LUYBEN_PID,
71
    CIANCONE_MARLIN_PI,
72
    CIANCONE_MARLIN_PID,
73
    AMIGOF_PI,
74
    PESSEN_INTEGRAL_PID,
75
    SOME_OVERSHOOT_PID,
76
    NO_OVERSHOOT_PID
77
  };
78
 
79
  // peak type
80
  enum Peak
81
  {
82
    MINIMUM = -1,
83
    NOT_A_PEAK = 0,
84
    MAXIMUM = 1
85
  };
86
 
87
  // auto tuner state
88
  enum AutoTunerState
89
  {
90
    AUTOTUNER_OFF = 0,
91
    STEADY_STATE_AT_BASELINE = 1,
92
    STEADY_STATE_AFTER_STEP_UP = 2,
93
    RELAY_STEP_UP = 4,
94
    RELAY_STEP_DOWN = 8,
95
    CONVERGED = 16,
96
    FAILED = 128
97
  };
98
 
99
  // tuning rule divisor
100
  enum PID_Constant_Devisors
101
  {
102
    KP_DIVISOR = 0,
103
    TI_DIVISOR = 1,
104
    TD_DIVISOR = 2
105
  };
106
 
107
 
108
 
109
 
110
  // commonly used methods ***********************************************************************
111
  void PID_ATune_Init(float* Input, float* Output);          // * Constructor.  links the Autotune to a given PID
112
  bool PID_ATune_Runtime(void);                       // * Similar to the PID Compute function, 
113
                                        //   returns true when done, otherwise returns false
114
  void PID_ATune_Cancel(void);                        // * Stops the AutoTune 
115
 
116
  void PID_ATune_SetOutputStep(float);           // * how far above and below the starting value will 
117
                                        //   the output step?   
118
  float PID_ATune_GetOutputStep(void);               // 
119
 
120
  void PID_ATune_SetControlType(uint8_t);            // * Determines tuning algorithm
121
  uint8_t PID_ATune_GetControlType(void);                // * Returns tuning algorithm
122
 
123
  void PID_ATune_SetLookbackSec(uint16_t);             // * how far back are we looking to identify peaks
124
  int PID_ATune_GetLookbackSec(void);                 //
125
 
126
  void PID_ATune_SetNoiseBand(float);            // * the autotune will ignore signal chatter smaller 
127
                                        //   than this value
128
  float PID_ATune_GetNoiseBand(void);                //   this should be accurately set
129
 
130
  float PID_ATune_GetKp(void);                       // * once autotune is complete, these functions contain the
131
  float PID_ATune_GetKi(void);                       //   computed tuning parameters.  
132
  float PID_ATune_GetKd(void);                       //
133
 
134
#endif