Skip to content

Commit 7db2145

Browse files
committed
Implement separate I gain multiplier for negative error and adjust PID values
1 parent 636f930 commit 7db2145

File tree

3 files changed

+27
-12
lines changed

3 files changed

+27
-12
lines changed

AxxSolder_firmware/Core/Inc/pid.h

+5
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ typedef struct{
6060

6161
double IminError;
6262

63+
double NegativeErrorIgainMultiplier;
64+
6365
}PID_TypeDef;
6466

6567
/* Init */
@@ -85,6 +87,9 @@ void PID_SetILimits(PID_TypeDef *uPID, double Min, double Max);
8587
/* Minimum error where I is added */
8688
void PID_SetIminError(PID_TypeDef *uPID, double IminError);
8789

90+
/* Set the I gain multiplier for negative error*/
91+
void PID_SetNegativeErrorIgainMult(PID_TypeDef *uPID, double NegativeErrorIgainMultiplier);
92+
8893
/* PID Tunings */
8994
void PID_SetTunings(PID_TypeDef *uPID, double Kp, double Ki, double Kd);
9095

AxxSolder_firmware/Core/Src/main.c

+6-4
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ uint8_t fw_version_patch = 1;
5757
#define MAX_I_NT115 150
5858

5959
#define KP_T210 5
60-
#define KI_T210 5.5//5
60+
#define KI_T210 3//5
6161
#define KD_T210 0.25
62-
#define MAX_I_T210 125//250
62+
#define MAX_I_T210 300//250
6363

6464
#define KP_T245 8
6565
#define KI_T245 5
@@ -137,7 +137,8 @@ uint8_t custom_temperature_on = 0;
137137
/* PID parameters */
138138
#define PID_MAX_OUTPUT 500
139139
#define PID_UPDATE_INTERVAL 25
140-
#define PID_add_I_min_error 999//50
140+
#define PID_ADD_I_MIN_ERROR 75
141+
#define PID_NEGATIVE_ERROR_I_GAIN_MULTIPLIER 5
141142

142143
/* Buffer for UART print */
143144
char UART_buffer[40];
@@ -1427,7 +1428,8 @@ int main(void)
14271428
PID_SetSampleTime(&TPID, PID_UPDATE_INTERVAL, 0); //Set PID sample time to "PID_UPDATE_INTERVAL" to make sure PID is calculated every time it is called
14281429
PID_SetOutputLimits(&TPID, 0, PID_MAX_OUTPUT); // Set max and min output limit
14291430
PID_SetILimits(&TPID, 0, 0); // Set max and min I limit
1430-
PID_SetIminError(&TPID,PID_add_I_min_error);
1431+
PID_SetIminError(&TPID,PID_ADD_I_MIN_ERROR);
1432+
PID_SetNegativeErrorIgainMult(&TPID, PID_NEGATIVE_ERROR_I_GAIN_MULTIPLIER);
14311433

14321434
/* Init and fill filter structures with initial values */
14331435
for (int i = 0; i<200;i++){

AxxSolder_firmware/Core/Src/pid.c

+16-8
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,15 @@ uint8_t PID_Compute(PID_TypeDef *uPID){
8080
output += uPID->DispKd_part;
8181

8282
/* Conditional integration as anti-windup (clamping) */
83-
if(check_clamping(output + uPID->Ki * error * timeChange_in_seconds, uPID->OutMin, uPID->OutMax) && (error*(output + uPID->OutputSum) > 0)){
84-
//if((error > proportional_band_max) || (error < proportional_band_min)){
83+
if(check_clamping(output + 5*uPID->Ki * error * timeChange_in_seconds, uPID->OutMin, uPID->OutMax) && (error*(output + uPID->OutputSum) > 0)){
8584
uPID->OutputSum += 0;
8685
}
87-
else{
86+
else if(error > 0){
8887
uPID->OutputSum += (uPID->Ki * error * timeChange_in_seconds);
8988
}
89+
else{
90+
uPID->OutputSum += 5*(uPID->Ki * error * timeChange_in_seconds);
91+
}
9092

9193
/* Clamp Integral part */
9294
uPID->OutputSum = double_clamp(uPID->OutputSum, uPID->IMin, uPID->IMax);
@@ -97,13 +99,11 @@ uint8_t PID_Compute(PID_TypeDef *uPID){
9799
}
98100

99101
/* only add I part if error is smaller than IminError and scale it from IminError to 0 */
100-
if(error < fabs(uPID->IminError)){
101-
uPID->DispKi_part = (uPID->IminError - fabs(error))/uPID->IminError * uPID->OutputSum;
102-
}
103-
else{
104-
uPID->DispKi_part = 0;
102+
if(error > fabs(uPID->IminError)){
103+
uPID->OutputSum = 0;
105104
}
106105

106+
uPID->DispKi_part = uPID->OutputSum;
107107
/* Final summation */
108108
output += uPID->DispKi_part;
109109

@@ -176,6 +176,14 @@ void PID_SetIminError(PID_TypeDef *uPID, double IminError){ /* Check value */
176176
uPID->IminError = IminError;
177177
}
178178

179+
/* Set the I gain multiplier for negative error*/
180+
void PID_SetNegativeErrorIgainMult(PID_TypeDef *uPID, double NegativeErrorIgainMultiplier){
181+
if (NegativeErrorIgainMultiplier < 0){
182+
return;
183+
}
184+
185+
uPID->NegativeErrorIgainMultiplier = NegativeErrorIgainMultiplier;
186+
}
179187

180188
/* PID Tunings */
181189
void PID_SetTunings(PID_TypeDef *uPID, double Kp, double Ki, double Kd){

0 commit comments

Comments
 (0)