PWM In, Pulse Out

Hallo,

für eine kleine Motorsteuerung muss ich folgendes Projekt umsetzen:

In den Arduino geht ein Pin mit einer PWM hinein und wird ausgewertet. An einem Ausgang soll ein Puls von 105.000hz erzeugt werden.

Nun meine Frage: Wie erzeuge ich einen Plus von 105.000hz mit dem Arduino ? Eine fertige Funktion dafür habe ich nicht gefunden!

Wie genau müssen die 105 kHz denn sein? Sollen die tatsächlich fest bleiben oder sich abhängig von der angelegten PWM ändern?

Hallo,

abhängig von der PWM. 105kHz sind das Maximum

Ich habe nicht verstanden was Du haben willst.
Ein Impuls hat keine Frequenz sondern nur eine Dauer.
Meinst Du eine Rechteckspannung mit mindestens 105kHz?
Welchen Frequenzbereich willst Du in Abhängigkeit von dem PWM-Signal haben?

Grüße Uwe

Hallo,

also der Bereich ist von 1hz bis zu 105kHz - Die Motorendstufe bekommt diese Werte.

Du beliebst zu Scherzen?

? Wieso ? :stuck_out_tongue:

Jedoch ist 1hz schwachsinn, sorry!

Also hier nochmal meine Denkweise:

// 6400 * 500 / 60 = 53333 hz = 500u/min
// 6400 / 60 = 106,66 hz = 1u/min

6400 = Schritte pro Umdrehung

nitromethan:
? Wieso ? :stuck_out_tongue:

Jedoch ist 1hz schwachsinn, sorry!

Also hier nochmal meine Denkweise:

// 6400 * 500 / 60 = 53333 hz = 500u/min
// 6400 / 60 = 106,66 hz = 1u/min

6400 = Schritte pro Umdrehung

Was ist das für ein Motor? Welche Motorendstufe hast Du?
Grüße Uwe

Diese Endstufe:

http://www.cnc-spezialist.de/leadshine-schrittmotortreiber-m542-p-294-1.html

Zum Motor habe ich gerade keine Angabe :blush:

Ok, jetzt wissen wir wozu das Rechtecksignal nutze ist. Woher kommt das PWM-Signal?
Grüße Uwe

Aus einem RC-Empfänger, also eher PPM als PWM, den Teil habe ich allerdings schon. Wichtig ist, dass ich den Motor einmal 1u/min drehen lasse und einmal 500 u/min. Alles andere kann ich ja runterteilen.

ok; also PPM-Signal mit einem Pulsweite von 1 bis 2 mS.
Jetzt noch was: soll die Übertragungsfunktion PPM zu fstep linear sein?
1mS 1U/min
2mS 500U/min
1,5mS 250U/min?

Ja!

Das PPM-Signal kannst Du mit
pulseIn(pin, HIGH,21000)
einlesen.
Die Ausgabe einer Frequenz ist am einfachsten mit einem Timer zu realisieren, wobei ich Dir aber nicht helfen kann; ich bin selbst nicht sattelfest bei den Timern.
Irgendjemand wird schon antworten.
Grüße Uwe

Wie gesagt PPM In hab ich schon, dass ist nicht das Problem. Probleme hab ich beim Output :slight_smile:

Ein Rechtecksignal kannst du mithilfe von Interrupts machen.
Bei jedem Interrupt musst du dann den Zustand vom Pin ändern.

ISR (TIMER2_COMPA_vect)
{
  PORTB ^= (0x01 << 3); // Pin 3 am PORTB toggelt seinen Zustand bei jedem Interrupt
}

Den Timer musst du abhängig von deinem PPM-Signal konfigurieren. Zu beachten ist dass, das Rechteck-Signal die halbe Frequenz von der Interrupt-Frequenz hat.

Falls du einen UNO hast, kannst du hier lernen wie man die Timer konfiguriert.
https://sites.google.com/site/qeewiki/books/avr-guide/timers-on-the-atmega328

Grüße,
J3RE

Hallo,
hier mal ein Beispiel, wie man einen 16Bit Timer beim Arduino Mega dazu nutzen kann einen 56kHz Rechteck zu erzeugen.

// Testprog zur Ansteuerung der Counter Register des Arduino Mega
// ich nutze OC5B an Mega2560 Chip Pin39 (PL4) - dieser Pin geht auf Arduino Mega Pin45

#define PIN_IR 45

void setup() {
  pinMode(PIN_IR, OUTPUT);

  // WGM53:0 = 0100  WGM53 WGM52 WGM51 WFGM50
  // COM5A1:0 = 01   COM5A1 COM5A0
  // CS50 = 1 - no prescaling 16MHz
  // TCCR5A -  COM5A1 COM5A0 COM5B1 COM5B0 COM5C1 COM5C0 WGM51 WGM50
  // TCCR5B -  ICNC5  ICES5  xxxx   WGM53  WGM52  CS52   CS51  CS50

  TCCR5A = 0;
  TCCR5B = 0;  
  TCCR5A = B00010000;
  TCCR5B = B00001001; //no prescalering   WGM53  WWGM52  CS50
  OCR5A = 142; //count to 287 (16MHz/2*(1+142)=56 kHz)
}

void loop() {
}