DIS10/pingpong_test/pingpong.c
2024-02-22 11:22:14 +01:00

99 lines
1.8 KiB
C

#include "io.h"
#define Ts 0.1
//float Kc = 1.0;
#define Ku 0.9
#define Tu 2.8
#define Kc 1.2//1//Ku/2.2 //=4.1
#define Ti 3//3//(2.2*Tu)
#define Td 0.5//0.5//(Tu/6.3)
const float p1 = (Kc*Ts)/Ti;
const float q1 = -Kc - (3*Kc*Td)/(2*Ts);
const float q2 = Kc + (7*Kc*Td)/(2*Ts);
const float q3 = -(5*Kc*Td)/(2*Ts);
const float q4 = (Kc*Td)/(2*Ts);
float y[4] = {0, 0, 0, 0};
float n = 0.0;
int controller(int dist, int r)
{
int i;
for (i=3; i>0; i--)
{
y[i] = y[i-1];
}
y[0] = dist;
n = n + p1 * ( r - y[1] ) + q1 * y[0] + q2 * y[1] + q3 * y[2] + q4 * y[3];
//n = Kc * ( r - y[0] );
if (n > 1000)
{
n = 1000;
}
else if (n < 0)
{
n = 0;
}
return (int)(n+0.5);
}
void *mainThread(void *arg0)
{
if (initUART() == false)
{
// initUart() failed
while(1);
}
// Samplefrequency = 10 Hz
if (initTimer(10) == false)
{
sendStringUART("initTimer() failed");
while(1);
}
initPort();
if (initPWM() == false)
{
sendStringUART("initPWM() failed");
while(1);
}
int i = 0, ii = -5, t = 300;
uint32_t sp = 0;
int PWM = 0;
char ploep[100];
//Kc = 2;
setPWM(0);
while(1)
{
trigger(); // Trigger routine creates a 10 usec trigger pulse for the ultrasonic sensor.
PWM = controller(distance, sp);
if(i < 30)
{
setPWM(0);
}
else
{
sp = 400;
setPWM(PWM);
}
sprintf(&ploep, "%d,%d,%d,%i\n", i, distance, sp, PWM);
sendStringUART(ploep);
i++;
while(tick == false){}
tick = false;
}
return 0;
}