Sensor Aktor Modul - Drehzahlberechnung bei versch. Spannungen
-
Hallo Leute, hab nachdem ich nicht sicher bin ob diese Aufgabe so funktioniert dieses Forum gefunden. Hoffe ihr könnt mir helfen
Ziel ist es, über die Tastatur einen Wert von 0.0 bis 5.0 einzugeben, der dann über den ADU als Spannung auf einen Motor gegeben wird wobei 255 die maximalen 5V wären. Dieser treibt eine Lochscheibe mit Lichtschranke als Drehwinkelgeber mit einem 16-Bit-Zähler für die Impulse des Drehwinkelgebers an.
Wäre schön, wenn mal jemand drüberschaun könnte. Kann die Funktion leider erst morgen früh überprüfen.
//Schalter für das Benutzen des Sensor-Aktor-Modul-Dummys //auskommentiert: Zugriff auf reale Hardware //nicht auskommentiert: Dummy wird verwendet #define _SIMULATION //Einbinden der Funktionen für den Zugriff //auf das Sensor-Aktor-Modul #include "SensorAktor.h" //zusätzliche (Standard-)Funktionsbibliotheken einbinden #include <stdio.h> #include <windows.h> #include <conio.h> //Vorschlag für Funktionsprototypen int low, high,gesamtzaehler,zaehler,motorspannunga; double msve,msva; bool status; //Motorspannung schreiben void Schreiben() { WriteCommand(0); //status false status=ReadStatus(); // Statusbit abfragen while (status==false) { printf ("Geben Sie eine Motorspannung von 0 bis 5V ein:"); scanf_s("%d",&msve); //motorspannung in volt WriteCommand(3); //Statusbit auf true setzen status=ReadStatus(); } msva=(msve/5)*255; int daten= (int) msva; //Gleitkommazahlwert in integer wert umformen WritePortB(daten); // schreibt die Daten an Port B } //Motordrehzahl auslesen void Lesen() { //Messzeit abwarten Sleep(1000); WriteCommand(0); //status false status=ReadStatus(); // Statusbit abfragen while (status==false) { WriteCommand(7); //Zähler löschen status=ReadStatus(); // Statusbit abfragen } //Messzeit abwarten Sleep(1000); //Zähler Low lesen WriteCommand(0); //status auf false setzen status=ReadStatus(); // Statusbit abfragen while (status==false) { WriteCommand(8); //Zähler löschen status=ReadStatus(); // Statusbit abfragen } low = ReadPortA(); // liest die Daten von Port A //Zähler high lesen WriteCommand(0); //status false status=ReadStatus(); // Statusbit abfragen while (status==false) { WriteCommand(9); //Zähler löschen status=ReadStatus(); // Statusbit abfragen } high = ReadPortA(); //Zählerzahl berechnen high=high*256; zaehler=low+high; gesamtzaehler=(zaehler*60)/4; //Umdrehungszahl (U/min)= (zaehler mal 60 sekunden)/4 Schlitze pro Umdrehung) printf ("\Drehzal:%d m\n\n\n",gesamtzaehler); //Motorspannung auslesen WriteCommand(0); //status false status=ReadStatus(); // Statusbit abfragen while (status==false) { WriteCommand(4); //Zähler löschen motorspannunga=ReadStatus(); // Statusbit abfragen } printf ("\Motorspannung:%d m\n\n\n",motorspannunga); } //Hauptprogramm void main (void) { IsPCI6503Available(); //Eigenes Programm while (msve=!0.0) { //Motorspannung schreiben Schreiben(); Lesen(); } // Schleife verlassen, Motordrehzahl runterfahren WriteCommand(3); //Statusbit auf true setzen WritePortB(0); // schreibt die Daten an Port B }
Danke schonmal für jede Hilfe
-
da_miez schrieb:
Hoffe ihr könnt mir helfen
Danke schonmal für jede Hilfe
Wobei? Was ist deine Frage? Lies dir bitte mal den ersten Link in meiner Signatur durch.
Außerdem ist dies mit Sicherheit das falsche Forum. Je nach Schwerpunkt deiner Frage (welche auch immer das sein mag) gehört das in C (das ist die Sprache, die du benutzt), DOS-Konsole (das ist die von dir gewählte Ausgabeform), Winapi (das ist die von dir gewählte Betriebssystemapi) oder Rund um die Porgrammierung (allgemeine Fragen). Aber es ist kein C++.
-
Frage war im Grund: ...nachdem ich nicht sicher bin ob diese Aufgabe so funktioniert...
Ist die dritte Aufgabe in diesem Semester und ich frage mich ob die herangehensweise so richtig ist.
Wenn mich ein Anfänger z.B. was über digitale Schaltungssynthese fragt, kann ich zumindest die Funktionen mal überfliegen und sagen obs in die richtige Richtung geht.
Da ich aber erst dieses Semester Programmiersprachen hab und vorher zB in JAVA und Basic programmiert habe würde mich halt interessieren, obs so klappen kann oder ob ich morgen mit nem völlig falschen Ansatz dastehe.
Hmm, wie gesagt, ich Programmiere mit Microsoft Visual Studio und die Dateiendungen sind auch *.cpp und die Vorlesung handelt auch nur von C++ . Die Unterschiede von C zu C++ kann ich leider nicht beurteilen.
Sorry, wenn das Posting im falschen Forum gelandet ist..
-
So, bin jetzt weitergekommen und die Simulation funktioniert auch.
Es gibt nur noch ein Problem:Bei der Eingabe der Spannung, ist die erste Ausgabe 0 . Mit der nächsten Eingabe wird der vorherige Wert genommen. Vermute irgendwo einen Schleifenfehler.
Kann mir jetzt jemand helfen?
----------------------------------
Beispiel:
"Geben Sie eine Motorspannung von 0 bis 5V ein:" 3
Drehzahl: 0
Motorspannung:0"Geben Sie eine Motorspannung von 0 bis 5V ein:" 2
Drehzahl: 3270 u/min
Motorspannung:3 Volt"Geben Sie eine Motorspannung von 0 bis 5V ein:" 5
Drehzahl: 2040 u/min
Motorspannung:2 VoltKann ich den Thread selbst in ein anderes Forum schieben? Falls nicht könnte es ja der Moderator machen.
Danke schonmal//Schalter für das Benutzen des Sensor-Aktor-Modul-Dummys //auskommentiert: Zugriff auf reale Hardware //nicht auskommentiert: Dummy wird verwendet #define _SIMULATION //Einbinden der Funktionen für den Zugriff //auf das Sensor-Aktor-Modul #include "SensorAktor.h" //zusätzliche (Standard-)Funktionsbibliotheken einbinden #include <stdio.h> #include <windows.h> //Vorschlag für Funktionsprototypen int low,high,highn,gesamtzaehler,zaehler,motorspannunga; double msve,msva; bool status; //Motorspannung schreiben void Schreiben() { WriteCommand(0); //status false status=ReadStatus(); // Statusbit abfragen while (status==false) { printf ("Geben Sie eine Motorspannung von 0 bis 5V ein:"); //msve=0.0; scanf_s("%lf",&msve); //motorspannung in volt WriteCommand(3); //Statusbit Spannung setzen status=ReadStatus(); } msva=(msve/5)*255; int daten= (int) msva; //Gleitkommazahlwert in integer wert umformen WritePortB(daten); // schreibt die Daten an Port B } //Motordrehzahl auslesen void Lesen() { //Messzeit abwarten Sleep(1000); WriteCommand(0); //status false status=ReadStatus(); // Statusbit abfragen while (status==false) { WriteCommand(7); //Zähler löschen status=ReadStatus(); // Statusbit abfragen } //Messzeit abwarten Sleep(1000); //Zähler Low lesen WriteCommand(0); //status auf false setzen status=ReadStatus(); // Statusbit abfragen while (status==false) { WriteCommand(8); //Zähler low auslesen status=ReadStatus(); // Statusbit abfragen } low = ReadPortA(); // liest die Daten für low von Port A //Zähler high lesen WriteCommand(0); //status false status=ReadStatus(); // Statusbit abfragen while (status==false) { WriteCommand(9); //Zähler High lesen status=ReadStatus(); // Statusbit abfragen } high = ReadPortA(); //Zählerzahl berechnen highn=high*256; zaehler=low+highn; gesamtzaehler=(zaehler*60)/4; //Umdrehungszahl (U/min)= (zaehler mal 60 sekunden)/4 Schlitze pro Umdrehung) printf ("\Drehzal:%d u/min \n\n\n",gesamtzaehler); //Motorspannung auslesen WriteCommand(0); //status false status=ReadStatus(); // Statusbit abfragen while (status==false) { WriteCommand(4); //Sollwert Motor Spannung lesen status=ReadStatus(); // Statusbit abfragen } //Auslesen aus Port A motorspannunga = ReadPortA(); motorspannunga=(motorspannunga*5)/255; printf ("\Motorspannung:%d V\n\n\n",motorspannunga); } //Hauptprogramm void main (void) { IsPCI6503Available(); msve=0.01; status==false; //Eigenes Programm while (msve!=0.0) { //Motorspannung schreiben Schreiben(); Lesen(); } // Schleife verlassen, Motordrehzahl runterfahren WriteCommand(0); //status false status=ReadStatus(); // Statusbit abfragen while (status==false) { WriteCommand(3); //Kommando Motor Spannung schreiben status=ReadStatus(); // Statusbit abfragen } msva=(msve/5)*255; int daten= (int) msva; //Gleitkommazahlwert in integer wert umformen WritePortB(daten); // schreibt die Daten an Port B }
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89 und C99) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Rück mal vernünftig ein. Du überschreibst erst die vorherigen Antworten und wertest dann nur die letzte Antwort aus.
-
SeppJ schrieb:
Rück mal vernünftig ein. Du überschreibst erst die vorherigen Antworten und wertest dann nur die letzte Antwort aus.
Habs jetzt hoffentlich richtig eingerückt.
In welcher Zeile ist denn der Fehler? Kann mit der Antwort irgendwie nicht wirklich was anfangen
-
Bei näherer Betrachtung sieht es nur falsch aus, erklärt aber deinen Fehler nicht. Um deinen Fehler zu klären, müsste man den relevanten Code kennen. Hierzu empfehle ich den dritten Link in meiner Signatur.
-
Naja,
hab den Fehler jetzt selber gefunden...Weiß nicht, bin von anderen Foren irgendwie mit mehr Hilfsbereitschaft verwöhnt.
Ich helfe nebenbei auch gerne und oft wo ich kann, mein Wissen bezieht sich halt mehr auf die Elektronik.In dem Fall finde ich sollte man halt doch die Aufgabenstellung und meine Implementierung komplett kennen, soviel Text isses ja nicht und da das Anfängeraufgaben sind sollten sie ja in so einem Forum ohne Probleme verstanden werden...
Grade bei solchen Fehlern hilft es oft wenns ein anderer mal überfliegt, wenn man selber stundenlang auf den Code gesehen hat..Dafür ist es doch da, dass man Hilfe von Leuten bekommt die auf dem Gebiet grade besser sind und Hilfe gibt wenn man selbst mehr Ahnung hat.
Naja, trotzdem Danke..
void main (void) { IsPCI6503Available(); msve=0.01; status==false; //Eigenes Programm while (msve!=0.0) { //Motorspannung schreiben Lesen(); Schreiben(); // Schleife verlassen, Motordrehzahl runterfahren WriteCommand(0); //status false status=ReadStatus(); // Statusbit abfragen while (status==false) { WriteCommand(3); //Kommando Motor Spannung schreiben status=ReadStatus(); // Statusbit abfragen } msva=(msve/5)*255; int daten= (int) msva; //Gleitkommazahlwert in integer wert umformen WritePortB(daten); // schreibt die Daten an Port B } // Diese Klammer war falsch gesetzt hat den Block nicht mit eingeschlossen }
-
da_miez schrieb:
Weiß nicht, bin von anderen Foren irgendwie mit mehr Hilfsbereitschaft verwöhnt.
Ich helfe nebenbei auch gerne und oft wo ich kann, mein Wissen bezieht sich halt mehr auf die Elektronik.Lol, wut?
Du liest die mit wichtig markierten Threads nicht, du schreibst im komplett falschen Forum, du zeigst den relevanten Code nicht, du stellst keine klare Frage. Du hast echt Glück, dass ich geantwortet habe und nicht eines der Forenmitglieder mit noch direkterer Sprache und findest das schon unhöflich?
Wenn dir jemand einen Berg Elektroschrott vor die Füße schmeißt und sagt "Mach mal!", wie reagierst du dann?
-
Entschuldig, aber diese Klammer war immer da.
Ich hab da aber noch eine Frage zu Zeile 32:da_miez schrieb:
} // Diese Klammer war falsch gesetzt hat den Block nicht mit eingeschlossen } // Zeile 32: Und Wozu gehört diese Klammer :confused:
-
Ja, seh ich ein. War wohl etwas genervt, weil ich den ganzen Tag an so nem dämlichen Tippfehler dransaß
huch
-
Darum ist eine saubere Einrückung wichtig.
Und die (meisten) IDEs und Editoren zeigen dir auch die Klammerpaare an.
-
Ich nehme an der Beitragsersteller programmiert mit Visual C++ von M$.
Wenn das so ist, ich hab z.Z. kein M$ - C oder C++ Compiler am Start, wird das als C-Quelltext von Microsoft akzeptiert? Oder muss das, ich bin mir nicht ganz sicher wie viel C99 Microsoft zufällig beherrscht, unter Microsoft als C++ compiliert werden?
Andere Compiler dürften Probleme mit Besonderheiten von Microsoft-C in dem Quelltext haben.Das ist halt die Frage im realen C oder C++. Nur pur theoretisch den Standard oder auch die Besonderheiten grosser Compiler-Anbieter?
Eh jetzt jemand hektisch noch mal verschiebt. Wenn ihr das konsequent machen wollt, müsst ihr mehrere 100 Beiträge dann hier im Forum verschieben
Es gab Tage hier im Forum, an denen fast die Hälfte der Beiträge in C oder C++ falsch gelandet sind und das manchmal trotz mehrfacher Verschiebe-Aktionen.Wie schon angedeutet, wie perfekt wollt ihr das durchziehen
Nehmt es leicht
MfG f.-th.
-
f.-th. schrieb:
Wenn das so ist, ich hab z.Z. kein M$ - C oder C++ Compiler am Start,
Wen interessiert das?
-
Auch wenn die Deadline des Threadstarters schon verstrichen ist - hier mal meine aufgeräumte Lösung seines Problems:
#define _SIMULATION #include "SensorAktor.h" #include <stdio.h> #include <windows.h> unsigned char Lesen(unsigned char kommando){ WriteCommand(0); while (ReadStatus()==true); WriteCommand(kommando); while (ReadStatus()==false); return ReadPortA(); } void Schreiben(unsigned char kommando, unsigned char daten){ WriteCommand(0); while (ReadStatus()==true); WritePortB(daten); WriteCommand(kommando); while (ReadStatus()==false); } void main (void){ double x,drehzahl,spannung; IsPCI6503Available(); do{ do{ printf("Geben Sie eine Motorspannung zwischen 0 und 5 Volt ein: "); scanf("%lf",&x); if (x<0 || x>5)printf("\n Bitte geben Sie einen gueltigen Wert ein!\n"); } while (x<0 || x>5); if (x==0){Schreiben(3,0);break;} Schreiben(3,x*51); //Spannung setzen *255/5 Lesen(7); //Reset Sleep(1000); printf ("Drehzahl: %.2f U/min \n",drehzahl=(Lesen(8)+(Lesen(9)<<8))*15); //(Low+High[LeftShift8])*60Sek/4 Schlitze printf ("Motorspannung: %.2f V\n",spannung=(double)Lesen(4)/51); //Spannung lesen /255*5 }while(x!=0.0); }
Läuft so - und ist auch näher an der Aufgabenstellung was die Verwendung von Lesen() und Schreiben() anbelangt.
-
aGe schrieb:
Läuft so -
Typischer naiver Anfängerglaube.
- true/false ist C++, nicht C; wennschon, dann TRUE/FALSE aus windows.h
- unsinnige Definition von x als double
- unsinnige Gleichheitsvergleiche von double Variablen
- sinnfreies break bei if()
- void main() Anfängerschrott
- oberhässliche Einrückung (ist das überhaupt eine Einrückung?)
-
true - false
siehe: stdbool.hQuelle: Committee Draft N1570
-
Wutz schrieb:
aGe schrieb:
Läuft so -
Typischer naiver Anfängerglaube.
- true/false ist C++, nicht C; wennschon, dann TRUE/FALSE aus windows.h
- unsinnige Definition von x als double
- unsinnige Gleichheitsvergleiche von double Variablen
- sinnfreies break bei if()
- void main() Anfängerschrott
- oberhässliche Einrückung (ist das überhaupt eine Einrückung?)Läuft != beste Lösung der Welt...
Läuft == es funktioniert im Rahmen der Aufgabenstellung.- Über die Einordnung von C/C++ wurde hier im Thread schon diskutiert. Der Threadstarter betonte dabei, dass der Vorlesungsstoff und das Fach bei ihm eigentlich C++ Programmierung heißt. Es war deshalb auch ursprünglich im passenden Forenteil...
- X ist laut Aufgabenstellung ein beliebiger Wert zwischen 0 und 5, wobei Kommawerte eindeutig zugelassen sind.
- Die Gleichheitsvergleiche entstehen auch aus der Aufgabenstellung - so soll die Abfrage wiederholt werden wenn ein ungültiger Wert (außerhalb von 0 bis 5V) eingegeben wird.
- Break ebenfalls laut Aufgabenstellung, da das Programm enden soll, sobald eine Spannung von 0 eingegeben wird.
- void main () mag Anfängerschrott sein - sollte wohl aber bei einer Anfängervorlesung zu dem Thema nicht gänzlich unangebracht sein...
- oberhässlich? hm... Ästhetik war nicht Teil der Aufgabenstellung und liegt sicher im Auge des Betrachters... dass der Threadstarter in seiner Lösung 2x mehr Zeilen gebraucht hat, würde ich persönlich auch nicht "oberschön" finden.