#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
//const uint32_t Lmax = 2; //mm
const float Lmax = 64;//42; //mm
uint32_t T = 500;//330; //ms
// Tablica przechowująca pozycje (w mm) dla każdej milisekundy
float positions[1000+1]; // 0-1000 ms
uint32_t steps[1000+1]; // 0-1000 ms
int32_t stepsToMove[1000+1]; // 0-1000 ms
int32_t stepsToMoveLimit[1000+1]; // 0-1000 ms
int32_t stepsToMovePamiec = 0;
const uint32_t maxStepsPerMs = 4;//1000 / MIN_ODSTEP_MIEDZY_KOLEJNYMI_IMPULSAMI_US;
uint32_t currentPosition = 0;
uint32_t targetPosition = 0;
int32_t delta = 0;
//uint32_t stepsToMove = 0;
// for(int k=0; k<20; k++){
// Inicjalizacja tablicy przechowującej pozycje (w mm) dla każdej milisekundy
int t = 0;
int main(void)
{
for (t = 0; t <= T; t++) {
positions
[t
] = (Lmax
/ 2) * (sin((2.0 * t
/ T
) * M_PI
- M_PI
/2) + 1); steps[t] = roundf(positions[t] * STEPS_PER_MM);
targetPosition = steps[t];
delta = targetPosition - currentPosition;
if( abs(delta
) > maxStepsPerMs
) {
break;
if( delta > 0)
{
stepsToMove[t] = maxStepsPerMs;
}
else
{
stepsToMove[t] = -1 * maxStepsPerMs;
}
}
else
{
stepsToMove[t] = delta;
}
// Generuj impulsy
//for (int i = 0; i < abs(stepsToMove[t]); i++) {
// // Ustaw kierunek
// if( stepsToMove[t] > 0)
// {
// SerwoDirUp(&Serwo1);
// }
// else
// {
// SerwoDirDown(&Serwo1);
// }
// SerwoImpSet(&Serwo1);
// TurnOnLedSys();
// TurnOffLedSys();
// SerwoImpReset(&Serwo1);
// TurnOnLedSys();
// TurnOffLedSys();
//}
// digitalWrite(PULSE_PIN, HIGH);
// delayMicroseconds(50); // Minimalny czas trwania impulsu
// digitalWrite(PULSE_PIN, LOW);
// delayMicroseconds(50);
// }
stepsToMoveLimit[t] = stepsToMove[t] + stepsToMovePamiec;
stepsToMovePamiec = stepsToMoveLimit[t];
currentPosition = stepsToMoveLimit[t];//targetPosition;
}
}