Homepage Wiki Forum Buy

GNUBLIN embedded GNU/Linux

Open source learning and training plattorm for embedded GNU / Linux
A projects from Hochschule Augsburg and embedded projects GmbH

Project homepage: http://www.gnublin.org
Wiki: http://wiki.gnublin.org
Aktuelle Zeit: Mo 20. Nov 2017, 13:17

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: ARM-LPC313X-ADC-Kernel-Module
BeitragVerfasst: So 7. Apr 2013, 14:04 
Offline

Registriert: Di 26. Jun 2012, 10:27
Beiträge: 172
Ich habe das Kernel-Module für den ADC (fast) komplett neu geschrieben
Als Vorlage habe ich die Sourcen aus dem aktuellen Community Kernel genommen

https://github.com/christiankarsch/ARM- ... nel-Module

Ich habe die alte Schnittstelle mir Read und Write übernommen, so das bisherige Anwendungen ohne Änderungen damit funktionieren sollten.
Einzige Abweichung: Die ADC-Messunug wird jetzt beim DeviceRead-Aufruf gemacht, vorher wurde sie beim DeviceOpen gemacht.
Es ist jetzt möglich mehrere Reads hintereinander auszuführen ohne das Device schließen und wieder öffnen zu müssen.

Außerdem gibt es eine neue Schnittstelle, bei der man den ADC-Wert direkt als Integer bekommt.
Code:
#include <fcntl.h> /* open() O_RDONLY=0 O_RDWR=2 */
#include <unistd.h> /* close() read() write() */
#include <sys/ioctl.h> /* ioctl() */
#include <stdint.h>
#include <stdio.h>

#include "../kernel/lpc313x_adc_dev.h"

int main( void ) {

   LPC313X_ADC_WRITE wdata = LPC313X_ADC_CONFIG_DEFAULT; /* Wichtig, defaults setzen! */
   LPC313X_ADC_READ rdata;
   LPC313X_ADC_VALUE retValue;
   int fd;

   fd = open( "/dev/"LPC313X_ADC_DEVNAME , O_RDWR );
   
   write( fd, &wdata, sizeof( wdata ) ); /* ADC-Config schreiben */
   read( fd, &rdata, sizeof( rdata ) ); /* ADC-Messung und Config lesen */
   
   printf( "Value=%i; Channel=%i; Errorcode=%i; Powermode=%i; Legacymode=%i; Debugmode=%i\n", rdata.value,
         rdata.channel, rdata.flags.errorcode, rdata.flags.power, rdata.flags.legacy, rdata.flags.debug );
   printf( "Resulution: CH0=%i; CH1=%i; CH2=%i; CH3=%i\n", rdata.resulution[0], rdata.resulution[1],
         rdata.resulution[2], rdata.resulution[3] );
   printf( "Averaging: CH0=%i; CH1=%i; CH2=%i; CH3=%i\n", rdata.average[0], rdata.average[1], rdata.average[2],
         rdata.average[3] );
   
   wdata.channel = 1; /* Channel wechseln */
   write( fd, &wdata, sizeof( wdata ) ); /* ADC-Config schreiben */
   
   ioctl( fd, LPC313X_ADC_SET_CHANNEL, 1 ); /* altanative zu write() */
   
   retValue.vint = ioctl( fd, LPC313X_ADC_GET_VALUE, 0 ); /* alternatve zu read() */
   printf( "Value=%i; Channel=%i; Errorcode=%i\n", retValue.value, retValue.channel, retValue.flags.errorcode);
   
   close( fd );
   return 0;
 }
Hier mal ein Speedtest, den ich gemacht habe:
Code:
Speedtest 1: using 'read'  one channel  (ADC Power: auto):      Sampels/s =   516.550476
Speedtest 2: using 'read'  two channels (ADC Power: auto):      Sampels/s =   605.694519
Speedtest 3: using 'ioctl' one channel  (ADC Power: auto):      Sampels/s =   477.904755
Speedtest 4: using 'ioctl' two channels (ADC Power: auto):      Sampels/s =   516.741394
Speedtest 5: using 'read'  one channel  (ADC Power: always on): Sampels/s = 20611.035156
Speedtest 6: using 'read'  two channels (ADC Power: always on): Sampels/s = 20468.859375
Speedtest 7: using 'ioctl' one channel  (ADC Power: always on): Sampels/s = 20825.392578
Speedtest 8: using 'ioctl' two channels (ADC Power: always on): Sampels/s = 20722.210938
10.000 Messungen in einer Schleife, und dann den Durchschnitt ermittelt.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: ARM-LPC313X-ADC-Kernel-Module
BeitragVerfasst: So 7. Apr 2013, 19:22 
Offline

Registriert: Do 8. Nov 2012, 09:47
Beiträge: 93
Wohnort: Aachen
Das klingt ja super!

Kann man das auch mit dem älteren EDLK (2.6er Kernel) auf einem 8MB Gnublin verwenden?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: ARM-LPC313X-ADC-Kernel-Module
BeitragVerfasst: So 7. Apr 2013, 20:14 
Offline

Registriert: Di 26. Jun 2012, 10:27
Beiträge: 172
Ich habe es nicht getestet, aber es spricht nichts dagegen.
Eventuell muss man ein paar Änderungen machen:
Die defines für die ADC-Register müssen entauskommentiert werden und beim "static struct file_operations" muss statt ".unlocked_ioctl =" einfach nur ".ioctl =" stehen.


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: ARM-LPC313X-ADC-Kernel-Module
BeitragVerfasst: Mi 10. Apr 2013, 14:01 
Offline

Registriert: Mi 22. Aug 2012, 14:59
Beiträge: 19
@kirsch:

mit welcher Frequenz läuft bei dir ADC_CLK , standartmässig ist es nur auf 315789 Hz. Gemäss Manual sind 4.5 MHz zulässig. Konfigurieren kann man sie in Bootloader "apex-1.6.8/src/mach-lpc313x/lpc313x_cgu_default.c", beschrieben unter http://forum.gnublin.org/viewtopic.php?f=3&t=216&start=10#p1593. Mit 315789 Hz wären bei fortlaufendem Sampeln mit 10 bit sind etwa 28000 Sampels/s möglich, du kommst schon recht nah daran :D

Gruss Thomas

_________________
Gnublin Version 1.3


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: ARM-LPC313X-ADC-Kernel-Module
BeitragVerfasst: Mi 10. Apr 2013, 15:25 
Offline

Registriert: Di 26. Jun 2012, 10:27
Beiträge: 172
Das ist eine sehr gute Frage, da ich am Bootloader nichts geändert habe, wird der ADC mit 31,25 kHz betrieben.
Dann ist aber die maximale Samplerate 2,86k Samples/s. Da bin ich um den Faktor 10 drüber.

Läuft der ADC vielleicht doch mit 250Khz?

Laut Datenblatt soll er bei 10Bit bis 400k Samples/s schaffen.
Das wäre wenn er mit 4,5Mhz betrieben wäre.


Ich sehe da nach ein bisschen Optimierungspotential:
Der ADC kann selbständig mehrere Channels hintereinander messen, dann brauch man nicht Manuell den Channel wechseln.

EDIT:
verlesen, du schreibst 315kHz, dann sind meine Werte plausibel. Warum aber so eine krumme Zahl?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: ARM-LPC313X-ADC-Kernel-Module
BeitragVerfasst: Mi 10. Apr 2013, 15:45 
Offline

Registriert: Di 26. Jun 2012, 10:27
Beiträge: 172
Habs gefunden, der ADC-Takt ist standardmäßig 1/38 des Clocksource, also 12Mhz/38 = 315.79kHz


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: ARM-LPC313X-ADC-Kernel-Module
BeitragVerfasst: Mi 10. Apr 2013, 22:36 
Offline

Registriert: Mi 22. Aug 2012, 14:59
Beiträge: 19
Die 400k Samples/s bringt er aber nur im bei ADC_CSCAN = 1 und über einen Anschluss

_________________
Gnublin Version 1.3


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: ARM-LPC313X-ADC-Kernel-Module
BeitragVerfasst: Mo 22. Apr 2013, 21:11 
Offline

Registriert: Mi 22. Aug 2012, 14:59
Beiträge: 19
@kirsch:

noch mal Danke wegen dem Kernel neu kompilieren, dass das neue Modul zum Kernel passt. Hatte das vorher schon Probiert, bin nach dem Wiki-Artikel vorgegangen einfach mit dem abweichenden config. Aber beim Booten gab es Kernel panic. Im Wiki steht das verhängnisvolle vorgehen:

make modules_install
sudo cp -r ${INSTALL_MOD_PATH}/lib /media/Gnublin/

und ich habe das ohne viel zu überlegen so ausgeführt, mit angepasstem Pfad für meine SD. Besser wäre wie jetzt gemacht:

sudo make modules_install INSTALL_MOD_PATH=/media/Gnublin/

Nun habe ich unter meinem System mit ADC Clock 4.5 MHz dein Speedtest durchgeführt. Die Sampelrate ist nur wenig höher, vermutlich weil der grösste Teil der Sampelzeit durch Abschalten und Anschalten des ADCs zwischen den Messungen verursacht wird, im Gegensatz wenn Messung direkt an Messung folgt.

Code:
Speedtest 1: using 'read' one channel (ADC Power: auto):  Sampels/s =  1879.548950
Speedtest 2: using 'read' two channels (ADC Power: auto):  Sampels/s =   930.171814
Speedtest 3: using 'ioctl' one channel (ADC Power: auto):   Sampels/s =  2693.060791
Speedtest 4: using 'ioctl' two channels (ADC Power: auto):  Sampels/s =  1879.926392
Speedtest 5: using 'read' one channel (ADC Power: always on):   Sampels/s = 21028.724609
Speedtest 6: using 'read' two channels (ADC Power: always on):  Sampels/s = 20988.384766
Speedtest 7: using 'ioctl' one channel (ADC Power: always on):  Sampels/s = 21047.669922
Speedtest 8: using 'ioctl' two channels (ADC Power: always on):  Sampels/s = 21044.212891


gruss
Thomas

_________________
Gnublin Version 1.3


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: ARM-LPC313X-ADC-Kernel-Module
BeitragVerfasst: Di 15. Sep 2015, 09:13 
Offline

Registriert: Sa 12. Sep 2015, 08:42
Beiträge: 24
Device schließen und wieder öffnen zu müssen.
genting crown


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de