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 🙂


  • Mod

    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 Volt

    Kann 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.


  • Mod

    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 😞


  • Mod

    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 
    
    }
    

  • Mod

    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.h

    Quelle: 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.


Anmelden zum Antworten