www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik uC-Lösung gesucht für exakte Pulsausgabe


Autor: Joerg Rothe (marode)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

für ein Projekt muss ich zeitgenaue Pulse auf zwei Ausgängen ausgeben.
"Ohne" Jitter sollen "gleichzeitig" die Parameter der Pulse über eine 
serielle Schnittstelle verändert werden können.

Puls 1 an erstem Ausgang:
Pulsfrequenz einstellbar zwischen 1-2000Hz bei einer Auflösung von 1Hz.
Pulsbreite einstellbar zwischen 1-300us bei einer Auflösung von 1us.

Puls 2 an zweitem Ausgang:
Pulsbeginn 1-400us nach rising edge von Puls 1 bei einer Auflösung von 
1us.
Pulsbreite 0,1-10us bei einer Auflösung von 0.1 us.

Serielle Schnittstelle mit 115kBaud.

Ich bin auf der Suche nach einem geeigneten Device (muss nicht unbedingt 
ein uC sein), dass diese Aufgabe übernehmen kann und einer Taktik dazu.
Wichtige Kriterien abgesehen von Machbarkeit sind kleines Device, 
Eleganz, geringe Komplexität, möglichst kein Assemblercode und keine 
überteuerten Entwicklungstools, in dieser Reihenfolge.

Vielen Dank für hilfreiche Ideen,
Grüße
Jörg

PS.: im Anhang ein Bildchen, falls dass mit den Pulsdaten zu verwirrend 
ist.

Autor: Freddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was suchst du genau?
Schaltung, software, fertige Hardware, jemand der dir das baut?

Ich würde ein 8 Pin ATtiny + Hühnerfutter nehmen, das ganze dann in C 
programmieren. Sollte an einem Abend problemlos möglich sein.

Autor: Joerg Rothe (marode)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wollte eigentlich keine Bsp. reinschreiben, damit die Vorschläge 
nicht nur in eine Richtung gehen. Aber vielleicht hilft es ja auch.
Freddy, der erste Satz vom zweiten Teil deiner Antwort trifft fast genau 
das, was ich suche:
"Ich würde ein 8 Pin ATtiny + Hühnerfutter nehmen, das ganze dann in C 
programmieren."
Jetzt hätte ich gerne eine Taktik dazu. Z.B Lass den ersten Puls durch 
eine Timerinterruptroutine erzeugen und dann... ausserdem die serielle 
Schnittstelle hat dann und dann Zeit zu empfangen ...

Meine Ideen waren:
- kleines FPGA (hab ich keins gefunden, mit wenig Pins und trotzdem 
genug Gates)

- bei kurzen Zeiten (0,1 - 10us) komme ich wohl um Schleifen und 
Assemblercode zählen nicht herum, bei grösseren Zeiten sollte ich ja 
Interrupts verwenden, damit Zeit bleibt für die serielle Schnittstelle

- Atmel/PIC Zeugs und Interrupts/Schleifen (ich glaube die Rechenzeit 
reicht nicht aus bei 20 MHZ mit den angegebenen Werten)

- Renesas R8C13 schöner Chip aber gleiches Problem

- Arm LPC2101 intern mit PLL ich glaub bis 75MHz Takt = mehr Luft

- Parallax Propeller: verteilen der einzelnen Aufgaben in verschiedene 
Cogs, allerdings hab ich noch nichts mit dem Chip gemacht und es gibt 
eine eigene Sprache (Spin) oder so.

Tja vielleicht hat jemand noch andere Vorschläge oder weiß, dass es mit 
den oben genannten Vorschlägen so und so machbar ist.

Vielen Dank.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein kleiner CPLD macht das locker. Ggf. muss man einen kleinen 
Mikrocontroller nehmen um die Kommunikation mit RS232 zu machen.

MFG
Falk

Autor: Tippgeber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guck dir doch mal die MSP430 an.
Die sind quasi Timer mit nem Rechenwerk dran :-)

Autor: Joerg Rothe (marode)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist das ganze mit Timer/PWM/Compare Dingen zu lösen?
z.B. mit mehreren Match Registern (LPC2101) und dann die Ausgänge 
vergattern?
Dann wäre der uC unbelastet.
Oder vielleicht geht es noch einfacher.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Joerg Rothe (marode)

>ist das ganze mit Timer/PWM/Compare Dingen zu lösen?
>z.B. mit mehreren Match Registern (LPC2101) und dann die Ausgänge
>vergattern?

Ist eine Lösung. Dann braucht man aber 4 Output Compare Einheiten für 
zwei Signale, eins zum setzen, eins zum Löschen. Ein D-FlipFlop sollte 
reichen, 74HC74, das sind sogar zwei drin.

>Dann wäre der uC unbelastet.

Ja.

>Oder vielleicht geht es noch einfacher.

Wüsste ich im Moment nicht.

MFG
Falk

Autor: GRA (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, mit einem uC geht das nicht. Zumindest waehrend der Kommunikation 
mit dem PC oder so waere das Timing futsch. Ob man das Timing nun mit 
74HCxxx oder einem CPLD macht ist fast einerlei. Das CPLD ist viel 
teurer (3Euro vs Cents), dafuer viel kompakter (TQFP44 vs N x SSOP) und 
flexibler.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ GRA (Gast)

>Nein, mit einem uC geht das nicht. Zumindest waehrend der Kommunikation
>mit dem PC oder so waere das Timing futsch. Ob man das Timing nun mit

Quark. Die Output Compare Einheiten laufen unabhängig von der CPU. Bei 
hohen Pulswiderholraten werden die einmal konfiguriert und laufen 
autonom, da kann die CPU machen was sie lustig ist. Wenn längere 
Pulszeiten nötig sind und die CPU aushelfen müsste geht das auch, dann 
kann man mit geschicker Programmierung OHNE Interrupts nebenbei auch den 
UART pollen.

>74HCxxx oder einem CPLD macht ist fast einerlei. Das CPLD ist viel

Kaum. Ein CPLD ist eine Einchiplösuung, mit HC & Co wirds ein 
mittelgrosses TTL-Grab.

MFG
Falk

Autor: Joerg Rothe (marode)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank für die Vorschläge, hier mal der Weg, den ich einschlagen 
werde:

Zutaten:
- LPC2101
- davon ein 32-bit Timer
- 1 Match Register löscht den Timer Counter, am Ende der Periode
- 1 Match Register mit Ausgangspin startet High und geht dann Low bei 
erreichen der Pulsbreite des ersten Pulses
- 1 Match Register wechselt einen Ausgang auf High bei erreichen des 
Delays
- 1 Match Register wechselt einen Ausgang von High auf Low bei erreichen 
des Delays+Pulsbreite des zweiten Pulses
- die letzten beiden Match Register Pinausgänge werden noch verundet und 
fertig
- die volle CPU steht für die serielle Schnittstelle und SPI das ich 
noch vergessen habe zur Verfügung

Wenn das hier Blödsinn ist, bitte ich um einen Aufschrei.
Vielen Dank
lg
Jörg

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Joerg Rothe (marode)

>- LPC2101

Naja, ziemlichr Overkill. OK, der hat viele Compare Units.

>Wenn das hier Blödsinn ist, bitte ich um einen Aufschrei.

Prinzipiell sollte das laufen. Aber dafür nen 32 Bit Prozessor? Hmmm.

MfG
Falk

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein MSP430 wäre wirklich ziemlich gut. Z.B. der F169 hat einen Timer A 
mit 3 Compare-Registern/Ausgängen, der Timer B ist auch noch drin, und 
hat nochmal 7 Compare-Einheiten, die man sehr gut zusammenschalten kann. 
Alle Compare-Einheiten lassen sich direkt auf einen Ausgang des µC 
legen. Kostet wenig, Entwicklungstools sind preisgünstig, Beispiele 
gibts massig im Netz und die CPU langweilt sich, nachdem sie die die 
Register eingestellt hat. Die Erzeugung der Impulse läuft völlig autonom 
ab.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir mal die AT90PWM Serie von Atmel an, dort kannst du über die 
Powerstages flickerfreien PWM erzeugen, ohne Rechenleistung der CPU zu 
verlieren, die PWM´s der Power Stage laufen bis zu 64 MHZ. Quarz ist 
keiner notwendig, da sich der Controller über den kallibrierten 1 Mhz 
Resonator die 64 MHz über ne PLL erzeugt und anschliessend für den CPU 
Takt auf 16MHz wieder runterteilen kann.

Eine Powerstage besteht im Prinzip aus 4 hintereinandergeschalteten PWM 
Zählern, immer wenn einer abgelaufen ist fängt automatisch der nächste 
an, daran gekoppelt sind dann direkt zwei Ausgangsregister, welche den 
Zählern zugeordnet sind. Schau dir am besten mal das Datenblatt an.


Kleines Beispiel


Zähler 1 macht die Impulslänge
Zähler 2 macht den Versatz zum 2 Ausgang (Totzeit)
Zähler 3 mAcht die Impulslänge des 2 Ausgangs
Zähler 4 die Zeit bis zum nächsten Impuls



und das ganze dann noch 2-3 mal je nach Controller


Hier der code unter Nutzung der atmel avr Bibliotheken:

Psc0_use_64_mega_pll_clock();

Psc0_outputs_active_high();

Psc0_in_4_ramps_mode();

Init_psc0_all_compare_values(zähler1,zähler2, zähler3, zähler4)

Enable_pscout00();

Enable_pscout01();

Start_psc();


Nebenbei kannst du noch über nenEingang oder über nen Analog Comparator 
nen Not Aus vorsehen.

Lösung sieht dann wie folgt aus

5 Volt Spannungsregler

µC z.B. AT90PWM3

232 Konverter für die serielle Schnittstelle

ein paar C´s und R´s

Ausgangstufe

zusammen keine 10 Euro und fast kein Platz

Benutze den AT90PWM3  für ein Schaltreglerdesign und programmiere ihn in 
C. Nebenbei kommuniziert er noch mit 115200 Baud mit dem PC, da die 
Power Stages ohne Rechenleistung arbeiten

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.