P, PI, PID-control
Dependencies: HIDScope MODSERIAL QEI biquadFilter mbed
Fork of control by
main.cpp
- Committer:
- bjonkheer
- Date:
- 2018-10-15
- Revision:
- 2:3d4fc510f3d5
- Parent:
- 1:a3af4c5b59bb
- Child:
- 3:59d6069fb0f6
File content as of revision 2:3d4fc510f3d5:
#include "mbed.h" #include "MODSERIAL.h" #include "QEI.h" #include "HIDScope.h" HIDScope scope(2); PwmOut pwmpin(D5); DigitalOut directionpin(D4); AnalogIn potmeter1(A0); AnalogIn potmeter2(A1); DigitalIn button(D0); Ticker Sample; Timer t; MODSERIAL pc(USBTX, USBRX); QEI wheel (D13, D12, NC, 32); float angle_resolution = (360.0/32.0)*(1.0/131.0); //degrees/counts float samplingfreq = 100.0; //Hz float u = 0; int pulses = 0; float angle; float oldangle; double time_s; volatile double Kp = 17.5; volatile double Ki = 1.02; double refangle; double error_angle; double P_controller(double error) { if(button) { Kp = potmeter2.read()*40; } else { Ki = potmeter2.read()*3; } double u_k = Kp * error; static double error_integral = 0; error_integral = error_integral + error * 1/samplingfreq; double u_i = Ki * error_integral; return u_k+u_i; } float mean(float *samples, int n) { float sum = 0.0; for (int i=0; i<n; i++) { sum += samples[i]; } return sum / (float)n; } void sampling() { } void changedirection() { directionpin = !directionpin; } int main() { t.start(); pc.baud(115200); pwmpin.period_us(60); //button.fall(&changedirection); //refvel.attach(&sampling, 1/samplingfreq); while (true) { pulses = wheel.getPulses(); refangle = potmeter1.read()*360.0; scope.set(0,refangle); angle = pulses*angle_resolution; scope.set(1,angle); scope.send(); error_angle = refangle - angle; u = P_controller(error_angle)/360.0; directionpin = u > 0.0f; pwmpin = fabs(u); pc.printf("Reference velocity is: %f degrees per second \r\n", u); oldangle = angle; wait(1/samplingfreq); } }