PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR-Datenübertragung



blacksnake
22.04.2012, 12:11
Guten Tag

Kann mein einen AVR-Microcontroller wie folgt Daten schicken, so dass er sie auch speichert?

Ich habe eine Spannungsversorgung. (Kabel + und -)
Dann würde ich den Microcontroller mit einem Gold Cap (Kondensator) ausstatten.
Jedes mal wenn die Spannungsversorgung vom Kabel unterbreche soll der Microcontroller über den Kondensator gespeist werden.

Ist es dann möglich wenn ich über die Versorgungsleitung ein Signal mit wesentlich geringerer Spannung schicke dem Microcontroller sozusagen programmiere?

Kurze zusammenfassung:
1.) Spannungsversorgung vom Kabel -> Microcontroller arbeitet normal
2.) Spannungsversorgung vom Kabel unterbrochen -> Microcontroller bekommt Spannung vom Gold Cap
3.) Kabel als Datenleitung verwenden (geringe Spannung)


mit freundlichen Grüßen und noch einen schönen Sonntag

Dominik

021aet04
22.04.2012, 12:20
Wilkommen im Forum,
möglich ist es schon. Es kommt nur auf die Bedingingen an. Was willst du genau machen. Wie lange sollen Daten gesendet werden (was sind Daten bzw wo kommen die her?). Welche Last hängt am µC bzw an der Last (Leds,...)
Eine Alternative wäre wenn du, wenn du es mit der Leistung nicht schaffst auf Akku (NiMh bzw bei noch mehr Leistung Li) verwendest.

Poste einmal die genauen Bedingungen (Verbrauch, Überbrückungszeit,....)

MfG Hannes

blacksnake
22.04.2012, 12:57
1.) Konfigurieren
Die Daten die gespeichert werden, werden nur einmalig gesendet. Dies geschieht nur bei Erstmaliger Inbetriebnahme des Systems. Es soll nur ein Motor mit Steuerungsplatine konfiguriert werden. Es geht darum, um den Motor nur eine bestimmte Zeit laufen zu lassen.

2.) Inbetriebnahme
Der Motor bekommt 2 verschiedene Signale.
a) Dauerstrom (der Motor soll so lange drehen, bis er durch einen Endschalter unterbrochen wird.
b) Kurzer Ladestrom für den Kondensator, dann soll ein Signal mitgeteilt werden, dies bedeutet, dass der Motor nur eine bestimmte Zeit laufen soll.
Und danach kommt auch ein Dauerstrom.


mfg
Dominik

Edit: Der Kondensator ist nur für die Stromversorgung vom Microcontroller zuständen.

021aet04
22.04.2012, 13:07
Warum versorgst du den µC nicht über die gleiche Versorgung wie den Motor (Spannungsregler nicht vergessen)?
Ein Kondensator hat nur eine kürze Überbrückungszeit, ein Gold Cap mehr aber für die Versorgung würde ich ihn nicht verwenden. Nur zur Datensicherung (Wenn die Versorgung entfernt wird Daten speichern).

MfG Hannes

blacksnake
22.04.2012, 13:12
Weil ich den Motor mit nur 2 Adern als Zuleitung versorgen darf. ( + und - ) und ich muss über diese 2 Adern auch den Motor Konfigurieren können.
Oder weißt du eine andere Möglichkeit um dies zu machen? Zur Info die Versorgungspannung kann 24V, 36V und 48V betragen. Und eine Leistung von maximal 300W. (~6A - ~12A)

mfg
Dominik

021aet04
22.04.2012, 13:30
Wie willst du den Motor versorgen und den µC über die gleiche Leitung konfigurieren?
Man könnte nur das Signal (Datenübertragung) auf die Gleichspannung aufmodulieren (so wie es z.B. mit dem Lichtnetz gemacht wird)

MfG Hannes

blacksnake
22.04.2012, 13:36
Naja ich hätte es mir so gedacht.
1.) Ich lade den Kondensator und versorge somit den Microcontroller.
2.) Ich trenne die Stromversorgung von den 2 Adern.
3.) Ich nutze die 2 Adern als Datenleitung.
4.) Ich verwende die 2 Adern wieder als Spannungsversorgung.

mfg
Dominik

021aet04
22.04.2012, 14:02
Wie willst du erkennen wann Daten übertragen werden sollen und wan konfiguriert werden soll?
Für die Datenübertragung brauchst du immer Masse als Bezugspotential. Dadurch müssen die Taktraten auf beiden Seiten gleich sein. Du könntest RS232 und 1Wire nutzen. Eine weitere Möglichkeit wäre eine Funkverbindung (Falls keine zu großen Störungen vorhanden sind (Industrie o.Ä.)

MfG Hannes

blacksnake
22.04.2012, 14:15
1Wire klingt interessant. :) Danke
Werd mich dazu einmal einlesen.

mfg
Dominik

021aet04
22.04.2012, 14:22
Heute habe ich in einem Thread gelesen das es aber bisher keine Slave Bibliothek für 1Wire gibt.

MfG Hannes

blacksnake
22.04.2012, 14:28
Gibt es sonst noch irgendwelche Möglichkeiten außer Funk (eventuelle Störsignale und teuer in der Realisierung) nur über 2 Aderen die Versorgung und die Daten zu übertragen?

mfg
Dominik

TheDarkRose
22.04.2012, 14:41
Wieso schränkst du dich eigentlich auf zwei Adern ein?

blacksnake
22.04.2012, 15:01
Wieso schränkst du dich eigentlich auf zwei Adern ein?

Weil die alten Motoren alle 2 Adern besitzen und Kupfer nunmal teuer ist. Bei ein paar Leitungen wäre es ja kein Problem. Aber wenn man auf Baustellen statt 1000m Kabel aufeinmal dass doppelte verlegen muss wird es irgendwann teuer. Und es soll kompatibel zu den alten Motoren sein ohne neue Leitungen zu verlegen.

mfg
Dominik

021aet04
22.04.2012, 15:12
Wenn es öfter eingesetzt wird würde ich auf die Gleichspannung das Signal aufmodulieren.

MfG Hannes

blacksnake
22.04.2012, 15:16
Wenn es öfter eingesetzt wird würde ich auf die Gleichspannung das Signal aufmodulieren.


Wie funktioniert dies genau? Gibt es dazu irgendwelche Tutorials?

mfg
Dominik

TheDarkRose
22.04.2012, 15:19
Ähnlich wie bei Power over Ethernet, wo kein extriges Aderpaar verwendet wird.

021aet04
22.04.2012, 16:17
z.B. http://www.mikrocontroller.net/topic/153028

Diese Technik wurde von EVUs (Elektroversorgungsunternehmen) eingesetzt um die Zähler für Nachtbetrieb zu aktivieren.

MfG Hannes

blacksnake
23.04.2012, 21:10
Danke :)

Bin mir aber nicht sicher ob es mit den Signal aufmodulieren so einfach wird bzw. ob dies nicht ein wenig teuer wird.

mfg
Dominik

TheDarkRose
23.04.2012, 21:15
Naja, schau dir mal an, wie es die Power over Ethernet Adapter machen, die sind ja eigentlich auch recht preiswert.

021aet04
24.04.2012, 18:48
Ein Stichwort für soetwas wäre noch Powerline Kommunikation.

MfG Hannes

blacksnake
27.04.2012, 19:22
Danke für die Hinweise, aber leider finde ich keine Schaltpläne oder ähnliches dazu :(

mfg
Dominik

Sauerbruch
28.04.2012, 08:48
Moin Dominik!

Also, mit einer "wesentlich geringeren" Spannung wirst Du den Mikrocontroller nicht programmieren können. Ein High-Pegel muss schon einen bestimmten, definierten Wert haben.
Aber einen grundsätzlichen Lösungsansatz hätte ich schon, für den ich allerdings noch zwei Dinge wissen müsste:

1. Hast Du bedacht, dass beim Deaktivieren der Versorgungsspannung auch der Motor abgehängt wird? Denn den wird auch der dickste Gold Cap ja nicht wirklich mit Leistung versorgen können...

2. Welche Mengen an Daten möchtest Du übertragen, und wie oft (pro Stunde, Minute oder Tag)?

021aet04
28.04.2012, 09:18
@Sauerbruch
Die Steuerung soll nicht programmiert werden (im herkömmlichen Sinn mit z.B. ISP) sondern es sollen nur Parameter übertragen werden.

@blacksnake
Ich habe einen Link gepostet (mikrocontroller.net) hast du den schon angeschaut? Dort hat auch jemand soetwas Ähnliches gesucht.

MfG Hannes

Sauerbruch
29.04.2012, 18:11
Im Prinzip kann man 1wire ja auch nachmachen: Wird die Versorgungsspannung kurz unterbrochen entspricht das einer "1", und eine längere Unterbrechung einer "0". Zum Beispiel 1 ms und 2 ms.

Die Versorgungsspannung wird wie schon beschrieben mit ´nem Kondensator gepuffert, der für so kurze Zeitintervalle aber keine gigantische Kapazität braucht. Wichtig ist natürlich die Diode davor, damit die gemeinsame Spannungs- und Datenleitung auch wirklich auf Low gehen kann, und nicht vom Kondensator auf High gehalten wird.

Mit diesen kurzen oder längeren Pausen auf der Leitung machst Du folgendes:

Beide Flanken triggern einen Interrupt. Bei der fallenden (d.h. der Pin ist Low) wird ein Timer gestartet. Bei der steigenden (Pin = High) wird der Timer gestoppt und abgefragt. Ist er weiter gelaufen als in 1 ms, wird ein entsprechendes Bit auf 1 gesetzt, ansonsten auf 0. Anschließend wird der Timer natürlich wieder resettet für die nächste Runde.

Gleichzeitig kannst Du noch eine Zählvariable bei jeder steigenden Flanke von hochzählen lassen und aus den einzelnen Bits ein Byte bauen. Ist die Zählvaraible 7, ist das Byte fertig, was dem Hauptprogramm mit einem entsprechenden Flag angezeigt werden kann .

Das ganze mal als Code (Taktfrequenz z.B. 1 MHz, Interrupt = INT0 = PIND.2, 8-bit Timer0):



Config timer0 = timer, prescale = 64 ' Zählt in 1 ms bis ca. 15, in 2 ms bis ca. 30

Dim My_bit as bit ' Variable für jedes empfangene Bit
Dim My_byte as byte ' Variable für das empfangene Byte
Dim Byte_ready as bit ' Flag für fertig empfangenes byte
Dim I as Byte ' Zählvariable


Config INT0 = Change ' Interrupt 0 bei steigender und fallender Flanke
On INT0 Flanke
Enable INT0
Enable Interrupts

Do

If Byte_ready = 1 then
Byte_ready = 0
... ' Neues Byte empfangen: Was auch immer damit geschehen soll...
...
...
End if


Loop


Flanke:
If PIND.2 = 0 then ' fallende Flanke
Start timer0
Else ' steigende Flanke
Stop timer0
If timer0 < 20 then My_bit = 1 else My_bit = 0
timer0 = 0
My_byte(I) = My_bit
If I < 7 then ' Noch keine 8 Bits empfangen
I = I +1
Else ' 8 Bits empfangen: Byte fertig!
I = 0
Byte_ready = 1
End if
End if

Return




Edit: Und natürlich ein "Return" am Schluss der ISR...