pid files
parent
bfdd4210e1
commit
2c707929a2
@ -0,0 +1,36 @@
|
|||||||
|
#include <util/atomic.h>
|
||||||
|
#include "pid.h"
|
||||||
|
|
||||||
|
extern volatile uint16_t holdingRegisters[10];
|
||||||
|
int16_t pid_step(volatile struct pid* controller, float dt, int16_t error) {
|
||||||
|
// Calculate p term
|
||||||
|
|
||||||
|
uint16_t p = error * controller->kP;
|
||||||
|
|
||||||
|
// Calculate i term
|
||||||
|
ATOMIC_BLOCK(ATOMIC_FORCEON){
|
||||||
|
controller->integral += error * dt * controller->kI;
|
||||||
|
if(controller->integral > 80)
|
||||||
|
controller->integral = 80;
|
||||||
|
if(controller->integral < -80)
|
||||||
|
controller->integral = -80;
|
||||||
|
}
|
||||||
|
//holdingRegisters[3]=((float)(error) * controller->kI);
|
||||||
|
//holdingRegisters[4] = error;
|
||||||
|
|
||||||
|
// Calculate d term, taking care to not divide by zero
|
||||||
|
float d = dt == 0 ? 0 : ((error - controller->lastError) / dt) * controller->kD;
|
||||||
|
controller->lastError = error;
|
||||||
|
|
||||||
|
return p + controller->integral + d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_pid(volatile struct pid* controller, float p, float i, float d){
|
||||||
|
*controller = (struct pid){
|
||||||
|
.kP = p,
|
||||||
|
.kI = i,
|
||||||
|
.kD = d,
|
||||||
|
.lastError = 0,
|
||||||
|
.integral = 0
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
#ifndef _PID_H_
|
||||||
|
#define _PID_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
struct pid{
|
||||||
|
// Controller gains
|
||||||
|
float kP;
|
||||||
|
float kI;
|
||||||
|
float kD;
|
||||||
|
|
||||||
|
// State variables
|
||||||
|
float lastError;
|
||||||
|
float integral;
|
||||||
|
};
|
||||||
|
|
||||||
|
//float pid_step(volatile struct pid* controller, float dt, float error);
|
||||||
|
int16_t pid_step(volatile struct pid* controller, float dt, int16_t error);
|
||||||
|
void init_pid(volatile struct pid* controller, float p, float i, float d);
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue