Hallo, ich bin ein Maschinenbauer, hab Grundkenntnisse in Elektrotechnik,aber bis jetzt habe ich mit einem Mikrocontroller kaum zu tun gehabt. Ich habe zwar ein bisschen theoretisches Wisse, aber habe noch nie etwas programmiert. Nun wollte ich jetzt mit einem Mikrocontroller "PIC32MZ2048EFH100" ein Projekt realisieren und bräuchte Eure Hilfe. Es geht um Folgendes: Geht eine Elektrische Schiebetür auf, leuchtet ein Lämpchen und es bleibt an bis die Tür wider zu geht. Die Alarmanlage soll erkennen wann die Tür auf und zu geht, aber da die Alarmanlage das Signal von dem Lämpchen empfängt und dies ein PWM-Signal ist, denkt sie dass die Tür jede 11.4 ms auf und zu geht. Jetzt suche ich nach einer Lösung, wie dieses PWM-Signal-Problem mittels Mikrocontroller und Software behoben werden kann. Ich weiss zwar, dass es mit Timer, Interrupts und Input Capture gearbeitet werden muss, aber leider habe ich bis jetzt noch nichts konkretes und komme kaum voran. Eingesetzte Hardwer: Development Board "Explorer 16" mit einem Eval Board "PIC32MZ EF PIM". Programmiersprache C. Hat jemand von Euch schon einen Quelcode für PWM-Signal Verarbeitung? So könnte ich zu mindest den aufbau verstehen. Wenn Ihr mir helfen könntet, wäre ich wirklich sehr dankbar! Viele Grüße Andre
Lex A. schrieb: > Hat jemand von Euch schon einen Quelcode für PWM-Signal Verarbeitung? Das ist wohl zu individuell, um da ne eierlegende Wollmilchsau für zu bauen ;) Der PIC hat doch sicher ein Komparator-Modul!? Da das PWM Signal drauf legen. Interrupt nicht zulassen, mit <1/2 PWM-Frequenz abfragen und löschen.....
:
Bearbeitet durch User
Lex A. schrieb: > Es geht um Folgendes: Geht eine Elektrische Schiebetür auf, leuchtet ein > Lämpchen und es bleibt an bis die Tür wider zu geht. Die Alarmanlage > soll erkennen wann die Tür auf und zu geht, aber da die Alarmanlage das > Signal von dem Lämpchen empfängt und dies ein PWM-Signal ist, denkt sie > dass die Tür jede 11.4 ms auf und zu geht. Also muss das Signal zur Alarmanlage im Grunde so HIGH sein, wie sie Lampe "optisch" an ist. Dafür würde ein einfaches Monoflop reichen. Vielleicht erklärst du ein wenig mehr zu diesem Punkt, wie genau das PWM-Signal aussieht und wie die Alarmanlage es haben will - falls ich es bisher falsch verstanden habe.
Teo D. schrieb: Danke für deine Antwort. > Das ist wohl zu individuell, um da ne eierlegende Wollmilchsau für zu > bauen ;) Ja das ist mir schon klar, dass es zu individuell ist, aber so könnte ich zumindes einen aufbau sehen. :D > > Der PIC hat doch sicher ein Komparator-Modul!? > Da das PWM Signal drauf legen. Interrupt nicht zulassen, mit <1/2 > PWM-Frequenz abfragen und löschen..... Ich verstehe ein bisschen was du meinst, aber wie kann ich das Softwermesig realisieren? Da habe ich wirklich viel zu wenig Kentnisse.
Stefan S. schrieb: Danke Stefan für deine Antwort. > Also muss das Signal zur Alarmanlage im Grunde so HIGH sein, wie sie > Lampe "optisch" an ist. Ja genau. > Vielleicht erklärst du ein wenig mehr zu diesem Punkt, wie genau das > PWM-Signal aussieht und wie die Alarmanlage es haben will - falls ich es > bisher falsch verstanden habe. Leider habe ich grad kein Bild aus Osci, aber ich versuche es zu erklären. Wenn das Lämpchen an ist, das Signal sieht volgendermassen aus: 11.4ms auf high und 1.4ms auf low. So geht es weiter peryodisch, bis die Tür wider zu geht. Die Alarmanlage muss detektieren, wann die Tür sich öffnet und wann sie zu geht. Theoretisch sobald das Signal am Lämpchen auf low ist, die Alarmanlage weiss, dass die Tür zu ist. Aber da das Signal ständig von high zu low wechselt, wird das ausgewertet als ob die Tür ständig auf und zu gehen würde. Also für die Alarmanlage ist das erste high und letzte low Signal wichtig. Der Rest muss einfach ignoriert werden. Hoffentlich habe ich verständlich erklärt. :)
Lex A. schrieb: > Da habe ich wirklich viel zu wenig Kentnisse. Das lässt sich ändern :) http://www.sprut.de/electronic/pic/index.htm
Lex A. schrieb: > Leider habe ich grad kein Bild aus Osci, aber ich versuche es zu > erklären. > Wenn das Lämpchen an ist, das Signal sieht volgendermassen aus: 11.4ms > auf high und 1.4ms auf low. So geht es weiter peryodisch, bis die Tür > wider zu geht. > Die Alarmanlage muss detektieren, wann die Tür sich öffnet und wann sie > zu geht. Theoretisch sobald das Signal am Lämpchen auf low ist, die > Alarmanlage weiss, dass die Tür zu ist. Aber da das Signal ständig von > high zu low wechselt, wird das ausgewertet als ob die Tür ständig auf > und zu gehen würde. > Also für die Alarmanlage ist das erste high und letzte low Signal > wichtig. Der Rest muss einfach ignoriert werden. > Hoffentlich habe ich verständlich erklärt. :) Ja das ist doch - für mich - sehr verständlich. Ich würde - an deiner Stelle, da du davon keine Ahnung hast - dafür keinen Mikrocontroller nehmen. Ich würde ein einfaches Monoflop mit einer Zeitkonstante von etwas mehr als 1,4ms nehmen. Such einfach mal nach Monoflop bei Google, entweder mit einem NE555 (der Klassiker) oder einen 4000er Baustein oder einem 74xxer. Die Auswahl an Standardbauteilen ist groß und es gibt gerade für den NE555 sehr viele Berechnungstools online, die dir direkt die benötigten Werte ausspucken.
Teo D. schrieb: > > Das lässt sich ändern :) > http://www.sprut.de/electronic/pic/index.htm Danke! Auf dieser Seite habe ich schon viele hilfreiche Informationen gelesen, aber leider steht da viel zu wenig über PIC32 :)
Stefan S. schrieb: > Ja das ist doch - für mich - sehr verständlich. Hoffentlich meinst du das nicht irronisch. > Ich würde - an deiner Stelle, da du davon keine Ahnung hast - dafür > keinen Mikrocontroller nehmen. Ich würde ein einfaches Monoflop mit > einer Zeitkonstante von etwas mehr als 1,4ms nehmen. > Such einfach mal nach Monoflop bei Google, entweder mit einem NE555 (der > Klassiker) oder einen 4000er Baustein oder einem 74xxer. Die Auswahl an > Standardbauteilen ist groß und es gibt gerade für den NE555 sehr viele > Berechnungstools online, die dir direkt die benötigten Werte ausspucken. Wie gesagt ich bin ein Maschinenbauer und ist mir auch bewusst, dass ich mit Mikrocontroller nicht viele Ahnung habe. Vielleicht mit einem Monoflop lässt sich das Problem einfacher lösen, aber da habe ich genau so viele Ahnung wie mit Mikrocontroller. Und da ich mich schon mit Mikrocontroller bisschen eingearbeitet habe, würde ich lieber so weiter machen. Vor allem finde ich das sehr spannend und interessant. Aber danke für dein Tipp!
Da gibt es so viele Möglichkeiten. Eine wäre Change Notification Pins zu nutzen. Bei jeder Änderung gibt es einen Interrupt und du kannst in dem Interrupt prüfen ob der Port High oder Low ist. Wenn der Port Länger als 1,4ms low ist ist die Tür zu.
oh schrieb: > rc-glied.... > > Gruß J Genau, ich denke auch, dass es so am einfachsten ist, wenn man beim eine Mikrocontroller-Lösung will. RC-Filter an den Analogeingang und alle 100ms mal nachmessen, ob ein Wert deutlich größer 0 anliegt. Du hast dir natürlich mit dem großen PIC einen sehr komplizierten Controller(viele Einstellmöglichkeiten) ausgesucht. Vielleicht hilft da der Codegenerator Harmony. Auf einem Arduino wäre das sicherlich in kleiner 10 Zeilen erledigt...
Bei dem Develop Board sind doch Code Beispiele. Ich würde auf so einem aufbauen, alles unnötige raus und diesen dann Stück für Stück erweitern.
FÜr Cange Notice könnte ich Dir sogar ein paar Code Schnipsel einstellen. Initialisierung und den Interrupt.
Hier mal wie man den CN initialisiert und die Int Routine den Rest musst Du selber basteln:
Es gibt halt noch Leute die wollen programmieren lernen und nicht nur dumm irgendwas zusammen klicken wie bei Arduino. > Auf einem Arduino wäre das sicherlich in kleiner 10 Zeilen > erledigt... Aber anscheinend gehörst du auch zu dieser Gattung.
Du könntest ein Byte als Schieberegister einrichten. Also jede ms die Bits nach links schieben und das Signal als Bit 0 einfügen. Wenn das Lämpchen aus ist, ist das Byte nach 8ms gleich Null. Wenn es ungleich Null ist, ist es an.
Da hast du dir aber auch einen Controller ausgesucht. Den hat ja kaum einer und da wird es mit Hilfe auch schwer. Da ich den selber auch nicht habe, kann ich dir da auch nicht weiter helfen. Bei einem anderen Pic Controller wäre das schnell erledigt gewesen.
Vielen Dank für Eure Vorschläge! Ich habe noch etwas entdeckt, was ich früher nicht bemerkt hatte. Das PWM-Signal ändert sich mit dem Tagesablauf. Z.B morgens sind die Pulsdauer länger, wie abends (morgens leuchtet das Lämpchen stärker, wie abends). Also 1,4ms zu messen, hätte das nur abends funktioniert. Da es hier sich um ein PWM-Signal handelt, die Periode bleibt immer gleich. Also meine Überlegung wäre: bei jeder steigenden Flanke gibt es einen Interrupt, der den Timer neustartet. Gibt es keine steigende Flanke mehr, zählt der Timer bisschen mehr als eine Periode und wird ein Null ausgegeben. Theoretisch sollte das funktionieren. Jetzt muss ich nur noch einen Code dafür schreiben, was mir nicht so einfach fällt. Wenn jemand mir helfen könnte, wäre ich sehr dankbar.
PIC32 schrieb im Beitrag #4679433: > Hier mal wie man den CN initialisiert und die Int Routine > den Rest musst Du selber basteln: Danke für deinen Code, aber irgendwie läuft er auf meinen PIC nicht. Wie ich weiss, bei PIC32MZ die Befehle wie z.B. mCNSetIntPriority(7); mCNSetIntSubPriority(3); existieren nicht mehr.
Stefan schrieb: > Da hast du dir aber auch einen Controller > ausgesucht. Den hat ja kaum einer und da wird > es mit Hilfe auch schwer. > Da ich den selber auch nicht habe, kann ich dir > da auch nicht weiter helfen. Bei einem anderen > Pic Controller wäre das schnell erledigt gewesen. Ja du hast vollkommen Recht, den Controller hat nicht jeder und es ist sehr schwer die nützlichen Informationen zu finden. Den Controller hab ich nicht selber ausgesucht, einfach stand er zur Verfügung. :)
Lex A. schrieb: > Also meine Überlegung wäre: bei jeder steigenden Flanke gibt es einen > Interrupt, der den Timer neustartet. Gibt es keine steigende Flanke > mehr, zählt der Timer bisschen mehr als eine Periode und wird ein Null > ausgegeben. Da werden doch nur sinnlos viel Interrupts ausgelöst. Teo D. schrieb: > Da das PWM Signal drauf legen. Interrupt nicht zulassen, mit <1/2 > PWM-Frequenz abfragen und löschen..... Da läuft der Timer einfach durch und setzt dir Flags, je nach gewünschten Zeiteinheiten, 10ms,50, 1s .... was man halt so braucht. Der Prozessor muss schließlich nicht alles sinnlos so oft wiederholen wie möglich. In der Hauptschleife die Flägs dann abfragen und wie benötigt, die Funktionen in den jeweiligen Zeitslot hängen. Da bleibt dann auch noch genug Zeit für wirklich Zeitkritische Dinge :) https://www.mikrocontroller.net/articles/Multitasking
Danke für deinen Vorschlag! Teo D. schrieb: > Lex A. schrieb: >> Also meine Überlegung wäre: bei jeder steigenden Flanke gibt es einen >> Interrupt, der den Timer neustartet. Gibt es keine steigende Flanke >> mehr, zählt der Timer bisschen mehr als eine Periode und wird ein Null >> ausgegeben. > > Da werden doch nur sinnlos viel Interrupts ausgelöst. Ist das schlimm? > Teo D. schrieb: >> Da das PWM Signal drauf legen. Interrupt nicht zulassen, mit <1/2 >> PWM-Frequenz abfragen und löschen..... Leider verstehe ich nicht ganz, was du da meinst.
Lex A. schrieb: > Ist das schlimm? Nö... Lex A. schrieb: >> Teo D. schrieb: >>> Da das PWM Signal drauf legen. Interrupt nicht zulassen, mit <1/2 >>> PWM-Frequenz abfragen und löschen..... > > Leider verstehe ich nicht ganz, was du da meinst. OK, Du legst das empfangene PWM-Signal in geeigneter weise auf einen einen Rising-Edge Interrupt fähigen Eingang, der natürlich auch so konfiguriert sein muss. Du schreibst KEINE Int-Funktion die diesen verarbeitet! Wenn dieser Int also NICHT zugelassen, sprich gesperrt bleibt, wird aber weiterhin das zugehörige Int-Flag gesetzt. Dies kannst Du nun, wann und wo Du willst, im Programm abfragen. In diesem Fall musst Du dich allerdings selbst um das Löschen/rücksetzen des Int-Flags kümmern. Das Int-Flag speichert Dir also das auftreten eines Ereignisses seit der letzten Abfrage. Machst Du das mit weniger als der halben PWM-Frequenz, ist es egal ob 1% oder 99% PWM. Nur kannst Du 0% nicht von 100% unterscheiden, das sollte aber in Deinem Fall nicht relevant sein? Und wenn doch wird's auch nich viel komplizierter.
Teo D. schrieb: > OK, Du legst das empfangene PWM-Signal in geeigneter weise auf einen > einen Rising-Edge Interrupt fähigen Eingang, der natürlich auch so > konfiguriert sein muss. Du schreibst KEINE Int-Funktion die diesen > verarbeitet! > Wenn dieser Int also NICHT zugelassen, sprich gesperrt bleibt, wird aber > weiterhin das zugehörige Int-Flag gesetzt. Dies kannst Du nun, wann und > wo Du willst, im Programm abfragen. In diesem Fall musst Du dich > allerdings selbst um das Löschen/rücksetzen des Int-Flags kümmern. > Das Int-Flag speichert Dir also das auftreten eines Ereignisses seit der > letzten Abfrage. Machst Du das mit weniger als der halben PWM-Frequenz, > ist es egal ob 1% oder 99% PWM. Nur kannst Du 0% nicht von 100% > unterscheiden, das sollte aber in Deinem Fall nicht relevant sein? Und > wenn doch wird's auch nich viel komplizierter. Danke dir! Jetzt habe ich verstanden, was du meinst. Aber ob deine Variante einfacher zum Programmieren ist, weiss ich noch nicht. :)
Bitte, immer wieder gerne..... Lex A. schrieb: > Aber ob deine Variante einfacher zum Programmieren ist, weiss ich noch > nicht. :) Falls Du eine einfachere Methode findest gib laut, muss schließlich auch noch lernen.... bin ja noch nicht Tod :) Allerdings, verbunden mit dem vorgeschlagenem Task-Scheduler, dürften das kein Dutzend Zeilen sein :)
:
Bearbeitet durch User
Teo D. schrieb: > Falls Du eine einfachere Methode findest gib laut, muss schließlich auch > noch lernen.... bin ja noch nicht Tod :) Ich hatte gesagt, weiss NOCH NICHT, ob deine Variante einfacher zum Programmieren ist. Muss ja erstmal gucken, wie man das programmiert. :) > Allerdings, verbunden mit dem vorgeschlagenem Task-Scheduler, dürften > das kein Dutzend Zeilen sein :) Dann freue ich mich! :)
Hallo, um eine derart komplexe Aufgabe zu lösen würde ich einen Intel i7 prozessor vorschlagen!
Also, eine 200MIPS Maschine mit FPU, 2MB Flash, CAN, Ethernet, 78 I/Os uvm. mit so einer Aufgabe zu beschäftigen, ist schon ... naja ... :-) Auch wenn diese Rakete schon da ist und sie Dich nichts gekostet hat: Der Controller ist nicht unbedingt für Einsteiger geeignet. Ich programmiere den selber. Ist ein geiles Teil und rechnet wirklich etwas weg. Aber der ist wirklich oversized. Sowohl für die Aufgabe, als auch für einen Anfänger. Wenn Du für Dein Problem schnellstens eine Lösung haben möchtest, schlage ich RC-Glied + Komparator vor. (Benötigt keine SW) Und mit dem PIC machst Du etwas anderes. Wenn Dich das noch nicht davon abhält. dann schlage ich als Lektüre die Datenblätter (!) zum Einstieg für Dein Problem vor: 60001320C.pdf, 60001120F.pdf, 61112H.pdf, 60001122G.pdf, 60001124G.pdf Um den Controller komplett kennen zu lernen, fehlen da noch ca. 40 PDFs Geschätzte 70MB Dokumentation ... Gruß Jobst
Jobst M. schrieb: > Also, eine 200MIPS Maschine mit FPU, 2MB Flash, CAN, Ethernet, 78 I/Os > uvm. mit so einer Aufgabe zu beschäftigen, ist schon ... naja ... :-) > Auch wenn diese Rakete schon da ist und sie Dich nichts gekostet hat: > Der Controller ist nicht unbedingt für Einsteiger geeignet. Ich > programmiere den selber. Ist ein geiles Teil und rechnet wirklich etwas > weg. Aber der ist wirklich oversized. Sowohl für die Aufgabe, als auch > für einen Anfänger. > > Wenn Du für Dein Problem schnellstens eine Lösung haben möchtest, > schlage ich RC-Glied + Komparator vor. (Benötigt keine SW) > > Und mit dem PIC machst Du etwas anderes. > > Wenn Dich das noch nicht davon abhält. dann schlage ich als Lektüre die > Datenblätter (!) zum Einstieg für Dein Problem vor: > 60001320C.pdf, 60001120F.pdf, 61112H.pdf, 60001122G.pdf, 60001124G.pdf Ja ich weiß, dass dieses Teil schon komplex und nicht ganz für Anfänger geeignet ist, aber war sehr interessant mit dem Teil zu arbeiten. Das Problem habe ich ganz einfach mit einem Interrupt und Timer Funktion gelöst. Ja die Dokumentation ist enorm und leider ohne sie kommt man auch nicht viel weiter. Das hat mir schon Zeit gekostet, aber jetzt funktioniert alles wunderbar! :) Aus Spass will ich nur noch Datenausgabe mit einer RS232 Schnittstelle machen und das klappt noch nitcht ganz. Gruß Andre
Lex A. schrieb: > habe noch nie etwas programmiert Lex A. schrieb: > Das > Problem habe ich ganz einfach mit einem Interrupt und Timer Funktion > gelöst. In einer Woche mit einem PIC32 von 0 auf 100 ... Respekt.
> Aus Spass will ich nur noch Datenausgabe mit einer RS232 Schnittstelle > machen und das klappt noch nitcht ganz. Wenn du das andere schon so schnell gelöst hast, wird die RS232 Ausgabe ein Klacks für dich sein :)
liebe Community, ich glaube wir sind jemandem auf den Leim gekrochen....
Profiprog schrieb: > liebe Community, > ich glaube wir sind jemandem auf den Leim gekrochen.... Aha? Könnten Sie das bitte näher erläutern? Sonst gilt: Mir will nicht einleuchten, warum man nicht mit dicken Brocken anfangen können soll. Die Schwierigkeit für einen Anfänger ist höchstens die Oszillatorkonfiguration. Und die kann man einfach auf Default lassen, oder ein Beispielprojekt nehmen. Macht man das, ist ein PIC32-Timer auch nicht viel komplexer als der eines PIC18. Selbiges gilt für fast alle andere Peripherie. Der MZ hat halt etwas mehr drin...
Jobst M. schrieb: > Lex A. schrieb: >> habe noch nie etwas programmiert > > Lex A. schrieb: >> Das >> Problem habe ich ganz einfach mit einem Interrupt und Timer Funktion >> gelöst. > > In einer Woche mit einem PIC32 von 0 auf 100 ... > Respekt. Danke,aber mein erster Beitrag war nicht vor einer Woche sondern vor einem Monat und in einem Monat kan man schon viel lernen.
1N4148 schrieb im Beitrag #4720750: >> Aus Spass will ich nur noch Datenausgabe mit einer RS232 Schnittstelle >> machen und das klappt noch nitcht ganz. > > Wenn du das andere schon so schnell gelöst hast, wird die RS232 Ausgabe > ein Klacks für dich sein :) Ein Klacks war das nicht, war schon Zeitaufwendig um alles richtig einzustellen, aber jetzt funktioniert! ;)
Gästchen schrieb: > > Sonst gilt: > Mir will nicht einleuchten, warum man nicht mit dicken Brocken anfangen > können soll. Die Schwierigkeit für einen Anfänger ist höchstens die > Oszillatorkonfiguration. Und die kann man einfach auf Default lassen, > oder ein Beispielprojekt nehmen. > > Macht man das, ist ein PIC32-Timer auch nicht viel komplexer als der > eines PIC18. Selbiges gilt für fast alle andere Peripherie. Der MZ hat > halt etwas mehr drin... Hast vollkommen Recht, am Anfang war bisschen schwierig mit ganzen Konfigurationen, aber wenn man versteht was man macht und was man machen will, dann kalppt's immer. :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.