View previous topic :: View next topic |
Author |
Message |
levettp
Joined: 07 Sep 2003 Posts: 17
|
FAST A/D CONVERSION |
Posted: Fri Oct 22, 2010 2:43 am |
|
|
I'm using a 16F887 with 20MHz crystal in an application where I need maximum A/D conversion sampling rate for approximately 30 micro seconds. After sampling I then process the readings for which processing time is not of importance.
My code is as follows (I use pin AN1 for A/D):
Code: |
void main()
{
unsigned int16 Vd0, Vd1, Vd2, Vd3, Vd4, Vd5;
setup_port_a( sAN1 );
setup_adc(ADC_CLOCK_DIV_32);
set_adc_channel(1);
delay_ms(250);
do {
Vd0=read_adc();
Vd1=read_adc();
Vd2=read_adc();
Vd3=read_adc();
Vd4=read_adc();
Vd5=read_adc();
//I then process Vd0 to Vd5
} while(true);
}
|
Any advice on how I can speed up the sampling rate will be greatly appreciated. |
|
|
bkamen
Joined: 07 Jan 2004 Posts: 1615 Location: Central Illinois, USA
|
|
Posted: Fri Oct 22, 2010 9:18 am |
|
|
You must carefully read the section in the PIC Datasheet covering the A/D's conversion times.
There's input capacitance and then the max conversion rate to contend with.
Your 30uS conversion time comes to very roughly 33Ks/s (rounding down). Will your PIC do that?
(All PIC's have various rates of conversion. I didn't look at the datasheet for your particular PIC, but I have run the game of running a PIC ADC near max in the past) _________________ Dazed and confused? I don't think so. Just "plain lost" will do. :D |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Fri Oct 22, 2010 2:36 pm |
|
|
In fact, what you show won't work, since the adc capacitor needs to recharge between readings. This is the '10uSec', needed on most of the older chips after you select a channel, and the same time is needed between each reading and the next, or what you read won't reflect the external voltage at all. On your chip, the time needed for this, is 5uSec.
For the 16F887, with a 20Mhz crystal, the fastest ADC clock you can use, is Fosc/32, giving 1.6uSec Tad. The actual reading takes 11 cycles of this (17.6uSec), so the maximum repeated sample rate (for 10bit accuracy) is (17.6+5 = 22.6uSec).
However, unfortunately, the adc reading is stored as 8 bits in one register, and 2 more bits rather inconveniently placed in another register, requiring several instructions to re-assemble to get the 10bit value, significantly slowing this. _If_ you can accept 8bit values, the reading only takes a couple of instructions. At this lower rate, you can also fractionally reduce the charging time. So:
1) Select the adc clock as Fosc/32
2) Add 4uSec delays between each reading.
3) Set the adc to return 8 bit values (ADC=8 in the device statement).
This would then give the best achievable, which will about 22uSec/sample.
Best Wishes |
|
|
levettp
Joined: 07 Sep 2003 Posts: 17
|
|
Posted: Sat Oct 23, 2010 4:48 am |
|
|
Thank you bkamen and Ttelmah.
@Ttelmah: I need at least 3 readings during the 30 micro seconds sampling period. Further, 8 bit resolution will unfortunately not be adequate accuracy.
It appears that I only have the following options:
i) Run 3 x PIC16F887's with a synchronisation signal between them and let each do 1 A/D conversion 10 micro seconds appart.
OR
ii) Change to a faster chip e.g. a dsPIC ... never used these chips before so not sure about their performance.
OR
iii) Try to find a PIC that perhaps have separate registers in which A/D conversion results are stored.
Which route will you suggest? |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sat Oct 23, 2010 6:40 am |
|
|
A 16-Bit PIC would provide a considerably higher performance, also in data processing. But there are also 8-Bit PICs with fast ADC, e.g. 18F4331. |
|
|
levettp
Joined: 07 Sep 2003 Posts: 17
|
|
Posted: Sun Oct 24, 2010 9:22 am |
|
|
Thank you for everyones inputs.
I'm going the route of using a PC sound card for A/D conversion. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19552
|
|
Posted: Sun Oct 24, 2010 2:58 pm |
|
|
Um.
Most sound cards on normal PC's, won't do the sample rates you are requiring. Fastest sampling, is normally 44.1KHz, or 48KHz, (though two channels at this speed, which might _just_ be stretched to do what you want), and the ADC's on a PC sound card, are audio ADC's, which doesn't imply great linearity. The 'resolution' may be many bits, but you need to study about the difference between these and instrumentation ADC's. Remember also the frequency response limits of the circuitry feeding the on-board chip...
Many people have used sound card ADC's for things like simple oscilloscopes, but the results are usually very poor, and will vary from machine to machine....
Get a proprietary PC analog I/O board, if you want results that are worth having.
Best Wishes |
|
|
levettp
Joined: 07 Sep 2003 Posts: 17
|
dsPIC30F2020 |
Posted: Thu Nov 11, 2010 1:34 am |
|
|
I got the sound card running but now I want to move to faster sampling.
dsPIC30F2020 can apparently do 2MS/s but I scanned this message board and it appears that 30F2020.h is either not properly completed or have errors.
Does anyone use this type of dsPIC successfully with CCS or is it better to use another compiler? |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Thu Nov 11, 2010 7:17 am |
|
|
the ad 8371 can do this externally
i've done it with an 18F4620 @ 16 mhz
in response to an int trigger on B
BUT had to dedicate the entire D port and E port 3 lines
to get 64 reading bursts into an array - with a reading every
10 usec -
ultimately memory to hold the results is an issue in the pic u know |
|
|
languer
Joined: 09 Jan 2004 Posts: 144 Location: USA
|
|
Posted: Thu Nov 11, 2010 1:18 pm |
|
|
you could use an external adc, if you can get it with serial interface (SPI/Microwire) probably easier. Linear Tech has some pretty nice ones (e.g. LTC2362).
A few things to consider:
- Sample Rate: > 100ksps?
- Interface: Serial?
- Resolution: > 8-bits?
|
|
|
|