Für solche Fälle immer einen Kurzsketch zum testen nehmen.
// Forensketch
// https://forum.arduino.cc/
#include <Streaming.h> // https://github.com/janelia-arduino/Streaming
const uint8_t pwmPin = 2;
uint8_t pwm;
const uint32_t intervall = 500;
uint32_t lastmillis;
void setup()
{
Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
delay(300);
#endif
Serial << (F("\r\nStart...\r\n")) << endl;
}
void loop()
{
if (millis() - lastmillis > intervall)
{
lastmillis += intervall;
pwm++;
analogWrite(pwmPin, pwm);
}
}
Achtung: Da kommt es zu einem beabsichtigtem Überlauf von pwm.
Du kannst unter dem pwm++ auch gerne eine Ausgabe auf dem SerMon machen.
Matt-Hias:
Ich dachte nämlich, dass ein PWM - Signal bei 100% duty-cycle immer 1 ist und bei 0% immer 0 ist.
Das ist aber wohl nicht so?
Nein. Ein RC Signal ist nicht PWM.
hast du wohl übersehen.
Ich bin da kein Experte, kann das jemand bestimmen worum es sich handelt?
Was es auch ist, es hat eine "Trägerfrequenz" von 50Hz (20ms) und einer Pulsdauer von 1,1ms bis 1,9ms.
Hast Du irgendwo eine Erklärung wie ich die Signale voneinander unterscheiden kann?
Ich finde nix gescheites.
Die Pulsdauermodulation – kurz PDM (englisch pulse duration modulation); auch Pulslängenmodulation (PLM), Pulsbreitenmodulation (PBM), Pulsweitenmodulation (PWM; abgelehnt in IEC 60050, auch englisch) und Unterschwingungsverfahren genannt – ist eine Modulationsart, bei der eine technische Größe (z. B. elektrische Spannung) zwischen zwei Werten wechselt. Dabei wird bei konstanter Frequenz der Tastgrad eines Rechteckpulses moduliert, also die Dauer der ihn bildenden Impulse.
Ein reines pulsdauerm...
Und bei Wikipedia wird es eher verwirrender.
fony
August 6, 2023, 3:07pm
45
Zumindest ist es ein sehr spezielles. Es ist ein PWM-Signal mit 50Hz Basisfrequenz, bei dem der duty-cycle nur zwischen (nominal) 5% und 10% schwankt. Das Besondere ist auch, dass die absolute Pulsweite ( 1ms...2ms ) und nicht der duty-cycle für die Steuerung entscheidend ist - zumindest in einem gewissen Bereich der Basisfrequenz. So gesehen ist der Name 'Pulsweitenmodulation' eigentlich schon richtig .
Es funktioniert letztendlich aber eben doch anders als ein 'übliches' PWM-Signal für Led's oder Motore, bei denen der duty-cycle entscheidend ist und nicht die absolute Pulsweite.
combie
August 6, 2023, 3:23pm
48
Das kannst du ändern.
Das ist keine Entschuldigung für nicht gemachte Hausaufgaben.
Tipp:
Es ist immer gut, wenn man weiß was man tut und damit anrichtet.
Ohne Wissen, kein Folgen abschätzen, kein verlässlicher Erfolg.
Das ist die Arduino Referenz!
Du findest es in der C++ Reference.
https://en.cppreference.com/w/cpp/types/integer
combie
August 6, 2023, 3:25pm
49
Darum heißt es ja auch PPM und nicht PWM.
Ähnlichkeiten mag es geben.
(Aber was ist schon ein Vergleich, wenn er nicht hinkt....)
So wie in dem Testcode von Dir hier, hab ich ein PWM-Signal erwartet. Was sich aber als nicht richtig erwiesen hat.
Man lernt nie aus..
Ich habe verstanden, beides ist ein PWM - Signal.
PPM ist aber wieder etwas anderes. Das ist das Signal aus dem Receiver, in dem alle Kanäle in einem Signal ( mit 0,4ms Impulsen ) übertragen werden. Daraus müssen dann erst die üblichen 1..2ms Signale für die einzelnen Servos/Kanäle erzeugt werden. Vielleicht hilft ja das hier .
kolaha
August 6, 2023, 3:46pm
53
habe noch'n Fehler beseitigt. Pin 3 mit Oszi prüfen, Pin 13 zeigt DIR Zustand.
#define PWM_Pin 2
#define DIR 4
#define STEP 5
volatile uint32_t lastPulseTime = 0;
volatile uint32_t pulse_Lenght;
void setup() {
//Serial.begin(115200);
attachInterrupt(digitalPinToInterrupt(PWM_Pin), Pulse, CHANGE);
for (byte i = 3; i < 6; i++)pinMode(i, OUTPUT);
pinMode(13, OUTPUT);
}
void Pulse() {
if (digitalRead(PWM_Pin))lastPulseTime = micros();
else pulse_Lenght = micros();
}
void loop() {
const int Mitte = 1500;
static int channelValue = 0;
static unsigned long previousMotorTime = 0;
static unsigned long MotorInterval = 0xFFFFFFFF;
//Serial.print("channelValue");
//Serial.println(channelValue);
//Serial.print("MotorInterval:");
//Serial.println(MotorInterval);
noInterrupts();
channelValue = int(pulse_Lenght - lastPulseTime) - Mitte ;
interrupts();
analogWrite(3, (channelValue / 4) + 127);
digitalWrite(DIR, channelValue >= 0);
digitalWrite(13, channelValue >= 0);
if (abs(channelValue) > 5)MotorInterval = 6000000 / (channelValue* channelValue);
else MotorInterval = 0xFFFFFFFF;
if (micros() - previousMotorTime >= MotorInterval) {
digitalWrite(STEP, !digitalRead(STEP));
previousMotorTime = micros();
}
delay(10);
}
kolaha
August 6, 2023, 4:02pm
54
or even better
#define PWM_Pin 2
#define DIR 4
#define STEP 5
volatile uint32_t lastPulseTime = 0;
volatile uint32_t pulse_Lenght;
void setup() {
Serial.begin(115200);
for (byte i = 3; i < 6; i++)pinMode(i, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
const int Mitte = 1500;
static int channelValue = 0;
static unsigned long previousMotorTime = 0;
static unsigned long MotorInterval = 0xFFFFFFFF;
channelValue = (int(pulseIn(PWM_Pin, HIGH)) - Mitte) ;
Serial.print("channelValue ");
Serial.println(channelValue);
analogWrite(3, channelValue / 4 + 127);
digitalWrite(DIR, channelValue >= 0);
digitalWrite(13, channelValue >= 0);
if (abs(channelValue) > 5)MotorInterval = 6000000 / (#define PWM_Pin 2
#define DIR 4
#define STEP 5
volatile uint32_t lastPulseTime = 0;
volatile uint32_t pulse_Lenght;
void setup() {
Serial.begin(115200);
for (byte i = 3; i < 6; i++)pinMode(i, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
const int Mitte = 1500;
static int channelValue = 0;
static unsigned long previousMotorTime = 0;
static unsigned long MotorInterval = 0xFFFFFFFF;
channelValue = (int(pulseIn(PWM_Pin, HIGH)) - Mitte) ;
Serial.print("channelValue ");
Serial.print(channelValue);
digitalWrite(DIR, channelValue >= 0);
if (abs(channelValue) > 5)MotorInterval = 6000000 / (channelValue * #define PWM_Pin 2
#define DIR 4
#define STEP 5
volatile uint32_t lastPulseTime = 0;
volatile uint32_t pulse_Lenght;
void setup() {
Serial.begin(115200);
for (byte i = 3; i < 6; i++)pinMode(i, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
const int Mitte = 1500;
static int channelValue = 0;
static unsigned long previousMotorTime = 0;
static unsigned long MotorInterval = 0xFFFFFFFF;
channelValue = (int(pulseIn(PWM_Pin, HIGH)) - Mitte) ;
Serial.print("channelValue ");
Serial.print(channelValue);
digitalWrite(DIR, channelValue >= 0);
if (abs(channelValue) > 5)MotorInterval = 6000000 / (channelValue * channelValue);
else MotorInterval = 0xFFFFFFFF;
Serial.print("\tMotorInterval:");
Serial.println(MotorInterval);
if (micros() - previousMotorTime >= MotorInterval) {
digitalWrite(STEP, !digitalRead(STEP));
previousMotorTime = micros();
}
delay(10);
});
else MotorInterval = 0xFFFFFFFF;
Serial.print("\tMotorInterval:");
Serial.println(MotorInterval);
if (micros() - previousMotorTime >= MotorInterval) {
digitalWrite(STEP, !digitalRead(STEP));
previousMotorTime = micros();
}
delay(10);
}* MotorInterval);
else MotorInterval = 0xFFFFFFFF;
Serial.print("MotorInterval:");
Serial.println(MotorInterval);
if (micros() - previousMotorTime >= MotorInterval) {
digitalWrite(STEP, !digitalRead(STEP));
previousMotorTime = micros();
}
delay(10);
}
kolaha:
delay(10);
???
Und warum sehe ich da soviele magische Zahlen?
Da kommt auf Pin A3 ein PWM-Signal mit 2ms Periodendauer raus. Das Signal reagiert recht flott auf Eingaben allerdings ist es falsch "formatiert", da ich eine variable Periodenfrequenz (bis 40kHz) benötige.
kolaha
August 6, 2023, 4:31pm
57
Matt-Hias:
Pin A3
meinste Pin D3? da soll nur PWM zum Anschauen, ob Input richtig ist.
40kHz sollen am STEP Pin, Pin D5 erzeugt werden. ist da was?
Auf A3 kann ich das Eingangssignal sehen, auf D3 sehe ich kein Signal, auf D5 kommt das im Anhang raus.
Anfang des Videos:
Mittelstellung, dann maximaler Linksausschlag (RC-Funke); bis Signal vollständiger Bildschirm, dann nochmal Mittelstellung; dann Maximal Rechtsausschlag . - Hoffe das ist verständlich
kolaha
August 6, 2023, 4:59pm
59
ich versteh nicht was hat A3 damit zu tun und auch nicht wieso Step Pin(D5) zeigt das was eigentlich am "PWM_Pin"(D2) sein soll. Sketch von welchem Post hast du gerade drin?
ist das das alte Video von Post#34 ?
Am D5 „STEP“ Pin kommt das Signal im Anhang von Post58 raus.
A3 spiegelt in etwa DI2 und D3 macht nichts.