Created
February 26, 2024 00:03
-
-
Save eliaskanelis/65498bf2d1f13ea31b5eb1a44b5dfbdb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdint.h> | |
#include <stdio.h> | |
#include <unistd.h> | |
#include <sys/time.h> | |
typedef struct | |
{ | |
float dampingFactor; | |
float dampingCoeff; | |
float target; | |
float measured; | |
} rtDataType; | |
uint64_t getTime_ms(void) | |
{ | |
struct timeval tp; | |
gettimeofday(&tp, NULL); | |
const uint64_t now_ms = tp.tv_sec * 1000 + tp.tv_usec / 1000; | |
static uint64_t start_ms = 0; | |
if(start_ms==0) | |
{ | |
start_ms = now_ms; | |
} | |
return now_ms - start_ms; | |
} | |
uint32_t getSignal(uint32_t min, uint32_t max, uint32_t period_ms ) | |
{ | |
const uint32_t now_ms = getTime_ms(); | |
uint32_t value = min; | |
if ((now_ms%period_ms)>=(period_ms/2)) | |
{ | |
value = max; | |
} | |
return value; | |
} | |
void delay_ms(uint32_t ms) | |
{ | |
const uint32_t now_ms = getTime_ms(); | |
uint32_t deadline_ms = now_ms; | |
do | |
{ | |
deadline_ms = getTime_ms(); | |
} while(deadline_ms<=(now_ms+ms)); | |
} | |
void applyDampingFilter(rtDataType* rtData) | |
{ | |
if(rtData->target>rtData->measured) | |
{ | |
rtData->dampingCoeff -= rtData->dampingFactor; | |
} | |
else if (rtData->target<rtData->measured) | |
{ | |
rtData->dampingCoeff += rtData->dampingFactor; | |
} | |
else | |
{ | |
rtData->dampingCoeff = 0.0f; | |
} | |
rtData->measured = ((rtData->target-rtData->measured)/(100-rtData->dampingCoeff))*rtData->dampingCoeff + rtData->measured; | |
} | |
void show(const rtDataType* const rtData) | |
{ | |
printf("Target: %.2f # Damped PWM value: %.2f\n", rtData->target, rtData->measured); | |
} | |
int main() | |
{ | |
rtDataType rtData; | |
rtData.dampingFactor = 0.1f; | |
rtData.dampingCoeff = 0.0f; | |
rtData.measured = 2.5f; | |
while(1) | |
{ | |
rtData.target = getSignal(0, 5, 15000); | |
applyDampingFilter(&rtData); | |
show(&rtData); | |
delay_ms(50); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment