A/D-Wandlungswert in Umdrehungsgeschwindigkeit

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 28 12 2025  14:30:37      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


Autor
A/D-Wandlungswert in Umdrehungsgeschwindigkeit

    







BID = 565861

langerlause

Gerade angekommen


Beiträge: 8
 

  


Hallo zusammen,

ich programmiere einen at89c51cc03 (Atmel) mit dem TFH-Board-One und der Displayboard TFH-ABP-One.

Kurz zur Grundfunktion des gesamten Programms:

Steuerung eines 12VDC- Motors durch ein Potentiometer und Ausgabe der ungefähren Drehzahl auf das Display.

A/D-Wandlung, PWM und Displayansteuerung laufen zu 100%. Ich nehme den eingelesenen A/D-Wert als Vorlage für die PWM. Somit kann ich mit der H-Brücke L193d dem PWM-Signal und den zwei Drehrichtungssignalen, die ich über zwei Schalter eingeben möchte, die Drehrichtung und die Drehgeschwindigkeit steuern.

Die Drehgeschwindigkeit kann ich schon regeln. Das dumme ist nur, dass ich den genauen ausgerechneten Drehzahlwert nicht auf das Dislpay kriege!

Hab mir folgendes Gedacht:

Bei einer A/D-Wandler- Auflösung von 255 und einer maximalen Drehzahl von 330 U/min-->

x= Umrechnugsfaktor
ADC_Wert= der eingelesene Wandlungswert

x=(330/255)=> ca.:1.294

(Die Umrechnung hab ich im Programm weggelassen und sofort 1,294 genommen)

Umdreh=(x*ADC_WERT)

Das ist also meine Formel. Für die Displayausgabe benutze ich Funktionen(Programm im Anhang).

Ich kriege es nicht hin, dass der mir bei 100%er Aufsteuerung des Potis
330 U/min anzeigt. 0 U/min krieg ich hin ist ja ganz einfach->kein A/D-Einganswert->kein PWM-Signal-> Anzeige=0 :).

Das Display zeigt mir wirre Zahlen an. Mir scheint es fast so, als würde das Display 2x von 0-255 anzeigen.Dass heißt bei Mittelstellung des Potis fängt er bei 0 wieder an.

Wenn ich mit der Funktion dis_zei() mir den einfachen ADC_WERT ausgeben lassen will funktioniert das auch 100%ig, von 0-255!

Also denke ich mir das es an der Formel und/oder an der Variablendeklaration liegt.

Bitte helft mir sitze hier schon eine Woche dran und bekomme es nicht hin.

Danke im Voraus für Eure Antworten
LG

BID = 565864

hajos118

Schreibmaschine



Beiträge: 2453
Wohnort: Untermaiselstein

 

  

Versuch mal den unsigned char ADC_WERT in der Multiplikation zuerst mit (float)ADC_WERT umzuwandeln ...

edit: Alternativ zuerst mit 330 multiplizieren und annschliessend durch 256(!) dividieren (bzw. um 8 Bit nach rechts verschieben). dabei aber als LONGINT(o.ä.) deklarieren...

edit2: Noch ein Fehler entdeckt: "umdreh" ist eine float, wird aber als argument bei der Ausgabe an eine int Variable übergeben. Du solltest auf dei Ausgaben deines Compilers achten... der hat dies sicher angemosert!!!


_________________
Interpunktion und Orthographie dieses Beitrags sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Wer einen Fehler findet, darf ihn behalten!

[ Diese Nachricht wurde geändert von: hajos118 am 20 Nov 2008 16:40 ]

[ Diese Nachricht wurde geändert von: hajos118 am 20 Nov 2008 16:43 ]

BID = 565868

langerlause

Gerade angekommen


Beiträge: 8


Zitat :
hajos118 hat am 20 Nov 2008 16:37 geschrieben :

Versuch mal den unsigned char ADC_WERT in der Multiplikation zuerst mit (float)ADC_WERT umzuwandeln ...




Danke erstmal für die fixe Antwort. Meinst du das ich ADC_WERT direkt von Anfang an in float deklarieren soll oder nach dem der Wert dort drin ist, ihn von unsigned char in float umwandle?

fals du das zweitere meinst. weiß ich nicht wie das funktioniert hab das noch nie gemacht.


gruß




[ Diese Nachricht wurde geändert von: langerlause am 20 Nov 2008 16:51 ]

BID = 565871

hajos118

Schreibmaschine



Beiträge: 2453
Wohnort: Untermaiselstein

Diese Zeile hab' ich gemeint:


Code :


Umdreh=(1,294*ADC_WERT); // Umrechnung in Volt

neu:
Umdreh=(1,294* (float)ADC_WERT); // Umrechnung in Volt

oder:
Umdreh =(float)((330*ADC_WERT)>>8); // Umrechnung in Volt




_________________
Interpunktion und Orthographie dieses Beitrags sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Wer einen Fehler findet, darf ihn behalten!

BID = 565873

langerlause

Gerade angekommen


Beiträge: 8

Thx probier es gleich mal aus

bin ziemlich neu auf diesem Gebiet also bitte Gedult haben falls ich was nicht sofort verstehe.

danke

BID = 565874

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Wie kommst du denn auf die Idee, dass die Geschwindigkeit des Motors so genau dem Sollwert folgt ?

BID = 565875

langerlause

Gerade angekommen


Beiträge: 8

Danke hajos,


Zitat :

oder:
Umdreh =(float)((330*ADC_WERT)>>8); // Umrechnung in Volt



bin schon ein bißchen weiter gekommen .
Es wird jetzt nichts wirres mehr ausgegeben.

Aber er zeigt mirjetzt von 0-255 und dann von 0-027 an. Was addiert ja fast 330 ergibt.

Wie kann ich dies noch abändern?
Und was geschieht genau durch das achtfache Rechstverschieben?

BID = 565876

langerlause

Gerade angekommen


Beiträge: 8


Zitat :
perl hat am 20 Nov 2008 17:00 geschrieben :

Wie kommst du denn auf die Idee, dass die Geschwindigkeit des Motors so genau dem Sollwert folgt ?


Hab mir gedacht:

U/min max=> 330
A/D-Wert max => 255

also gibt mir die PWM bei max eine Gleichspannung aus und die H-Brücke schaltet voll durch.

Also dass heißt. Der Motor muss nicht genau voll 330 U/min machen ( geht durch die Beschaltung eh nicht weil nicht genau 12VDC am Motor anliegen) aber das Display soll es mir wenigstens den maximal Wert anzeigen wenn das Poti voll aufgedreht ist. Ob der Motor nun 10-50 U/min mehr oder weniger macht juckt mich eigentlich nicht

Somit wollt ich durch die Umrechnung nur die "ungefähre" Drehzahl ausgeben (hat ich im ersten Post angegeben)

[ Diese Nachricht wurde geändert von: langerlause am 20 Nov 2008 17:19 ]

BID = 566057

hajos118

Schreibmaschine



Beiträge: 2453
Wohnort: Untermaiselstein


Zitat :
langerlause hat am 20 Nov 2008 17:05 geschrieben :


Aber er zeigt mir jetzt von 0-255 und dann von 0-027 an. Was addiert ja fast 330 ergibt.
Wie kann ich dies noch abändern?

Liegt möglicherweise an der Ausgaberoutine.
Diese solltest Du so umschreiben, dass sie auch mit den Datentypen zusammenpasst, die Du benutzt.

Zitat :
langerlause hat am 20 Nov 2008 17:05 geschrieben :

Und was geschieht genau durch das achtfache Rechstverschieben?

Ist gleichbedeutend mit einer Division durch 265 bei Integer Zahlen (mit min. 16 Bit)


_________________
Interpunktion und Orthographie dieses Beitrags sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Wer einen Fehler findet, darf ihn behalten!

BID = 566058

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
gleichbedeutend mit einer Division durch 265
256

BID = 566067

hajos118

Schreibmaschine



Beiträge: 2453
Wohnort: Untermaiselstein

upps! Zahlendreher...


_________________
Interpunktion und Orthographie dieses Beitrags sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Wer einen Fehler findet, darf ihn behalten!

BID = 567449

langerlause

Gerade angekommen


Beiträge: 8

Guten Morgen ihr beiden.

Hatt leider etwas länger mit dem hier melden gedauert als gedacht.
Hab so ziemlich alles probiert. Aber das Display mag immer noch nicht von 0-330 anzeigen .


Zitat :
Liegt möglicherweise an der Ausgaberoutine.
Diese solltest Du so umschreiben, dass sie auch mit den Datentypen zusammenpasst, die Du benutzt.


hab mal die Funktion so abgeändert:

void dis_zahl(float Umdreh);// Deklaration der Funktion Zahlausgabe

die Variable auch als float deklariert:
float Umdreh;

die Ausgabe sieht so aus:
Umdreh =/*(float)*/((330*ADC_WERT)>>8); // Umrechnung in Drehzahl

(hab die umwandlung in float ausgeklammer da ja alles schon als float deklariert ist)



und die Funktion sieht nun so aus:

void dis_zahl(float Umdreh)
{
unsigned char zw;
zw=Umdreh/100; // Zahl in einzelne Stellen zerlegen, zuerst Hunderter
dis_zei(zw+0x30); // Hunderter Stelle ausgeben!
Umdreh=Umdreh-zw*100; // Zehner
zw=Umdreh/10;
dis_zei(zw+0x30); // Zehner Stelle ausgeben!
Umdreh=Umdreh-zw*10; // Einer
dis_zei(Umdreh+0x30); // Einer Stelle ausgeben!
}



Was mach ich denn falsch?
Gruß Markus

BID = 567452

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach


Zitat :
unsigned char zw;
zw=Umdreh/100;
Hier verlierst du die Nachkommastellen.
Da kommt also maximal 2 raus.
Ist das dein erstes Programm?

_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !

BID = 567453

langerlause

Gerade angekommen


Beiträge: 8


Zitat :
Ist das dein erstes Programm?



Nein, aber das erste größere und das erste mit nem Display und den Funtionen.


Zitat :
Hier verlierst du die Nachkommastellen.
Da kommt also maximal 2 raus.


ja das hab ich mir auch gedacht nur wenn ich zw auch als float(einfach zum ausprobieren)deklariere sagt mir der compiler :

ADRESS SPACE OVERFLOW

BID = 567455

perl

Ehrenmitglied



Beiträge: 11110,1
Wohnort: Rheinbach

Das ist ja auch abenteuerlich.
Anstatt vom µC etwas unmögliches zu verlangen, solltest du eine vernünftige Rundung programmieren.
Hier also vor der Division 50 addieren.

Dann kannst du den nächsten Fehler suchen gehen.


_________________
Haftungsausschluß:



Bei obigem Beitrag handelt es sich um meine private Meinung.



Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.



Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 17 Beiträge im Durchschnitt pro Tag       heute wurden bisher 5 Beiträge verfasst
© x sparkkelsputz        Besucher : 187989624   Heute : 8850    Gestern : 11123    Online : 310        28.12.2025    14:30
19 Besucher in den letzten 60 Sekunden        alle 3.16 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.046373128891