uC/IC mit 16 PWM-IN gesucht

T

Thomas Matern

Guest
Hi,

fuer eine Modellbauanwendung suche ich einen ľC oder
einen IC der die Pulsbreiten von mindestens 16 Empfaenger-
Kanaelen messen kann. Die Pulsfrequenz betraegt 50-100Hz,
der zu messende "1"-Zustand liegt zwischen 1 und 2 ms
(typischer Servo-Impuls).

Die Aufloesung muss mindestens 8 Bit betragen, 10 oder
12 Bit waeren schoener.

Falls ľC: es muessen gleichzeitig noch 8 PWM-Ausgaenge
angesteuert werden (kann auch per Software laufen, es
muessen nur die PINs reichen).

In einem aelteren Projekt benutzte ich einen AVR mit einem
16->1 Mux am CC-Eingang. Damals ging das, weil die
Pulse auf allen 16 Leitungen nacheinander in fester Reihenfolge
ankamen (also niemals 2 Kanaele gleichzeitig aktiv waren).
Diesesmal kann die zeitliche Abfolge der Pulse jedoch stark
variieren (im Extremfall beginnen alle Pulse gleichzeitig).
Alle Kanaele nacheinander zu betrachten und nur jeden
16. Impuls auszuwerten geht auch nicht -> viel zu traege.

Interner FLASH, EEPROM, SRAM (wie bei AVRs) waere sehr von
Vorteil, aber nicht zwingend notwendig. Wichtiger waeren
Stabilitaet, Preis und Verfuegbarkeit. Ein PC-taugliches
Interface (seriell, asynchron) waere sehr von Vorteil.

Wer hat hier eine Idee?

Thx, bye
Thomas
 
Thomas Matern wrote:

In einem aelteren Projekt benutzte ich einen AVR mit einem
16->1 Mux am CC-Eingang. Damals ging das, weil die
Pulse auf allen 16 Leitungen nacheinander in fester Reihenfolge
ankamen (also niemals 2 Kanaele gleichzeitig aktiv waren).
Habe momentan das gleiche Problem, aber mit DutyCycle. Habe das wie folgt
gelöst:
Die Einzelnen Impulse hängen an sowohl den PORTs A und C des AVRs als auch
an einem großen XOR Gatter das am INTn hängt. Sobald sich irgendein
Signalpegel ändert -> Interrupt.
Die Interruptroutine kopiert als erstes den Stand des Zählers und liest
anschliessend die beiden Ports ein. Dann wird mit dem alten Stand
verglichen (XOR) und für jede Signalleitung auf der Sich was getan hat, die
entsprechende Variable inkrementiert.

Wolfgang
 
Thomas Matern schrieb:
Hi,

fuer eine Modellbauanwendung suche ich einen ľC oder
einen IC der die Pulsbreiten von mindestens 16 Empfaenger-
Kanaelen messen kann. Die Pulsfrequenz betraegt 50-100Hz,
der zu messende "1"-Zustand liegt zwischen 1 und 2 ms
(typischer Servo-Impuls).

Die Aufloesung muss mindestens 8 Bit betragen, 10 oder
12 Bit waeren schoener.
Für 8-Bit mußt du 256-fach überabtasten. D.h. du brauchst bei 1ms (1kHz)
Impulszeit eine Abtastfrequenz von 256kHz und das auf 16-Kanälen. Wenn
man mal von 4 Takten pro Abtastung ausgeht (dafür muß man wohl
handoptimierten Assembler rannehmen) reicht dafür ein AVR mit 16MHz
nicht aus.

Falls ľC: es muessen gleichzeitig noch 8 PWM-Ausgaenge
angesteuert werden (kann auch per Software laufen, es
muessen nur die PINs reichen).
Und jetzt sowieso nicht mehr.

In einem aelteren Projekt benutzte ich einen AVR mit einem
16->1 Mux am CC-Eingang. Damals ging das, weil die
Pulse auf allen 16 Leitungen nacheinander in fester Reihenfolge
ankamen (also niemals 2 Kanaele gleichzeitig aktiv waren).
Diesesmal kann die zeitliche Abfolge der Pulse jedoch stark
variieren (im Extremfall beginnen alle Pulse gleichzeitig).
Alle Kanaele nacheinander zu betrachten und nur jeden
16. Impuls auszuwerten geht auch nicht -> viel zu traege.
Ich würde in Richtung CPLD/FPGA gehen und per Hardware abtasten. Die
Ergebnisse dieser Abtastung kannst du dann in Ruhe mit einem AVR
auswerten der dann die PWM's macht.

Sollte ich mich irgendwo in meiner Größenordnungsabschätzung vertan habe
bitte ich um Korrektur.

--
Matthias Weißer
matthias@matwei.de
http://www.matwei.de
 
Hi,

Die Aufloesung muss mindestens 8 Bit betragen, 10 oder
12 Bit waeren schoener.

Für 8-Bit mußt du 256-fach überabtasten. D.h. du brauchst bei 1ms (1kHz)
Impulszeit eine Abtastfrequenz von 256kHz und das auf 16-Kanälen. Wenn
man mal von 4 Takten pro Abtastung ausgeht (dafür muß man wohl
handoptimierten Assembler rannehmen) reicht dafür ein AVR mit 16MHz
nicht aus.
Die Taktfrequenz liegt unter 100 Hz. Das Signal besteht aus einem
langen Low- und einem kurzen High-Anteil. Nur die Laenge des
High-Anteils spielt eine Rolle. Gesucht ist also ein uC/IC mit Timer,
der bei steigender Flanke den Zaehler startet und bei fallender
Flanke den Zaehler stoppt und einen IRQ generiert.

Das die Abtastung nicht in Software geht, war mir schon vorher klar.

Falls ľC: es muessen gleichzeitig noch 8 PWM-Ausgaenge
angesteuert werden (kann auch per Software laufen, es
muessen nur die PINs reichen).

Und jetzt sowieso nicht mehr.
Das verbraucht keine CPU-Zeit. Die Pulse werden nacheinander
von einem einzigen Timer-IRQ generiert - entweder mit einem
externen Schieberegister oder per Software mit einem 8Bit-Port.

Ich würde in Richtung CPLD/FPGA gehen und per Hardware abtasten. Die
Ergebnisse dieser Abtastung kannst du dann in Ruhe mit einem AVR
auswerten der dann die PWM's macht.
Zu teuer, zu aufwaendig und (ggf.) zu traege.

Thx, bye
Thomas
 
Hi,

Die Einzelnen Impulse hängen an sowohl den PORTs A und C des AVRs als auch
an einem großen XOR Gatter das am INTn hängt. Sobald sich irgendein
Signalpegel ändert -> Interrupt.
Die Idee hatte ich auch schon. Ich hoffte jedoch, dass es einen
kleinen IC oder einen schicken uC gibt, der soetwas direkt kann.

Mein Problem ist, dass sich alle Eingaenge gleichzeitig aendern
koennen, daher wird die Aenderungserkennung etwas komplexer aber
nicht unmoeglich.

Thx, bye
Thomas
 
Thomas Matern schrieb:

Mein Problem ist, dass sich alle Eingaenge gleichzeitig aendern
koennen, daher wird die Aenderungserkennung etwas komplexer aber
nicht unmoeglich.
Komplex ist sie nicht grade:

Signal=0 -> Zähler raufzählen,
Signal=0->1 -> Wert abspeichern Zähler Nullsetzen
Und das entweder als loop über ein rotierendes bit oder wirklich sequentiell
programmiert, das geht u.U. schneller.

Udo
 
Thomas Maternschrieb:
"
Hi,

fuer eine Modellbauanwendung suche ich einen ľC oder
einen IC der die Pulsbreiten von mindestens 16 Empfaenger-
Kanaelen messen kann. Die Pulsfrequenz betraegt 50-100Hz,
der zu messende "1"-Zustand liegt zwischen 1 und 2 ms
(typischer Servo-Impuls).

Die Aufloesung muss mindestens 8 Bit betragen, 10 oder
12 Bit waeren schoener.

Falls ľC: es muessen gleichzeitig noch 8 PWM-Ausgaenge
angesteuert werden (kann auch per Software laufen, es
muessen nur die PINs reichen).

In einem aelteren Projekt benutzte ich einen AVR mit einem
16->1 Mux am CC-Eingang. Damals ging das, weil die
Pulse auf allen 16 Leitungen nacheinander in fester Reihenfolge
ankamen (also niemals 2 Kanaele gleichzeitig aktiv waren).
Diesesmal kann die zeitliche Abfolge der Pulse jedoch stark
variieren (im Extremfall beginnen alle Pulse gleichzeitig).
Alle Kanaele nacheinander zu betrachten und nur jeden
16. Impuls auszuwerten geht auch nicht -> viel zu traege.

Interner FLASH, EEPROM, SRAM (wie bei AVRs) waere sehr von
Vorteil, aber nicht zwingend notwendig. Wichtiger waeren
Stabilitaet, Preis und Verfuegbarkeit. Ein PC-taugliches
Interface (seriell, asynchron) waere sehr von Vorteil.
M16C !
Für den ist das ein Kinderspiel.
Du schliest Deine 16 PWM Signale an den externen Datenbus an. Mit der
ersten DMA sampelst Du eine komplette Periode in den RAM - also 256 x
10ms x 2Byte = 5KByte (bei 8bit). Dabei kannst Du gleichzeitig
untersuchen, ob sich ein Word geändert hat (DMA hat Vorrang). Die DMA
wird über einen Timer gesteuert, so dass die Samples genau kommen.

z.B.
http://www.m16c.de/PDF/AppNotes/APP_DMAC/rej05b0255_m16cap.pdf

Ausgabe der 8 PWMs geht genau so. Das Abbild im Speicher aufbauen und
mit der 2. DMA ausgeben lassen.


Der Controller hat 5 serielle Schnittstellen. Über eine davon wird
debuggt und geflasht. Ein Programmiergerät wie bei den PICs oder
Atmels ist da nicht mehr notwendig. Entwicklungsumgebung incl.
Compiler ist da auch kostenlos bei.
 
Thomas Matern wrote:

Du missverstehst mich.
Wolfgang hat alle Signale ver-xor-t um bei einer Aenderung
einen IRQ auszuloesen.
Bei mir kann u.U. ein 0->1 Wechsel bei allen Signalen gleichzeitig
auftreten (16x0->16x1) und das ergibt per xor keinen Unterschied
also auch kein IRQ.
Aso, das hab ich vergessen: Ein Input des XOR Gatters liegt fest auf Low.
Selbst wenn sich da alles Signale ändern, gibt es ein Signal, da sich ja das
eine Low Signal nicht geändert hat.

Wolfgang
 
Hi,

Mein Problem ist, dass sich alle Eingaenge gleichzeitig aendern
koennen, daher wird die Aenderungserkennung etwas komplexer aber
nicht unmoeglich.

Komplex ist sie nicht grade:

Signal=0 -> Zähler raufzählen,
Signal=0->1 -> Wert abspeichern Zähler Nullsetzen
Und das entweder als loop über ein rotierendes bit oder wirklich sequentiell
programmiert, das geht u.U. schneller.
Du missverstehst mich.
Wolfgang hat alle Signale ver-xor-t um bei einer Aenderung
einen IRQ auszuloesen.
Bei mir kann u.U. ein 0->1 Wechsel bei allen Signalen gleichzeitig
auftreten (16x0->16x1) und das ergibt per xor keinen Unterschied
also auch kein IRQ.


Thx, bye
Thomas
 
Thomas Matern <my-spamcatcher@gmx.de> schrieb im Beitrag <4moum1-jaf.ln1@server.workgroup>...

fuer eine Modellbauanwendung suche ich einen ľC oder
Es tut jeder uC (mit 16 Port-Pins), denn das Multiplexsignal
hat so viele Randbedingungen (sequentiell, zyklisch etc.)
das die Decodierung und neu-Codierung kein Problem ist,
selbst ohne jede Hardwareunterstuetzung (Timer etc).
Aber vielleicht waere es sinnvoller, das nicht-decodierte
Signal (bei 8-Kanal: 9 Impulse in 1-2msec Abstand, zwischen
9tem und 1stem eine laengere Pause) als EIngang zu verwenden,
dann brauchst du nur einen Pin.
Achte lieber auf geringe Stromaufnahme, einfache
Programmierbarbeit, lange Beschaffbarkeit, und es kommt so
was wie ein PIC16F84 oder AT89C2051 bei raus.
--
Manfred Winterhoff, reply-to invalid, use mawin at despammed.com
homepage: http://www.geocities.com/mwinterhoff/
de.sci.electronics FAQ: http://dse-faq.elektronik-kompendium.de/
Read 'Art of Electronics' Horowitz/Hill before you ask.
Lese 'Hohe Schule der Elektronik 1+2' bevor du fragst.
 
Hi,

Aso, das hab ich vergessen: Ein Input des XOR Gatters liegt fest auf Low.
Selbst wenn sich da alles Signale ändern, gibt es ein Signal, da sich ja das
eine Low Signal nicht geändert hat.
Das stimmt so nicht. Nur wenn sich eine ungerade Anzahl von Eingaengen
aendert, veraendert sich auch das XOR-Gatter. Bei mir gibt es (bis
jetzt) zwei Szenarien:
- es aendern sich 2 Eingaenge (einer von 1->0 und der naechste 0->1)
- es aendern sich alle 16 Eingaenge von 0->1

Beide Faelle werden vom XOR nicht erkannt.

Bye,
Thomas
 
Hi,

Es tut jeder uC (mit 16 Port-Pins), denn das Multiplexsignal
hat so viele Randbedingungen (sequentiell, zyklisch etc.)
das die Decodierung und neu-Codierung kein Problem ist,
selbst ohne jede Hardwareunterstuetzung (Timer etc).
Das zu entwickelnde Geraet soll mit verschiedensten Empfaengern
zusammenarbeiten.
Diese verfuegen u.U. ueber verschiedenste Features (Failsafe...)
und enthalten ggf. eigene uCs. Daher ist es gut moeglich, dass
die Ausgangsimpulse alle zeitgleich starten.

Aber vielleicht waere es sinnvoller, das nicht-decodierte
Signal (bei 8-Kanal: 9 Impulse in 1-2msec Abstand, zwischen
9tem und 1stem eine laengere Pause) als EIngang zu verwenden,
dann brauchst du nur einen Pin.
Den Empfaenger zu oeffnen (und das waere notwendig) ist keine
Option.

Bye,
Thomas
 
Hi,


M16C !
Für den ist das ein Kinderspiel.
...

Klingt interessant. Ich habe mit "Glyn" zwar einen Distributor aber
leider keine Preise gefunden. Die ueblichen Verdaechtigen
(Segor, Reichelt, Farnell) fuehren diese Reihe anscheinend nicht.

Bye,
Thomas
 
Thomas Matern schrieb:
Hi,

M16C !
Für den ist das ein Kinderspiel.

...

Klingt interessant. Ich habe mit "Glyn" zwar einen Distributor aber
leider keine Preise gefunden. Die ueblichen Verdaechtigen
(Segor, Reichelt, Farnell) fuehren diese Reihe anscheinend nicht.
Reichelt: M30624FGAFP (5V-Typ), kostet aber schon ein paar Euronen, und
ob der wirklich besser geeignet ist? Ich kenne als dessen wesentlichen
Vorzug, dass man ihn *wirklich* vernünftig in Hochsprachen (insbesondere
der C-Compiler ist gut) programmieren kann.


Gruß Dieter
 
Thomas Matern wrote:

Beide Faelle werden vom XOR nicht erkannt.
Anderer Vorschlag:
Man nehme für jedes Signal ein eigenes XOR Gatter, der 2. Input kommt an
einen Port des AVR an dem der alte Zustand ausgegeben wird. Geht auch per
Schieberegister Porterweiterung o.ä. Alle Ausganssignale kommen per OR an
den Interrupt. Dann ist es egal wie sich die Signale ändern.

Man könnte auch hergehen und die Signalzustände in einen Haltepuffer
schieben. Ich lad mal entsprechende Schaltskizzen hoch.

Wolfgang
 

Welcome to EDABoard.com

Sponsor

Back
Top