#include <stdio.h>
#include <math.h>
#define M_PI 3.1415
#define uint32_t int
#define int32_t int
#define KROK 0.1//mm
#define STEPS_PER_MM (1 / KROK) // 10 kroków na 1 mm
#define MAX_STEPS_PER_MS 4
uint32_t CheckMaxWysuwLen(uint32_t L, uint32_t T);
uint32_t L = 180;//mm
uint32_t T = 1400;//ms
uint32_t tim = 0;
int main(void) {
tim = CheckMaxWysuwLen(L, T);
//printf("%d \n", tim);
if (tim
> T
) printf("OK %d \n", tim
); else printf("Za duży wysuw %d \n", tim
);
return 0;
}
uint32_t CheckMaxWysuwLen(uint32_t L, uint32_t T)
{
float position;
uint32_t steps;
uint32_t currentPosition = 0;
uint32_t targetPosition;
int32_t delta;
int t;
for (t = 0; t <= T; t++)
{
position
= (L
/ 2) * (sin((2.0 * t
/ T
) * M_PI
- M_PI
/2) + 1); steps = roundf(position * STEPS_PER_MM);
targetPosition = steps;
delta = targetPosition - currentPosition;
//printf("delta=%d t=%d \n", delta, t);
if( abs(delta
) > MAX_STEPS_PER_MS
) {
break;
}
currentPosition = targetPosition;
}
return t;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojZGVmaW5lIE1fUEkgMy4xNDE1CiNkZWZpbmUgdWludDMyX3QJaW50CiNkZWZpbmUgaW50MzJfdAlpbnQKI2RlZmluZSBLUk9LCTAuMS8vbW0KI2RlZmluZSBTVEVQU19QRVJfTU0JKDEgLyBLUk9LKSAgLy8gMTAga3Jva8OzdyBuYSAxIG1tCiNkZWZpbmUgTUFYX1NURVBTX1BFUl9NUyAgNCAKCnVpbnQzMl90IENoZWNrTWF4V3lzdXdMZW4odWludDMyX3QgTCwgdWludDMyX3QgVCk7Cgp1aW50MzJfdCBMID0gMTgwOy8vbW0KdWludDMyX3QgVCA9IDE0MDA7Ly9tcwoKdWludDMyX3QgdGltID0gMDsKCmludCBtYWluKHZvaWQpIHsKCQoJdGltID0gQ2hlY2tNYXhXeXN1d0xlbihMLCBUKTsKCQoJLy9wcmludGYoIiVkIFxuIiwgdGltKTsKCWlmICh0aW0gPiBUKSBwcmludGYoIk9LICVkIFxuIiwgdGltKTsKCWVsc2UgcHJpbnRmKCJaYSBkdcW8eSB3eXN1dyAlZCBcbiIsIHRpbSk7CgkKCXJldHVybiAwOwp9Cgp1aW50MzJfdCBDaGVja01heFd5c3V3TGVuKHVpbnQzMl90IEwsIHVpbnQzMl90IFQpCnsKCWZsb2F0IHBvc2l0aW9uOwoJdWludDMyX3Qgc3RlcHM7Cgl1aW50MzJfdCBjdXJyZW50UG9zaXRpb24gPSAwOwoJdWludDMyX3QgdGFyZ2V0UG9zaXRpb247CglpbnQzMl90IGRlbHRhOwoJaW50IHQ7CgkKCWZvciAodCA9IDA7IHQgPD0gVDsgdCsrKSAKCXsKCSAgICBwb3NpdGlvbiA9IChMIC8gMikgKiAoc2luKCgyLjAgKiB0IC8gVCkgKiBNX1BJIC0gTV9QSS8yKSArIDEpOwoJICAgIHN0ZXBzID0gcm91bmRmKHBvc2l0aW9uICogU1RFUFNfUEVSX01NKTsKCSAgICB0YXJnZXRQb3NpdGlvbiA9IHN0ZXBzOwoJICAgIGRlbHRhID0gdGFyZ2V0UG9zaXRpb24gLSBjdXJyZW50UG9zaXRpb247CgkgICAgLy9wcmludGYoImRlbHRhPSVkIHQ9JWQgXG4iLCBkZWx0YSwgdCk7CgkgICAgaWYoIGFicyhkZWx0YSkgPiBNQVhfU1RFUFNfUEVSX01TKQoJICAgIHsKCSAgICAJYnJlYWs7CgkgICAgfQoJICAgIGN1cnJlbnRQb3NpdGlvbiA9IHRhcmdldFBvc2l0aW9uOwoJfQoJcmV0dXJuIHQ7Cn0=