So, let me say what is not irrelevant. Standardization, documentation, and usability. It is my personal opinion that the documentation for libpruio could use *A LOT* of work. Which leads to the third thing I mentioned above. I also do not feel that the whole library is open enough. Last I looked, one had to download a pre-compiled binary in order to make it work. This is not open source, which is big on many peoples mind.
So, if I seem like I have not a clue as to how libpruio works. That would be correct. Because if the documentation is not good enough for me to read, and understand what is going on, I'm not going to bother with the whole situation. Why ? Because there are other methods to do the same thing, that *are* open sourced, are documented very well, and are standardized. I would rather invest my time into understanding these things. Instead of attempting to reinvent the wheel - As it were. Does this mean I think libpruio is garbage. No! This means I think there are several things concerning the library that can use some improvement. Which personally I do not care to invest my time into. . . . On Wed, Sep 30, 2015 at 12:48 PM, evilwulfie <[email protected]> wrote: > There is only one ADC in the sitara processor. > There is a 8 to 1 mux to provide you with 8 inputs. > If you want really fast multi channel ADC conversions you may want 8 > separate ADC Chips external > to the processor. > > > > > > On 9/30/2015 12:26 PM, Rathin Dholakia wrote: > > Dear Thomas, > > First of all, Thanks a lot for coming by and answering, I respect your > efforts in developing in libpruio!! I cant imaging how much work you must > have put in..! :-) > > Well, second things is you mean to say if I use 8 ADCs I cant achieve > 1.25Khz+ sample rate, Than should I use external ADC? would it be easier? > > and to be frank I have plenty of doubts in the pruio construct and > pruio_config, I which are as follows: > > > - You said I have 183 cycle open delay - but where is it? I have made > everything 0 ( zero!!) you can have a look at option setting in line > bellow!! > - pruio_new(PRUIO_DEF_ACTIVE, 0, 0, 0) > > - And in my pruio_config, I have made averaging to 0 (you can see > that as well). delay 0, > - pruio_config(io, 1, PRUIO_DEF_STPMSK , 0, 4) > > So, is my configuration is wrong or the approach? > > few queries with respect to your new example > > - This is also for only 3 ADC channels, so if I extend it for 8, will > this one also become slow? > - I am going to "monitor" the inputs continuously, so I require > continuous stream of input, will this approach work? > - Its later part of my project but I saw u using system timer so > asking that I also want to time stamp the data with system time, so can it > be done here or should I do it later? > > Sorry if my queries sound novice but I am new to this & I am felling > overwhelmed by the whole thing..!! :-) > > > I have been reading the processor TRM and PRU reference manual and I > petrified, its kind of ocean of information. ( it remind me of "The old man > & the sea"!! ) > > > Sincerely, > > Rathin > > > PS: > > > > On Wednesday, September 30, 2015 at 11:35:25 PM UTC+5:30, TJF wrote: >> >> Hi Rathin! >> >> I didn't read all the stuff in the posts of this thread. But most of it >> seams irrelevant. Forget it. >> >> You're using libpruio. That's the only way to reach your target --> >> That's OK. >> >> You cannot reach 20 kHz sampling rate due to two reasons: >> >> - you're using default step configuration. This is 183 cycles open >> delay and avaraging 4. That means 183 + 1 + 4 x 14 cycles for each sample >> (@ 24 MHz) = 10 kHz per channel. Therefor maximum sampling rate for 8 >> channels is 1.25 kHz. >> - you're using IO mode. The ARM CPU determines the sampling speed and >> your printf statement slows down the program execution, so you don't get >> the previous mentioned 1.25 kHz. >> >> In order to reach 20 kHz sampling rate you have to do >> >> 1. configure customized steps for fast sampling (ie. no open delay >> and no avaraging) >> 2. use either MM or RB mode to get accurate timing >> >> Either have a look at the triggers >> <http://users.freebasic-portal.de/tjf/Projekte/libpruio/doc/html/_cha_examples.html#SubSecExaTriggers> >> example (to use MM mode) or check out the following code (comming from an >> example named rb_file for next libpruio versions) >> >> >> /** \file rb_file.c >> \brief Example: fetch ADC samples in a ring buffer and save to file. >> >> This file contains an example on how to use the ring buffer mode of >> libpruio. A fixed step mask of AIN-0, AIN-1 and AIN-2 get configured >> for maximum speed, sampled in to the ring buffer and from there saved >> as raw data to some files. >> >> Licence: GPLv3 >> >> Copyright 2014-2015 by Thomas{ dOt ]Freiherr[ At ]gmx[ DoT }net >> >> Thanks for C code translation: Nils Kohrs <nils[ dot ]kohrs{ AT }gmail[ >> dOt ]com> >> >> Compile by: `gcc -Wall -o rb_file rb_file.c -lpruio -lprussdrv` >> >> \since 0.2.0.2 >> */ >> >> #include "unistd.h" >> #include "time.h" >> #include "stdio.h" >> #include "../c_include/pruio.h" >> >> //! The main function. >> int main(int argc, char **argv) >> { >> const uint32 tSamp = 123401; //!< The number of samples in the files >> (per step). >> const uint32 tmr = 5000; //!< The sampling rate in ns (5000 -> >> 200 kHz). >> const uint32 NoStep = 3; //!< The number of active steps (must >> match setStep calls and mask). >> const uint32 NoFile = 2; //!< The number of files to write. >> const char *NamFil = "output.%u"; //!< The output file names. >> struct timespec mSec; >> mSec.tv_nsec=1000000; >> pruIo *io = pruio_new(PRUIO_DEF_ACTIVE, 0x98, 0, 1); //! create new >> driver >> if (io->Errr){ >> printf("constructor failed (%s)\n", io->Errr); return 1;} >> >> do { >> if (pruio_adc_setStep(io, 9, 0, 0, 0, 0)){ // step 9, AIN-0 >> printf("step 9 configuration failed: (%s)\n", io->Errr); break;} >> if (pruio_adc_setStep(io,10, 1, 0, 0, 0)){ // step 10, AIN-1 >> printf("step 10 configuration failed: (%s)\n", io->Errr); break;} >> if (pruio_adc_setStep(io,11, 2, 0, 0, 0)){ // step 11, AIN-2 >> printf("step 11 configuration failed: (%s)\n", io->Errr); break;} >> >> uint32 mask = 7 << 9; //!< The active steps (9 to 11). >> uint32 tInd = tSamp * NoStep; //!< The maximum total index. >> uint32 half = ((io->ESize >> 2) / NoStep) * NoStep; //!< The maximum >> index of the half ring buffer. >> >> if (half > tInd){ half = tInd;} // adapt size for small files >> uint32 samp = (half << 1) / NoStep; //!< The number of samples (per >> step). >> >> if (pruio_config(io, samp, mask, tmr, 0)){ // configure driver >> printf("config failed (%s)\n", io->Errr); break;} >> >> if (pruio_rb_start(io)){ >> printf("rb_start failed (%s)\n", io->Errr); break;} >> >> uint16 *p0 = io->Adc->Value; //!< A pointer to the start of the >> ring buffer. >> uint16 *p1 = p0 + half; //!< A pointer to the middle of the >> ring buffer. >> uint32 n; //!< File counter. >> char fName[20]; >> for(n = 0; n < NoFile; n++){ >> sprintf(fName, NamFil, n); >> printf("Creating file %s\n", fName); >> FILE *oFile = fopen(fName, "wb"); >> uint32 i = 0; //!< Start index. >> while(i < tInd){ >> i += half; >> if(i > tInd){ // fetch the rest(no complete chunk) >> uint32 rest = tInd + half - i; >> uint32 iEnd = p1 >= p0 ? rest : rest + half; >> while(io->DRam[0] < iEnd) nanosleep(&mSec, NULL); >> printf(" writing samples %u-%u\n", tInd -rest, tInd-1); >> fwrite(p0, sizeof(uint16), rest, oFile); >> uint16 *swap = p0; >> p0 = p1; >> p1 = swap; >> } >> if(p1 > p0) while(io->DRam[0] < half) nanosleep(&mSec, NULL); >> else while(io->DRam[0] > half) nanosleep(&mSec, NULL); >> printf(" writing samples %u-%u\n", i-half, i-1); >> fwrite(p0, sizeof(uint16), half, oFile); >> uint16 *swap = p0; >> p0 = p1; >> p1 = swap; >> } >> fclose(oFile); >> printf("Finished file %s\n", fName); >> } >> } while(0); >> pruio_destroy(io); >> return 0; >> } >> Desription >> rb_file {#SubSecExaRbFile} >> ------- >> >> \Item{Description} >> >> This file contains an example on how to use the ring buffer mode of >> libpruio. A fixed step mask of AIN-0, AIN-1 and AIN-2 get configured >> for maximum speed, sampled in to the ring buffer and from there saved >> as raw data to some files. >> >> \Item{Preparation} >> >> No preparation is required. Optionaly you can customize the number of >> samples, the sampling rate or the number of samples in the source >> code and recompile your version. >> >> \Item{Operation} >> >> Start the program by `./rb_file` and you'll see console output like >> ~~~{.txt} >> Creating file output.0 >> writing samples 0-65534 >> writing samples 65535-131069 >> writing samples 131070-196604 >> writing samples 196605-262139 >> writing samples 262140-327674 >> writing samples 327675-370202 >> Finished file output.0 >> Creating file output.1 >> writing samples 0-65534 >> writing samples 65535-131069 >> writing samples 131070-196604 >> writing samples 196605-262139 >> writing samples 262140-327674 >> writing samples 327675-370202 >> Finished file output.1 >> ~~~ >> >> The program created two new files in the current folder, named >> output.0 and output.1. The files contain the raw data from the three >> ADC channels AIN-0 to AIN-2. >> >> \Item{Source Code} >> >> src/examples/rb_file.bas >> >> src/c_examples/rb_file.c >> >> >> BR >> > -- > For more options, visit http://beagleboard.org/discuss > --- > You received this message because you are subscribed to the Google Groups > "BeagleBoard" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > > > -- > For more options, visit http://beagleboard.org/discuss > --- > You received this message because you are subscribed to the Google Groups > "BeagleBoard" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
