Forum: Mikrocontroller und Digitale Elektronik 3 Atmega8 mit Atmega32 verbinden


von Karl N. (karlnapf)


Lesenswert?

Hallo miteinander!

Mein Ziel ist es 3 Drehzahlsensoren über 3 Atmega8 gleichzeitig 
auszulesen und die Daten an einen 4. Atmega32 zu schicken.
Es handelt sich hierbei um eine Drehzahlregelung und deshalb müssen die 
3 Drehzahlwerte möglichst schnell nacheinander beim Atmega32 eintreffen 
und weiterverarbeitet werden.
Ich habe mir verschiedene Bussysteme angeschaut (I2C, CAN, RS232) weiß 
aber nicht welcher am sinnvollsten für mein Problem ist?
Das ganze sollte möglichst einfach zu implementieren sein und eine hohe 
Übertragungsrate ( <20µs für das Schicken einer Drehzal) haben, deshalb 
hab ich an die UART Schnittstelle gedacht.

Kann man über die UART Schnittstelle mehr als 2 Controller verbinden?
Wie lange dauert eine einzelne Datenübertragung bei UART bzw. I2C (was 
ist schneller)?

Grüße

von Obelix (Gast)


Lesenswert?

> (was ist schneller)?
Das kommt auf die Geschwindigkeit an.

von Falk (Gast)


Lesenswert?

@Holger Brenner

>Mein Ziel ist es 3 Drehzahlsensoren über 3 Atmega8 gleichzeitig
>auszulesen und die Daten an einen 4. Atmega32 zu schicken.

>Kann man über die UART Schnittstelle mehr als 2 Controller verbinden?

Nicht direkt, dazu müsstest du einen BUS ala RS485 realisieren.
Die Frage ist auch, wie weit sind die 4 uC räumlich getrennt.

>Wie lange dauert eine einzelne Datenübertragung bei UART bzw. I2C (was
>ist schneller)?

Schon mal die Datenblätter angeschaut?

Ein UART läuft mit Standardfrequenzen mit bis zu 115200 Bit/s. Macht 
also ~86us/Byte.
Für diese Anwendung kann man jedoch auch mit nichtstandardisierten 
Frequenzen arbeiten, bei 16 MHz Takt kommt man da auf 2 Mbit/s, macht 
also 5us/Byte.

@ Obelix

>> (was ist schneller)?
>Das kommt auf die Geschwindigkeit an.

Geanu! Und Apfelmus ist Mus aus Äpfeln.

MfG
Falk

von Christian (Guest) (Gast)


Lesenswert?

Nur so als Anregung:

Ein "Fahrraddyn." erzeugt eine Spg.
Reicht so ein System?
Dann wäre es ggf. nur mit einem uC machbar:
weil 3->1 macht es langsamer

Die Tacho#s am rad (per Magnet)
könnte man so ähnlich auch verwenden.

Gruß
c.

von capellone (Gast)


Lesenswert?

Selbstverständlich kann man in diesem Fall Uart auch ohne rs485 und 
halbduplex verwenden, tx von mega32 an rx von allen mega8 und rx von 
mega32 an tx aller mega88 .

von Karl N. (karlnapf)


Lesenswert?

@Falk:
Die Controller kann ich wenn's sein muss auf eine Platine packen. Die 
Kabel zu den Drehzahlensoren sind 50 cm lang.
Deiner Meinung nach ist also die Verbindung über UART nicht möglich.
Kannst du mir ein Bisschen mehr über RS485 erzählen (Links / C-Code).
Wo ist der Unterschied zu RS323. Die Pins am Controller sind die 
gleichen (RXD TXD) und Periferie Bausteine brauch ich auch nicht, oder?
Ist ein Bussystem mit RS485 schwiereig zum Laufen zu kriegen?

Fällt bei diesen Übertragungsraten der I2C komplett weg?

@Christian:
Das System steht fest: 3 Drehzahlsensoren mit 7200 Impulsen pro 
Umdrehung.

von Ein Troll (Gast)


Lesenswert?

>Mein Ziel ist es 3 Drehzahlsensoren über 3 Atmega8 gleichzeitig
>auszulesen und die Daten an einen 4. Atmega32 zu schicken.

Um welche Drehzahlen/Frequenzen handelt es sich? Könnte man das 
vielleicht sogar mit einem einzigen Controller hinbekommen?
Sonst könnte man vermutlich ein dreikanaliges SPI aufbauen:
Ein Chip-Select- und ein Clock-Signal, das alle drei Sklaven bekommen 
und dann noch jeweils eine Datenleitung vom Sklaven zum Master.

von Karl N. (karlnapf)


Lesenswert?

@capellone:
Ich werd es mal ausprobieren.
Wie kann ich unterscheiden von welchem der 3 Atmega8 die Information 
gekommen ist? Adressen vergeben, oder irgendwelche 
identifizierungs-Zeichen mitschicken?
Kannst du mir ein Beispiel geben?

von Karl N. (karlnapf)


Lesenswert?

@ ein Troll:
daran habe ich natürlich zuerst auch gedacht. Wäre am einfachsten und 
schönsten. Die Frequenzen sind bei langsamen Drehgeschwindigkeiten -> 0 
(bei Stillstand) also je langsamer desto länger sind die Impulse und bis 
zu 72kHz bei 3000 U/min.
Da ich die Frequenz mit dem Input Capture Pin auslese ergibt sich je 
nach Frequenz eine unterschiedliche Zeitdauer für die Messung und das 
macht Probleme bei der Regelung (konstante Abtastzeit).
Aber wenn du eine andere Möglichkeit parat hast ich bin für jenden 
Vorschlag dankbar!

von Falk (Gast)


Lesenswert?

@capellone

>Selbstverständlich kann man in diesem Fall Uart auch ohne rs485 und
>halbduplex verwenden, tx von mega32 an rx von allen mega8 und rx von
>mega32 an tx aller mega88 .

Ach so, den Uart jeweils deaktivieren und das Pin auf Tristate. Stimmt. 
Ist aber dann auch ein Bussystem, nur halt mit TTL-Pegel.

@Holger Brenner

>Deiner Meinung nach ist also die Verbindung über UART nicht möglich.

???
Hab ich das gesagt?
Sie ist schon möglich, wen man ein paar Kleinigkeiten beachtet.

>Kannst du mir ein Bisschen mehr über RS485 erzählen (Links / C-Code).

Wen die Controller auf einer Platine sitzen brauchst du kein RS485. Das 
ist nur bei langen Übertragungsstrcken notwenig.

>Wo ist der Unterschied zu RS323. Die Pins am Controller sind die

Die elektrischen Pegel sind anders. Ausserdem isr RS232 nur single ended 
(1 Leitung / Signal + gemeinsame Masse), während RS485 differentiell ist 
(zwei Leitungen pro Signal + Masse).

>gleichen (RXD TXD) und Periferie Bausteine brauch ich auch nicht, oder?
>Ist ein Bussystem mit RS485 schwiereig zum Laufen zu kriegen?

Kommt auf deinen Kenntnisstand an.

>Fällt bei diesen Übertragungsraten der I2C komplett weg?

Kann man nciht pauschal sagen. I2C geht im "Normalfall" bis 400 kbit/s, 
spezielle High-Speed Modi machen 3,2 Mbit/s. Da würde ich dann aber 
lieber SPI nehmen.

>Das System steht fest: 3 Drehzahlsensoren mit 7200 Impulsen pro
>Umdrehung.

Ach so, dann sollen quasi die drei uC die Pulsfreqenz messen und daraus 
die Drehzahl berechnen. Kann man so machen.
Wenn die Controler auf einer Platine sitzen kannst du auch SPI oder 
ähnliches machen. Auch eine Mischung aus UART und SPI wäre denkbar (Per 
Chip select einen der drei Controller auswählen, dieser schicht dann per 
UART die gemessene Drehzahl)

>Wie kann ich unterscheiden von welchem der 3 Atmega8 die Information
>gekommen ist?

Ganz einfach, über die drei Select Leitungen die dein Mega32 bedient.

MFG
Falk

von Christian (Guest) (Gast)


Lesenswert?

Wie genau muss das sein ?

Ggf. reicht eine "PWM":
Je Umdrehung 1 Impuls + Tiefpass = Mittelwert

Max. Umdrehung == max. Spannung

=> Nachteil   langsame Erkennung der Freqänderung (TP-Verhalten)

Wenn die drei Umdreh. zusammenhängen:
3 Timer + fester takt.
Starten nach jeder Umdrehung neu + samplen des letzt Wertes, bevor eine
Umdrehung neu anfängt.

Zählerstand einlesen + ggf. Pegelsetzen für neuen wert +
das Zwischenspeichern ggf. im mehreren FF, um die Änderung zu erkennen.
Summa:
Oszi (vom AT..32)
Zähler + Reset  (je Umlauf)
Speicher (bei Reset)
einlesen vom AT..32

Grus c

von Basti H (Gast)


Lesenswert?

Du kannst rs232 nehmen, und mit einem & glied verbinden.
Dann einen pin "request-pin" an jeden mega8 und fertig
Deine Daten empfängst du dann über die HW UART des M32

von Karl N. (karlnapf)


Lesenswert?

@Falk:
Der Vorschlag klingt gut.
Du meinst z.B also folgendes:
3 Pins am Atmega32 wählen den jeweiligen Atmega8 aus indem der 32er 
einen von den drei Pins high setzt und der dann am 8er abgefragt wird 
und nur dann sendet, die zwei anderen Pins sind low also senden die zwei 
anderen Atmega8 nichts.
Vielen Dank für den Gedankenanstoss.

von AVRFan (Gast)


Lesenswert?

>Mein Ziel ist es 3 Drehzahlsensoren über 3 Atmega8 gleichzeitig
>auszulesen und die Daten an einen 4. Atmega32 zu schicken.

Aha.  Und aus welchem Grund willst Du diese Aufgabe nicht mit einem 
Controller bewerkstelligen?

von Falk (Gast)


Lesenswert?

@AVRFan

>>Mein Ziel ist es 3 Drehzahlsensoren über 3 Atmega8 gleichzeitig
>>auszulesen und die Daten an einen 4. Atmega32 zu schicken.

>Aha.  Und aus welchem Grund willst Du diese Aufgabe nicht mit *einem*
>Controller bewerkstelligen?

Vermutlich deshalb.

>daran habe ich natürlich zuerst auch gedacht. Wäre am einfachsten und
>schönsten. Die Frequenzen sind bei langsamen Drehgeschwindigkeiten -> 0
>(bei Stillstand) also je langsamer desto länger sind die Impulse und bis
>zu 72kHz bei 3000 U/min.

Das braucht min. 3 Timer zum Zählen + 1 Timer für die Zeitmessung. Und 
auch 3 Input Capture gibs in den AVRs leider nicht (die ganz grossen 
haben 2, einge 4?)

Mfg
Falk

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Mit etwas logik gehts auch mit einem ICP
Alle drei Siganle per Oder Gatter auf ICP und über 3 Pins dann im 
interupt abfragen welches die Quelle war, udn in 3 Variablen dann die 
Zeiten speichern...

von Falk (Gast)


Lesenswert?

@Läubi Mail@laeubi.de

>Mit etwas logik gehts auch mit einem ICP
>Alle drei Siganle per Oder Gatter auf ICP und über 3 Pins dann im
>interupt abfragen welches die Quelle war, udn in 3 Variablen dann die
>Zeiten speichern...

Klassischer Anfängerfehler! Die drei Sensoren laufen ganz sicher NICHT 
synchron, da ist jede beliebige Phasenlage/Timing möglich, 
dementspechend können sich Pulse zu ultrakurzen Spikes überlagen. -> Nix 
mit Messung

MFG
Falk


von Karl N. (karlnapf)


Lesenswert?

@Falk:
Genau das ist das Problem.(Hab schon über nen Multiplexer auf den ICP 
nachgedacht, funktioniert aber auch nicht bei unterschiedlicher 
Frequenz).
Ich hab mir schon einige Gedanken, das Problem mit einem Controller zu 
lösen gemacht, bin aber auf nichts wirklich sauberes, einfaches, 
schnelles und genaues gekommen, deshalb die Lösung mir den 3 kleinen 
Atmegas.
Klingt auf's erste zwar kompliziert ist aber doch die sinnvollest 
Alternative.

@Christian:
Das mit PWM und glätten und dann als AD Wert einlesen hab ich auch 
überlegt.
Das ganze wird dann aber so ungenau dass es für eine Regelung nicht mehr 
taugt.

von Falk (Gast)


Lesenswert?

@Holger Brenner

>Klingt auf's erste zwar kompliziert ist aber doch die sinnvollest
>Alternative.

Ich hätte nen kleinen CPLD genommen ;-)

>Das mit PWM und glätten und dann als AD Wert einlesen hab ich auch
>überlegt.
>Das ganze wird dann aber so ungenau dass es für eine Regelung nicht mehr
>taugt.

Eben. Ist auch reichlich sinnfrei, einen Messwert, welcher schon digital 
vorliegt, (Rechtecksignal mit einer Freqenz proportional zur Drehzahl) 
in analog zu wandeln und dann wieder zu digitalisieren.

MfG
Falk

von AVRFan (Gast)


Lesenswert?

Wäre schlichtes Multiplexen eine Möglichkeit?  Die drei Sensoren an die 
Eingänge eines 3-zu-1-Multiplexers. Dessen Ausgang an den µC, der jeden 
Sensor einzeln über Steuerleitungen auswählen kann.  Auswertung mit 
einem Timer und einem ICP.  Die drei Sensoren werden reihum alle 166 ms 
(Beispielwert) selektiert und die Drehzahl berechnet. Ergibt eine 
Refreshrate von immerhin noch 2 Aktualisierungen pro Sekunde für jeden 
Sensor.  Schneller kann man auf nem Display eh nix ablesen.

von Christian (Guest) (Gast)


Lesenswert?

PWM:

Regelung:
  wenn es nicht schnell sein muss:
  die Impulse zählen + reset:
bei so 10 Sek,  sollte die Toleranz nicht so groß sein?
=> wie konst. läuft das ganze ?

Regelung:
  Totzeitsystem, wegen verschiedener Zeiten der Auswertung?
+
einen TP kann man per ADU ausmessen, das machts etwas schneller.
+
mehrere TPs parallel: dann den optimalen nehmen, das kann
der/die uCs auswählen:  aber medrere ADU-eingänge!
=> eh nicht nutzbar, wegen Taktrate hoch == ADU schlechter


bei 4 AT...
warum nicht einen ARM  (lpc.... )

Nur so
C.

von Hauke S. (hauke)


Lesenswert?

Wenn es um das reine Verbinden von vier AVR geht (1 Master 3 Slave)
Dann ist eine 8 Bit parallel Anbindung mit separaten CS Leitungen mit 
sicherheit am schnellsten (82C55 oder ein paar latches).
Die M8 schreiben permanent in den Ausgabeport, und der M32 holt sich die 
Daten nach eigenem Gusto von jeweiligen Slave ab.
Nachteil sind die vielen Leitungen.
Weiterhinn sollten alle AVR mit der gleichen Taktbasis laufen 
(Quarzoscilator).

Als schnellste serielle Lösung wäre SPI zu nennen. Braucht lediglich 32 
Slavetakte für ein Byte. Das wären dann 2µs für die Übertragung (pro 
Slave) und weiterer 125-250ns für den Slave select.

Hier gilt das gleiche mit der Taktbasis.

Am modulartsten und flexibelsten ist TWI bus. Nur ist der mit lediglich 
ca. 400kHz (im Vergleich zu den 4MHz bei SPI) sehr viel langsamer.
Ab gemächlichsten ist UART mit 115kBaud. Hat aber je nach 
übertragungstechnik die größte Reichweite. Das Slaveselect Protokoll muß 
jedoch komplett in Software gemacht werden.

Wenn man also alle fünf vergleicht:

8Bit par (bei 16 MHz)
42,6 Mbit/s (3 Master Takte/8bit)
11 Leitungen (8*Data + 3*CS)

SPI (bei 16 MHz)
4Mbit/s (4 Slavetakte/bit)
5 Leitungen (1*MISO + 1*SCK + 3*CS) (MOSI wird nicht benötigt)

TWI (bei 400kHz)
160kBit/s (Start+Adresse+Ack+Daten+Nack+Stop=20 Takte/8bit)
2 Leitungen (SCL+SDA)

UART (bei 115,2 kBaud ohne Parity)
92,16kbit/s (1Startbit+8Datenbit+1Stopbit=10Bit/8Bit)
2-4 Leitungen (TX+RX oder RX + 3*CS)

Diese ganzen Beispiele sind natürlich ohne Kontroll-Overhead. Durch 
diesen werden die Netto raten nochmal sinken.
cu
Hauke

von Wolfram (Gast)


Lesenswert?

Ein bißchen sehr kompliziert, was ihr da plant...
Du hast 3 Motoren mit Drehzahlgeber, jeder generiert 7200 Impulse pro 
Drehung
(warum so viel? Wie genau soll denn das geregelt werden)
das legst du auf je einen Interrupt und bei jeder steigenden Flanke 
erhöst du den jeweils einen Zähler. Mit konstanter Abtastzeit werden 
jeweils die Zähler ausgelesen und zurückgesetzt. Die ausgelesenen Werte 
werden in Drehzahlen umgewandelt.
Die konstante Abtastzeit mußt du entsprechend deiner Anforderung 
bestimmen.

Oder du nimmst den die Drehzahlimpulse als externen Takt des jeweiligen 
Counters.


von Falk (Gast)


Lesenswert?

@Wolfram

>Du hast 3 Motoren mit Drehzahlgeber, jeder generiert 7200 Impulse pro
>Drehung
>(warum so viel? Wie genau soll denn das geregelt werden)
>das legst du auf je einen Interrupt und bei jeder steigenden Flanke
>erhöst du den jeweils einen Zähler. Mit konstanter Abtastzeit werden

Thread gelesen oder nur überflogen?
72 kHz Pulsfreqeunz sind nicht ganz ohne. Mit einem Interrupt pro Puls 
wird das gar nichts. Jaja, die Timer können das auch alleine zählen, nur 
haben die meisten AVRs keine 4 Timer, nur die ganz Grossen.

MfG
Falk

von Karl N. (karlnapf)


Lesenswert?

Danke für die schnellen Antworten.
Ich werd das jetzt mal umsetzen und sag Bescheid wenn's funktioniert.

von Profibauer (Gast)


Lesenswert?

Ich glaube, Du hast Dir über Kosten-Nutzen noch keine abschließenden 
Gedanken gemacht.

Mit welcher Häufigkeit soll denn die Regelschleife auf dem 32er 
berechnet werden? 1000 mal pro Sekunde? Schafft er das? Dann würde es 
reichen, wenn alle drei 8er in 1ms gelesen werden.

Wenn mein Taschenrechner nicht lügt, hast Du Frequenzen bis 360Khz zu 
verarbeiten (7200 Impulse bei max. 50 Umdrehungen/s). Da wird ein Mega8 
schon warm. Die Meßwerte noch 'nebenbei' schnell auszugeben, wird ihm 
schwerfallen. Und wie hoch aufgelöst sollen denn die Drehzahlen 
verarbeitet werden? 4-stellig, 5-stellig? Bei 16MHz Takt und 1ms Meßzeit 
bekommt man eine Auflösung von 1/16000, was guten vier Stellen 
entspricht.

Ich würde auf jeden Fall die Eingangsfrequenz reduzieren (360kHz ist zu 
viel) und, wenn eine hohe Leistung gefordert ist, jede Regelung in einem 
separaten 8er/16er/32er ablaufen lassen. Diese können dann von einem 4. 
µP kontrolliert bzw. gesteuert werden.

Nur so als Idee.

von Karl N. (karlnapf)


Lesenswert?

@Profibauer:
Ich hab mir die Drehzahlsensoren grad mal genauer angeschaut. Die machen 
720 Impulse pro Umdrehung auf jeder Spur. Da ich auch noch die 
Drehrichtung (2.Spur)erkennen muss ist die Auflösung 1440 Impulse pro 
Umdrehung * 50 Umdrehungen pro Sekunde = 72kHz (13,8 µs zwischen zwei 
Impulsen).
Wenn ich mit einer Baudrate von 2Mbps arbeite und die Zahlen die ich 
versicken will zwischen 1 (U/min) und 3000 (U/min) liegen, könnte das 
nicht klappen?

P.S: Meine Abtastfrequenz liegt bei 4kHz und sollte auch nicht weniger 
werden, da gleichzeitig PWM Frequenz, sonst bekomm ich zu hohe 
Stromspitzen.

Gruss Holger

von Falk (Gast)


Lesenswert?

@Holger Brenner

>Ich hab mir die Drehzahlsensoren grad mal genauer angeschaut. Die machen
>720 Impulse pro Umdrehung auf jeder Spur. Da ich auch noch die

Waren es nciht gestern 7200 Pulse/umdrehung? Faktor 10 ?

>Drehrichtung (2.Spur)erkennen muss ist die Auflösung 1440 Impulse pro
>Umdrehung * 50 Umdrehungen pro Sekunde = 72kHz (13,8 µs zwischen zwei
>Impulsen).

>Wenn ich mit einer Baudrate von 2Mbps arbeite und die Zahlen die ich
>versicken will zwischen 1 (U/min) und 3000 (U/min) liegen, könnte das
>nicht klappen?

Sicher, aber du willst und musst ja wohl kaum im 13 us Raster deine 
Frequenz messen. Denn die Äuflösung wäre dann selbst bei 16 MHz 
Controllertakt auf ca. 13*16 = 208 Zähler begrenzt. Naja ~0,5%.

>P.S: Meine Abtastfrequenz liegt bei 4kHz und sollte auch nicht weniger
>werden, da gleichzeitig PWM Frequenz, sonst bekomm ich zu hohe
>Stromspitzen.

Dann läuft deine Regelung wohl auch mit 4 kHz Abtastfrequenz?! Sprich du 
musst auch nur mit 4 kHz (250us) deine Freqeunz messen. Das passt schon. 
(wobei ich das mit nem CPLD gelöst hätte, schliesslich ist es nur 3x 
Quadraturdecoder + Vorwärts/Rückwärts Zähler).

MfG
Falk

von Wolfram (Gast)


Lesenswert?

Sind die Drehzahlsensoren dir vorgegeben?
Es erschließt sich mir nicht warum du so viele Impulse brauchst.
Du hast 50 Umdrehungen /s Warum benötigst du so eine hohe Auflösung?

Deine Abtastfrequenz hat nichts mit deiner PWM frequenz zu tun. Die 
können unabhängig laufen.
Nur um das mal reeller zu betrachten
50 Umdrehungen /s = 1 Umdrehung / 20ms

Bei 4 kHz Abtastfrequenz hat sich deine Welle gerade mal um 4,5 Grad 
/Sample gedreht!!! Was willst du machen? Willst du das sich da was mit 
konstanter Drehzahl dreht oder willst du positionieren?




von Falk (Gast)


Lesenswert?

@Wolfram

>Es erschließt sich mir nicht warum du so viele Impulse brauchst.
>Du hast 50 Umdrehungen /s Warum benötigst du so eine hohe Auflösung?

Und was ist bei niedrigen Drehzahlen?

>50 Umdrehungen /s = 1 Umdrehung / 20ms
>Bei 4 kHz Abtastfrequenz hat sich deine Welle gerade mal um 4,5 Grad

Vielleicht eine Präzisionsregleung für CNC Maschinen?

MfG
Falk


von Christian (Guest) (Gast)


Lesenswert?

Wie genau muss was wann sein ?

Bei der hohen Anzahl von Impulsen pro Umdrehung ist
(eine ADU messung ggf. doch machbar)

Ansonsten würde ich ggf. eine Teiler hinter den Impulsgeber
setzen,
 Motto: weniger Impulse, weniger Probleme beim uC

Wie gesagt: Genauigkeit = ?

Drehzahlbereich = ?
 brauchst Du 0,1 Umdreh/min o.s. ?

von Profibauer (Gast)


Lesenswert?

@Holger

Da sieht man mal wieder was Nullen alles so anstellen können ;-)
Wäre es nicht einfacher, jeden Motor mit einem separaten µP anzusteuern 
und zu regeln? Dann gäbe es keine Engpässe bei der Datenübertragung und 
(vermutlich) beim zur Zeit geplanten zentralen 32er Prozessor.

Bei 4kHz Abtastrate würde sich eine Auflösung von 1/4000 ergeben (16MHz 
µP). Zweckmäßigerweise würde man die Impulse an ICP anlegen und alle 
250µs die Anzahl und die genaue Zeit dazu auswerten - synchron zur PWM. 
Dies muß per Interrupt erfolgen und wird bei 72kHz und geschickter 
Programmierung etwa 25% Prozessorleistung 'fressen'. Für die Regelung 
bliebe genug Luft.

Der Hauptprozessor steuert über UART (am besten Multiprozessorprotokoll, 
62,5kBd) die drei µPs. So würde ich es angehen.

Ach so. Es ist natürlich elegant die Drehrichtung automatisch zu 
erkennen, aber ist diese denn dem Motortreiber nicht schon vorgegeben 
und damit konstant?

von Falk (Gast)


Lesenswert?

@Profibauer

>Da sieht man mal wieder was Nullen alles so anstellen können ;-)

Ein Null kann bestehende Probleme verzehnfachen. ;-)

>Wäre es nicht einfacher, jeden Motor mit einem separaten µP anzusteuern
>und zu regeln? Dann gäbe es keine Engpässe bei der Datenübertragung und

Warum sollte es für ein paar Byte Engpässe geben?

>Bei 4kHz Abtastrate würde sich eine Auflösung von 1/4000 ergeben (16MHz
>µP). Zweckmäßigerweise würde man die Impulse an ICP anlegen und alle
>250µs die Anzahl und die genaue Zeit dazu auswerten - synchron zur PWM.

Wenn das mal keine Irrtum ist. Es sind wie ich es verstanden haben 
Quadraturencoder. Wenn die mit 72 kHz Pulse generieren muss man mit min. 
100 kHz abtasten. ggf. noch schneller. Damit ist ein AVR vollauf 
beschäftigt. Ich sag nur CPLD - Ole! ;-)

>Der Hauptprozessor steuert über UART (am besten Multiprozessorprotokoll,
>62,5kBd) die drei µPs. So würde ich es angehen.

Irgenwie sehe ich gerade Kanonen und Spatzen vor meinem geistigen Auge.

MFg
Falk

von Profibauer (Gast)


Lesenswert?

>Irgenwie sehe ich gerade Kanonen und Spatzen vor meinem geistigen Auge.

Das liegt an Deinem Spiegel!

>Wenn die mit 72 kHz Pulse generieren muss man mit min. 100 kHz abtasten. >ggf. 
noch schneller.

Darum habe ich ICP gesagt. Muß man nur begreifen können.
Die Impulse selber könnte man auch mit einem weiteren Zähler 
(TCNT-Eingang) messen. Sonst wie gesagt per Interrupt. Die 
Prozessorbelastung habe ich genannt.

von Falk (Gast)


Lesenswert?

@Profibauer

>>Irgenwie sehe ich gerade Kanonen und Spatzen vor meinem geistigen Auge.

>Das liegt an Deinem Spiegel!

Spiegel? Blutalkoholspiegel? ;-)

>>Wenn die mit 72 kHz Pulse generieren muss man mit min. 100 kHz abtasten. >ggf. 
noch schneller.

>Darum habe ich ICP gesagt. Muß man nur begreifen können.

Aha. Und du hast auch 3x2 ICPs am AVR? Schon zwei haben die meisten 
NICHT.
Und dass Quadraturgeber sinnvollerweise abgetastet werden hatten wir 
auch schon mehr als einmal SEHR lange diskutiert.

Beitrag "Drehgeber auslesen"

>(TCNT-Eingang) messen. Sonst wie gesagt per Interrupt. Die
>Prozessorbelastung habe ich genannt.

Und? Das ist deine Schätzung. Nicht mehr (und nicht weniger).

MfG
Falk

von Karl N. (karlnapf)


Lesenswert?

Die Drehzahlsensoren sind fest installiert. Wie gesagt 720 
Imp/Umdrehung, da eine Schwingung ausgeregelt werden soll muss die 
Drehrichtung (zumindestens im unteren Drehzahlbereich)auch erfasst 
werden, also 2.Spur mit nochmal 720 Imp/ Umdrehung phasenversetzt.
Mit dem IC Pin messe ich die Zeit zwischen zwei high Flanken und bekomm 
somit die Frequenz - sprich Drehzahl(hab ich schon getestet funktioniert 
soweit ganz gut).
D.h. bei niedrigen Frequenzen (langsamen Drehzahlen ergibt sich das 
Problem das die Werte zu langsam aktualisert werden -> werde eine 
Untergrenze einführen müssen!) und bei hohen Frequenzen kommt der UART 
nicht mit die Daten zu verschicken (- Obergrenze einführen, müssen keine 
3000 U/min sein)
Ich muss das ganze ausprobieren, da mir keine bessere Lösung einfällt 
und je nachdem Einschränkungen für den Drehzahlbereich machen.

@Falk:
Von CPLD hab ich keine Ahnung und auch keine Zeit mich einzuarbeiten, 
ist das sowas wie ein FPGA?

von Falk (Gast)


Lesenswert?

@Holger Brenner

>Ich muss das ganze ausprobieren, da mir keine bessere Lösung einfällt
>und je nachdem Einschränkungen für den Drehzahlbereich machen.

Dein Ansatz klingt erstmal ganz gut.

>Von CPLD hab ich keine Ahnung und auch keine Zeit mich einzuarbeiten,
>ist das sowas wie ein FPGA?

Ja, das sind die kleinen Brüder der FPGAs.

MFG
Falk

von AVRFan (Gast)


Lesenswert?

>D.h. bei niedrigen Frequenzen (langsamen Drehzahlen ergibt sich das
>Problem das die Werte zu langsam aktualisert werden -> werde eine
>Untergrenze einführen müssen!)

Das liegt in der Natur der Sache.  Beispiel: Wenn das Rad zwei 
Umdrehungen pro Tag macht, dauert es von einem Zahn zum nächsten 1 min. 
Dann solltest Du nicht den Ehrgeiz entwickeln, die momentane Drehzahl 
mit einer Refreshrate von 10 Aktualisierungen pro Sekunde messen zu 
wollen.

>und bei hohen Frequenzen kommt der UART
>nicht mit die Daten zu verschicken (- Obergrenze einführen, müssen keine
>3000 U/min sein)

Vielleicht macht es Sinn, über die Frage nachzudenken, ob der UART die 
Daten unbedingt nach jedem einzelnen Zahn verschicken muss, oder ob es 
auch reicht,
wenn die Messwerte in ein Register geschrieben werden, dessen Inhalt der 
UART mit einer festen, zweckmäßigen Frequenz von z. B. 20 Hz dem 
Mastercontroller mitteilt?

von Profibauer (Gast)


Lesenswert?

@Holger

Noch einmal.
Du nimmst einen µP und erfaßt damit die Drehzahl, regelst sie nach und 
generierst ein PWM Signal für einen Motor.

Wenn das funktioniertt, versiehst Du diese Schaltung / dieses Programm 
mit einer UART-Schnittstelle zur Kommunikation und steuerst diese drei 
µPs über einen zentralen µP.

>auch erfasst werden, also 2.Spur mit nochmal 720 Imp/ Umdrehung phasenversetzt.

Reicht es nicht, gleichzeitig zum Impuls der 1. Spur den Pegel der 2. 
Spur zu lesen, um die Drehrichtung zu erkennen?

von Profibauer (Gast)


Lesenswert?

>>(TCNT-Eingang) messen. Sonst wie gesagt per Interrupt. Die
>>Prozessorbelastung habe ich genannt.

>Und? Das ist deine Schätzung. Nicht mehr (und nicht weniger).


Aktuell habe ich dies von Holger in der Codesammlung gefunden:
Beitrag "Re: Input Capture Pin (ICP) auslesen ( Frequenz messen)"

Hier wird beschrieben, wie ein AVR mit 4MHz bei einer 
ICP-Frequenzmessung bei 75kHz an seine Grenzen stößt.
Oben hatte ich die Prozessorbelastung bei 16MHz und 72kHz auf 25% 
geschätzt. Bei 4MHz => 100% und bei 16MHz => 25% trifft es doch ganz gut 
;-) Das zu Schätzwerten und zu Schwätzwerten.

@Holger:
Wie sieht Deine Lösung aus?

von Karl N. (karlnapf)


Lesenswert?

Die Lösung läßt noch auf sich warten, bin grad dabei den UART richtig 
zum laufen zu kriegen. Scheint doch komlizierter zu werden als gedacht.
Sag bescheid wenn ich soweit bin.

von Jochen S. (jochen_s)


Lesenswert?

Hallo,

Wenn du doch wieder zurück zu RS232-Kommunikation willst mal ein 
Vorschlag.

Inwieweit kennst du dich mit Bustopologien aus?? Token Ring??
Also der tx vom 32 zum rx des ersten 8er dessen tx an den Rx von 
nächsten, bis du wieder beim 32 angekommen bist. Dann ein 
microprotokoll: Der 32 sendet !xxxxxyyyyyzzzzz an den ersten 8er dieser 
ersetzt xxxxx durch seine Drehzahl und sendet den String weiter an den 
zweiten 8er dieser ersetzt dann yyyyy durch seine drehzahl usw. Wenn das 
ganze wieder beim 32er ankommt hast du einen String mit ! und den 3 
Drehzahlen. Inwieweit das mit deiner Geschwidigkeit hinkommt, hängt 
davon ab mit welcher Frequenz deine µCs laufen und in welcher Sprache du 
schreibst.


jochen
http://www.rs485-hausbus.de.vu

von Hans (Gast)


Lesenswert?

warum zum teufel den uart???

nimm einfach spi.. der mega32 generiert dir dann 3 CS signale (je 
nachdem von welchem mega8 er daten will) und die mega8 messen gemütlich 
vor sich hin...

du schreibst oben was von festen intervallen... daher nehme ich an, dass 
du im mega32 eigentlich nur einen timer rennen hast, der die in 
bestimmten intervallen dir deine stellgröße berechnet...

mach doch einfach eine leitung von jedem mega8 zu deinem mega32... wenn 
der mega8 neue daten hat dann legt er die leitung auf high...
nach dem berechnen deiner stellgrösse wartest du dann im mega32 einfach 
bis ein mega8 neue daten hat bzw bis die zeit abgelaufen ist und du 
wieder berechnen darfst...

im mega 8 misst du.. wartest bis sie vom mega32 abgeholt werden stellst 
die leitung auf low und misst dann wenn der CS weg ist wieder weiter...

die daten holst du am besten per spi ab ... der uC sollte dann das 
tristate-schalten von deinem dout-pin von selbst machen... einfach im 
datesheet nach spi-slave suchen...

das sollte eigentlich deinen aufwand minimieren und nebenbei auch fix 
gehen :)

nur wenn du meinst das übertragen soll unter 20uS pro wert sein dann 
willst du da mit über 10kHz regeln... schonmal nachgedacht ob da dein 
system mitmacht???

73

von Falk B. (falk)


Lesenswert?

@ Jochen S.

>Inwieweit kennst du dich mit Bustopologien aus?? Token Ring??
>Also der tx vom 32 zum rx des ersten 8er dessen tx an den Rx von
>nächsten, bis du wieder beim 32 angekommen bist. Dann ein

Und wozu der Aufwand? 3x Chip Select tuts locker.

@ Hans

>warum zum teufel den uart???

>nimm einfach spi.. der mega32 generiert dir dann 3 CS signale (je
>nachdem von welchem mega8 er daten will) und die mega8 messen gemütlich
>vor sich hin...

Das tun sie auch mit UART. OK, SPI ist schneller, aber für 3x2 Byte alle 
250us tuts auch der UART locker, er muss ja nicht mit irgendwelchen 
Standardbautraten arbeiten. Da höchstwahrscheinlich alle 4 uC sowieso am 
gleichen Takt hängen einfach UBRR mit 0 beschreiben (ist glaub ich sogar 
der RESET Wert) und gut ist.

>das sollte eigentlich deinen aufwand minimieren und nebenbei auch fix
>gehen :)

Ich glaub das hat er schon verstanden. UART != RS232.

>nur wenn du meinst das übertragen soll unter 20uS pro wert sein dann
>willst du da mit über 10kHz regeln... schonmal nachgedacht ob da dein
>system mitmacht???

Mal den Tread gelesen? Es hat 4 kHz Zyklusfreqeunz.

MFG
Falk

von Karl N. (karlnapf)


Lesenswert?

Also nach längerer Pause hier meine Realisierung:
Da ich genügend freie Pins zur Verfügung, habe hab ich mir die Idee von 
Hauke Sattler nochmal angeschaut und sie umgesetzt.
Drehzahl parallel übertragen und mit Chip Select Leitungen den 
jeweiligen Amtega8 aussuchen.
Funktioniert super und ist einfach zu realisieren.

Atmega8: Die gemessene Frequenz wird in die Drehzahl umgerechnent an 
dann in 2 x 8bit Werte aufgeteilt. Dann werden per externem Interrupt 
die beiden Werte rausgeschickt (in "C" einfach mit "PORTX") und am 
Atmega32 wieder zusammengesetzt.

Atmega32: Pro Regelschleifendurchlauf wird jeweils ein Pin high gesetzt 
und im daraufolgenden Durchlauf wird der 8bit Wert abgeholt (einfach mit 
"PINX").
Also insgesamt 6 Durchläufe à 250µs für 3 x 16bit Drehzahlwerte.

Ist programmiertechnisch sehr einfach umzusetzen und 
Übertragungsprotokolle und Baudraten einstellen entfällt auch.

Viele Grüße und Danke für die Hilfe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.