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!! > o > | > 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, > o > | > 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. > intmain(intargc,char**argv) > { > constuint32 tSamp =123401; //!< The number of samples in the > files (per step). > constuint32 tmr =5000; //!< The sampling rate in ns (5000 -> > 200 kHz). > constuint32 NoStep=3; //!< The number of active steps (must > match setStep calls and mask). > constuint32 NoFile=2; //!< The number of files to write. > constchar*NamFil="output.%u";//!< The output file names. > structtimespec 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);return1;} > > 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. > charfName[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); > return0; > } > | > Desription > | > rb_file {#SubSecExaRbFile} > ------- > > \Item{Description} > > Thisfile contains an example on how to usethe ring buffer mode of > libpruio.A fixedstep mask of AIN-0,AIN-1andAIN-2getconfigured > formaximum speed,sampled into the ring buffer andfromthere saved > asraw data to some files. > > \Item{Preparation} > > Nopreparation isrequired.Optionalyyou can customize the number of > samples,the sampling rate orthe number of samples inthe source > code andrecompile your version. > > \Item{Operation} > > Startthe program by`./rb_file`andyou'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] > <mailto:[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.
