Hallo zusammen,
ich versuche seit einiger Zeit ein RC – PWM Signal über einen Arduino Nano zu einem Step- / Dir – Signal für eine Schrittmotorendstufe zu wandeln.
Leider komme ich nicht weiter, mein Verständniss reicht hierfür leider nicht aus. Meine Ergebnisse erzeugen entweder langsam laufende oder zuckelnde Motoren.
Die Maximale Pulsfrequenz für die Schrittsignale soll bei 40kHz liegen (maximal RPM) und im besten falle von nahe 0 bis 40kHz in stufen über das RC-Signal geregelt werden können.
Falls ich hier unmögliches versuche, wäre ein Hinweis nett.
Ich habe jetzt hier schon ein Stück Code mit dem ich den PWM – Pin auslese und unplausible Werte aussortiere. Das funktioniert soweit ich das über die serielle Schnittstele nachverfolgen kann auch schon ganz zuverlässig.
Nun möchte ich die Schrittsignale zum Motor senden aber mein Motor dreht entweder nicht oder nur sehr langsam.
Mit einem sehr einfachen Programm habe ich mal getestet ob der Motor überhaupt funktioniert und dabei auch gut Drehzahl zusammen bekommen.
Mein Code sieht aktuell so aus:
/*
#1 Controlling a Stepper Motor with a Remote Control and Arduino von: Brandon Tsuge
https://theboredrobot.com/blogs/blog/controlling-a-stepper-motor-with-a-remote-control-and-arduino
----------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------
#2 Tutorial for reading PWM non-blocking von: "heinduplessis"
https://forum.arduino.cc/t/tutorial-for-reading-pwm-non-blocking/479611
-----------------------------------------------------------------------------------------------------------------
*/
#define PWM_Pin 2
#define DIR 4
#define STEP 5
int lastPulseTime;
int pulseTime;
int channelValue;
int pulse_Lenght;
//Set up time variables for Stepper motor
unsigned long previousMotorTime = micros();
unsigned long MotorInterval = 0;
volatile long StartTime = 0;
volatile long CurrentTime = 0;
void setup() {
Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(PWM_Pin), Pulse, CHANGE);
}
void loop() {
//Serial.print("channelValue");
//Serial.println(channelValue);
//Serial.print("MotorInterval:");
//Serial.println(MotorInterval);
digitalWrite(STEP, LOW);
//Stepper motor speed, bigger MotorInterval is a slower speed.
if (channelValue >= 1450 && channelValue <= 1550) {
digitalWrite(STEP, LOW); //Motor doesn't move if the joystick is near the midpoint
} else if (channelValue < 1450) {
digitalWrite(DIR, LOW);
MotorInterval = map(channelValue, 1150, 1450, 0, 25); //map the RC signal to the motor speed in reverse when the joystick is pulled down
Serial.println(MotorInterval);
} else if (channelValue > 1550) {
digitalWrite(DIR, HIGH);
MotorInterval = map(channelValue, 1550, 1850, 25, 0); //map the RC signal to the motor speed when the joystick is pushed forward.
Serial.println(MotorInterval);
}
//check if the MotorInterval time has elapsed and step the motor.
unsigned long currentMotorTime = micros();
if (currentMotorTime - previousMotorTime > MotorInterval) {
digitalWrite(STEP, HIGH);
previousMotorTime = currentMotorTime;
}
}
void Pulse() {
lastPulseTime = pulseTime;
pulseTime = micros();
pulse_Lenght = pulseTime - lastPulseTime;
if ((pulse_Lenght > 1150) & (pulse_Lenght < 1850)) {
channelValue = pulse_Lenght;
}
}
Über einen Schubs in die richtige Richtung wäre ich Euch dankbar.
Schönes Wochennende zusammen!
Matt-Hias