PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : CAN Pegel automatisch messen (mit PC)



danionbike
25.06.2007, 06:55
Hallo,

folgende Thematik beschaeftigt mich schon ein Weile, aber ich komme einfach nicht weiter:

Ich moechte eine automatische CAN Spannungsmessung aufbauen.
Die Eingangssignale sind CAN High und CAN Low.
Anhand von der CAN Spezifikation sollen die Signal ausgewertet werden und darueber befunden werden, ob das gemessene Signal innerhalb der fuer CAN Busse zulaessigen Toleranz liegt.
Das ganze mittels PC.

Mein Problem ist, wie bekomm ich die CAN Signale in den PC?
Habe schon das Internet durchstoebert aber nichts brauchbares gefunden.

Vielleicht gibt es hier ja den einen oder anderen schlauen Kopf der sich mit dem Thema auskennt?!

Danke!

askazo
25.06.2007, 07:46
Wenn Du nur die Pegel und nicht den Inhalt der Signale auswerten möchtest, kannst Du doch einfach einen µC mit AD-Wandler an den CAN hängen, damit in einem Zeitfenster jeweils den Maximal- und den Minimalwert der Spannung ermitteln und das ganze dann zur Auswertung per RS232 oder USB an den PC weiterleiten.

Du kannst natürlich auch, wie bei einem Digitalscope, das ganze Signal erfassen und komplett an den PC weiterleiten - das wird aber (je nach Bitrate des CANs) um einiges aufwendiger.

Gruß,
askazo

danionbike
25.06.2007, 08:59
ja da hast du recht!

kannst du einen AD Wandler oder mC empfehlen?
gibt es eine Anleitung wie ich dann auf die Daten per USB oder RS232 zugreifen kann?

USB wuerde ich vorziehen da mein Laptop keine RS232 Schnittstelle hat.

Gibt es zu diesem Thema Links oder aehnlich?
Habe ueber die Suchfunktion leider nichts passendes gefunden.

das ganze soll unter XP und Win2000 funktionieren.

danionbike
26.06.2007, 04:00
muss ich eigentlich einen mikrokontroller verwenden oder reicht ein einfacher A/D Wandler aus?
Bei einem Mikrokontroller muss ich ja noch ein Programm draufspielen, kann ich mir diese Arbeit ersparen?
Ich frage deshalb da ich mich in der Materie nicht sehr gut auskenne und mich in alles einarbeiten muss und somit versuche den Aufwand so gering wie moeglich zu halten.

Wie seht ihr das, kann ich einfach das Signal digitalisieren und dann an eine PC Schnittstelle senden und per Software auf dem PC einlesen und verarbeiten?

Was fuer einen Wandler, Programmiersprache und Schnittstelle koennt ihr mir empfehlen? Wie schon gesagt so einfach wie moeglich.

DANKE!

askazo
26.06.2007, 08:58
Das kommt ganz auf Deine Kenntnisse an.
Es gibt auch fertige Messwerterfassungskarten (vermutlich auch für PCMCIA oder USB) die Du dann direkt per PC programmierst und auswertest. Da müsstest Du Dich mal ein bißchen im Netz umschauen.

Einfach einen AD-Wandler an den PC hängen wird nicht gehen. Höchstens über Parallelport, aber der ist ja nun ein wenig veraltet.
Ansonsten brauchst Du immer ein Kommunikationsprotokoll, das halt am einfachsten über einen µC zu realisieren ist.
Eine USB-Kommunikation ist auf beiden Seiten nicht ganz so einfach aufzubauen. Von daher würde ich Dir zu RS232 mit USB-zu-RS232-Konverter raten.

Welchen Controller man nimmt ist Geschmachssache. Ich persönlich bin (wie wohl die meisten hier im Forum) AVR-Fan. Als Programmiersprache würde ich Dir C/C++ empfehlen, kommt aber natürlich auf Deine Kenntnisse an. Welche Sprachkenntnisse hast Du denn?

Was Du auf jeden Fall benötigst, sind gute Programmierkenntnisse auf der PC-Seite.

askazo

danionbike
27.06.2007, 08:01
Das kommt ganz auf Deine Kenntnisse an.
Es gibt auch fertige Messwerterfassungskarten (vermutlich auch für PCMCIA oder USB) die Du dann direkt per PC programmierst und auswertest. Da müsstest Du Dich mal ein bißchen im Netz umschauen.

Einfach einen AD-Wandler an den PC hängen wird nicht gehen. Höchstens über Parallelport, aber der ist ja nun ein wenig veraltet.
Ansonsten brauchst Du immer ein Kommunikationsprotokoll, das halt am einfachsten über einen µC zu realisieren ist.
Eine USB-Kommunikation ist auf beiden Seiten nicht ganz so einfach aufzubauen. Von daher würde ich Dir zu RS232 mit USB-zu-RS232-Konverter raten.

Welchen Controller man nimmt ist Geschmachssache. Ich persönlich bin (wie wohl die meisten hier im Forum) AVR-Fan. Als Programmiersprache würde ich Dir C/C++ empfehlen, kommt aber natürlich auf Deine Kenntnisse an. Welche Sprachkenntnisse hast Du denn?

Was Du auf jeden Fall benötigst, sind gute Programmierkenntnisse auf der PC-Seite.

askazo


tja, gute programmierkentnisse habe ich nicht.
im gymnasium hatte ich mal Java und an der Hochschule C++.
Wobei ich mit Schnittstellenprogrammierung noch nie was gemacht habe.
woher bekomm ich denn anleitungen wie man mit schnittstellen porgrammiert bzw. wie man ueber schnittstellen daten einlesen und verarbeiten kann?
ich habe hier noch einen anderes notebook, das laeuft mit win2000 und hat sogar eine RS232 schnittstelle - wenn das damit wirklich einfacher ist werde ich dann dieses notebook benutzten.

ueber infomaterial wuerde ich mich freuen!

danionbike
28.06.2007, 04:44
Kann ich eigentlich mit der RS232 Schnittstelle mehrere Signale gleichzeitig verarbeiten?

askazo
28.06.2007, 09:30
Auf der PC-Seite kenne ich mich mit der Programmierung leider auch nicht aus. Da muss Dir hier jemand anderes weiterhelfen.

Die RS232-Schnittstelle ist aber definitiv sehr leicht zu programmieren. Auf der Controller-Seite auf jeden Fall und soweit ich weiß auch auf der PC-Seite.

Was meinst Du mit "mehrere Signale gleichzeitig verarbeiten"?

Du solltest Dir für die Datenübertragen ein Protokoll überlegen. Das sieht in der Regel so aus:

Byte 1: Art der Daten
Byte 2: Anzahl der folgenden Datenbytes
Byte 3 - Byte n: Datenbytes
Byte n: Checksumme

Über Byte 1 kannst Du dann steuern, von welchem Signal die Daten kommen.

askazo

eugengraf
28.06.2007, 09:40
Auf der PC-Seite kenne ich mich mit der Programmierung leider auch nicht aus. Da muss Dir hier jemand anderes weiterhelfen.

Die RS232-Schnittstelle ist aber definitiv sehr leicht zu programmieren. Auf der Controller-Seite auf jeden Fall und soweit ich weiß auch auf der PC-Seite.

Was meinst Du mit "mehrere Signale gleichzeitig verarbeiten"?

Du solltest Dir für die Datenübertragen ein Protokoll überlegen. Das sieht in der Regel so aus:

Byte 1: Art der Daten
Byte 2: Anzahl der folgenden Datenbytes
Byte 3 - Byte n: Datenbytes
Byte n: Checksumme

Über Byte 1 kannst Du dann steuern, von welchem Signal die Daten kommen.

askazo


Man muss nicht unbedindgt ein binäres Protokoll benutzen. Du kannst auch die Zahlen nacheinander leerzeichengetrennt als ASCII ausgeben (mit sprintf).

Du kannst auch eine billige Datenerfassungskarte in USB reinstecken und entweder mit der mitgelieferten Bediensoftware die Daten anschauen oder selbst mit dem mitgeliefertem Treiber ein kleines PC-Programm schreiben.

http://iusbdaq.eu/catalog/product_info.php?cPath=3_1&products_id=30

Eugen

askazo
28.06.2007, 10:14
Man muss nicht unbedindgt ein binäres Protokoll benutzen. Du kannst auch die Zahlen nacheinander leerzeichengetrennt als ASCII ausgeben (mit sprintf).
Naja, das halte ich aber für sehr uneffektiv. Und ein binäres Protokoll ist auch nicht komplizierter.

askazo

eugengraf
28.06.2007, 10:29
Man muss nicht unbedindgt ein binäres Protokoll benutzen. Du kannst auch die Zahlen nacheinander leerzeichengetrennt als ASCII ausgeben (mit sprintf).
Naja, das halte ich aber für sehr uneffektiv. Und ein binäres Protokoll ist auch nicht komplizierter.

askazo

Na ja, es kommt auf die Datenmenge an.

Kleine Datenmenge, kleine Frequenz - ASCII
Grosse Datenmenge - binäres Protokoll

ASCII Daten kann man mit jedem Terminal-Programm mitanschauen.
Binäres muss man erstmal parsen, da siehst du mit Augen nicht viel.

Also ich benutze grundsätzlich nur binäre Protokolle, von ASCII halte ich nicht viel. Aber für so kleine Aufgaben lohnt es sich nicht, das Protokoll auszudenken, Checksumme berechnen, IDs definieren u.s.w.

Eugen

danionbike
29.06.2007, 02:15
im netz habe ich folgende schaltung zum einlesen von daten ueber die RS232 schnittstelle gefunden:

http://www.build-a-bot.com/software/tlc548test.zip

die datei mit der schaltungszeichnung heisst "tlc548_auslesen.jpg"

es ist auch ein Programm in VisualBasic dabei.

Da ich von VB aber keinen blassen schimmer habe wuerde ich lieber in C++ (mit Bloodshed Dev-C++ Version 4) ein Programm schreiben.
in C++ habe ich grundkenntnisse.

Das Programm fuer meine Anwendung stelle ich mir folgendermassen vor:
Ueber einen kurzen Zeitbereich werden die Spannungswerte eingelesen und dann von diesen Werten das Maximum und Minimun ausgegeben.
Die eingelesenen Wert interessieren mich also nicht unbedingt, d.h. diese muessen nicht ausgegeben werden, nur dessen Max. und Min.!

kann mir jemand dabei helfen?
dies uebersteigt leider meine grundkenntnisse in C++!

(das ganze fuer Win2000)

vielen Dank!


noch eine frage: brauch ich fuer die kommunikation zwischen compiler und RS232 Schnittstelle immer ein Freeware-Tool das die Ports freischaltet und eine Kommunikation ermoeglicht?
Wenn ja welches Tool wird benoetigt und gibt es nicht von Microsoft einen Compiler bei dem man so ein Tool nicht mehr braucht?

NumberFive
29.06.2007, 07:42
Wenn es sich um eine Echte Serial übertragung handelt brauchst nix um die daten einzulesen. das mit dem Port frei schalten braucht man nur wenn man unter Windows auf die Ports direkt zu greifen will.

In dem VB Beispiel hier werden die Steuerleitungen verwendet.

http://www.wer-weiss-was.de/theme158/article1968408.html

Dort ist das setzen von RTS zu lesen.

Richard
29.06.2007, 07:51
ja da hast du recht!

USB wuerde ich vorziehen da mein Laptop keine RS232 Schnittstelle hat.

Gibt es zu diesem Thema Links oder aehnlich?
Habe ueber die Suchfunktion leider nichts passendes gefunden.

das ganze soll unter XP und Win2000 funktionieren.

Moin moin,

In der letzten C`t Seite 184 ist ein Programm vorgestellt und auch
auf der Heft DVD das Daten von der rs 232 übernimmt und z.B.
nach Exel inportiert. Das scheint ohne größere Programmier
Kenntnisse zu klappen, das Programm benutzt dafür den Tastaturtreiber.

Gruß Richard

danionbike
29.06.2007, 08:31
Wenn es sich um eine Echte Serial übertragung handelt brauchst nix um die daten einzulesen. das mit dem Port frei schalten braucht man nur wenn man unter Windows auf die Ports direkt zu greifen will.

In dem VB Beispiel hier werden die Steuerleitungen verwendet.

http://www.wer-weiss-was.de/theme158/article1968408.html

Dort ist das setzen von RTS zu lesen.


versteh ich net, erstens was meinst du mit echten Signalen, zweitens wieso brauch ich nichts um Daten einzulesen?
Der von dir geposte Link hilft mir aber auch nicht weiter.
PS: ich bin kein Programmier-Experte!

@ Richard:
kannst du das Programm irgendwo hochladen?
da wo ich bin kann man leider keine C't kaufen ...


wie sieht es mit dem von mir geposten Schaltplan aus?
kann man dazu ein C++ Programm erstellen?
und braucht man nun irgendwelche Tools die den Zugriff auf die Schnittstellen freigeben - beim Einlesen von Daten?

kann mir bitte jemand helfen, bin verzweifelt :-(
DANKE

NumberFive
29.06.2007, 09:02
Ok noch mal langsam:

Der Schaltplan ist keine normal RS232 über tragung sondern was getrickste wo die Steuerleitung als daten leitungen misbraucht werden. das ist aber nicht schlimm.



Private Sub Form_Load()
On Error Resume Next
MSComm1.Settings = "9600,N,8,1"
MSComm1.CommPort = 1
MSComm1.PortOpen = True
MSComm1.DTREnable = False
MSComm1.RTSEnable = True

End Sub


Öffnet der Comport 1 und stellt die Übertragungsrate auf 9600 Baud bei deien Schlatung aber föllig egal



DCB CommDCB;
COMMTIMEOUTS timeout;
long ret;
char s[100];

sprintf(s, "COM%d", ComPort);
hdCOMM = CreateFile(s,
(GENERIC_READ | GENERIC_WRITE), 0, NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING,
NULL);

if ( hdCOMM != INVALID_HANDLE_VALUE )
{
ret = SetupComm(hdCOMM, 1024, 1024);

sprintf(s, "COM%d: baud=38400 parity=N data=8 stop=1", ComPort);
memset(&CommDCB, 0, sizeof(DCB));
CommDCB.DCBlength = sizeof(DCB);

ret = BuildCommDCB(s, &CommDCB);

CommDCB.DCBlength = sizeof(DCB);
CommDCB.fBinary = 1; // Binary Mode
CommDCB.fParity = 0; // No Parity Check
CommDCB.fOutxCtsFlow = 0; // CTS ignored
CommDCB.fOutxDsrFlow = 0; // DSR ignored
// CommDCB.fDtrControl = ; // DTR ignored
CommDCB.fDsrSensitivity = 0; //
CommDCB.fTXContinueOnXoff = 1;
CommDCB.fOutX = 1;
CommDCB.fInX = 1;
CommDCB.fAbortOnError = 0; // Ignore Errors
CommDCB.XoffLim = 100;
CommDCB.XonLim = 500;
CommDCB.XonChar = 17;
CommDCB.XoffChar = 19;
ret = SetCommState(hdCOMM, &CommDCB);

timeout.ReadIntervalTimeout = MAXDWORD; // Read returns if no chars available
timeout.ReadTotalTimeoutMultiplier = 0; // "
timeout.ReadTotalTimeoutConstant = 0; // "
timeout.WriteTotalTimeoutMultiplier = 3;
timeout.WriteTotalTimeoutConstant = 20;
ret = SetCommTimeouts(hdCOMM, &timeout);


Das Selbe in C++




Private Function TLC548_GetData() As Byte
Dim i As Integer, temp As Byte

temp = 0
MSComm1.RTSEnable = False 'Setze Chip Select low
For i = 7 To 0 Step -1

MSComm1.DTREnable = True 'Steigende Taktflanke

If MSComm1.CTSHolding = True Then 'Datenbit einlesen
temp = temp + 2 ^ i
End If

MSComm1.DTREnable = False 'fallende Taktflanke

Next

MSComm1.RTSEnable = False 'Setze Chip Select wieder hi

TLC548_GetData = temp
End Function


damit wird der Chip gelesen
RTSEnable = false / Steueer leitung aus low stellen damit der weiß das ich jetzt daten holen will.

DTREnable = true Takt auf High dann kannst du das erste bit lesen
mit MSComm1.CTSHolding wenn das wahr ist dann sende der chip eine 1
wenn false dann eine 0 dann takt wieder aus. und das ganze von vorne

bis wir 8 bit zusammen haben dann hast du den wert den der AD gemessen hast. Die schaltung ist meines erachtes so da man damit 0 bis 5V messen kann. Aber da müssen dir die Hardwar jung noch mal helfen / drüber gucken. Also wenn meine Annahme stimmt und du an den ein gang 5 V legst sollte der Chip 8 mal eine 1 bringen. also 255 als zahl.
8 bit bei 5v macht eine Auflösung von 0,01 Volt.

Gruß

Richard
29.06.2007, 16:35
[quote="danionbike



@ Richard:
kannst du das Programm irgendwo hochladen?
da wo ich bin kann man leider keine C't kaufen ...


[/quote]

Google ist Dein Freund!

www.heise.de/software/download/captser/

Richard

danionbike
04.07.2007, 01:27
hat jemand denn schon mal ein solches Programm geschrieben, welches Daten an der seriellen Schnittstelle einliest?
meinetwegen kann es auch an der parallelen Schnittstelle sein.

bei der Programmierung mit Schnittstellen habe ich leider keine Ahnung.

gibt es hier jemanden der so ein Programm schon hat bzw. so ein aehnliches oder jemanden der mir so ein Programm (fuer LPT oder RS232) schreiben kann???

8-[

bitte!

danionbike
11.07.2007, 07:21
hallo, kann mir niemand helfen?


habe mir in der zwischenzeit noch eine reine hardware loesung ueberlegt:

bestehend aus zwei fenster-komparatoren und logik-bausteinen.

im anhang ist eine einfach skizze fuer eine solche schaltung.
die dort gezeigte schaltung ist z.b. fuer das CAN-H signal.
mit der oberen fenster-komparator-schaltung wird der maximum-bereich (z.b. von 3,3 bis 3,7 V) abgedeckt und mit der unteren fenster-komparator-schaltung der minimum-bereich (z.b. von 2,3 bis 2,7 V).
liegt das max. und min. der CAN-bus-spannung in diesem bereich, liegt am RS-flip-flop ein high-signal an und wird dann auch dort gespeichert und der ausgang auf high gesetzt, wodurch die LED leuchtet.

was ist eure meinung dazu.


infos zum fenster-komparator:
http://www.elektronik-kompendium.de/sites/slt/0411231.htm
infos zum rs-flip flop:
http://www.elektronik-kompendium.de/sites/dig/0209302.htm

danionbike
13.07.2007, 01:31
hallo, kann mir jemand ein feedback zu meiner geposteten schaltung geben???

Danke!

danionbike
18.07.2007, 08:36
hallo, immer noch keiner da, der mir was zu der schaltung sagen kann???