#include <TimerOne.h>
const int potPin = A0;
const int pwmPin = 9;
int maxSpeed= 1000; //RPM
int minSpeed = 10; //RPM
int Acceleration = 100; // RPM/s
int SteppsPerRound = 800;
//Initialisierung globaler Werte
int currentPeriod = minSpeed;
// Min- und Max-PWM-Frequenz berechnen
/* PWM-Pin = 9 (pwmPin)
duty-cyclet= 50% (512 von 0-1023)
period: F=1/T -> T=1/F; 800 steps/Round, 3000 round/min --> (800*3000)/60= 40kHz
=> T=1/40kHz= 25 micros
*/
float maxSpeedS=maxSpeed/1000.0;
float SteppsPerRoundS=SteppsPerRound/1000.0;
float maxPeriodF = (1.0/((maxSpeedS*SteppsPerRoundS)/60.0));
int maxPeriod = round(maxPeriodF);
float minSpeedS=minSpeed/1000.0;
float minPeriodF = (1.0/((minSpeedS*SteppsPerRoundS)/60.0));
int minPeriod = round(minPeriodF);
void setup() {
pinMode(pwmPin, OUTPUT);
Timer1.initialize(1000000/8); // Initialisiere TimerOne-Bibliothek; Abtastrate: 1/8 sekunde
Serial.begin(25000);
//Serial.println(maxPeriod);
}
void loop() {
// Potentiometerwert einlesen
int PotValue = analogRead(potPin);
int targetPeriod = map(PotValue, 0, 1023, minPeriod^2, maxPeriod^2);
//Serial.println(period);
if(PotValue < 5){
digitalWrite(pwmPin, HIGH);
}
else {
int needetSteps = ceil((targetPeriod - currentPeriod)/Acceleration);
if (needetSteps > 0){
for (int i=0; i<needetSteps; i++){
int start =micros();
int newPeriod = currentPeriod + Acceleration;
Timer1.pwm(pwmPin, 512, newPeriod);
currentPeriod = newPeriod;
int time = micros() - start;
Serial.println(time);
delay(40);
}
}
else if (needetSteps < 0){
for (int i=0; i>needetSteps; i--){
int newPeriod = targetPeriod - Acceleration;
Timer1.pwm(pwmPin, 512, newPeriod);
currentPeriod = newPeriod;
delay(40); //Delay der Funktion etwa 50 Mikrosek
}
}
else{
Timer1.pwm(pwmPin, 512, currentPeriod);
delay(40); // Kleine Verzögerung für Stabilität
}
}
//Timer1.pwm(pwmPin, 512, targetPeriod);
//delay(100); // Kleine Verzögerung für Stabilität
}