View previous topic :: View next topic |
Author |
Message |
pfournier
Joined: 30 Sep 2003 Posts: 89
|
what exectly does read_adc(ADC_START_AND_READ) do |
Posted: Wed Jan 18, 2006 1:22 pm |
|
|
The manual is not real clear about this.
I have 2 choices as to what this does.
set_adc_channel(next_channel);
value=read_adc(ADC_START_AND_READ);
Does it start a conversion of next_channel and then give you the value of the current channel, or does it start the conversion of next_channel wait for it to complete and then give you the value? _________________ -Pete |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Wed Jan 18, 2006 2:03 pm |
|
|
Doing an A to D converstion takes time. If you want you can start the conversion and go off and do other stuff, then come back and read the results. Other wise you can do a start-and-read which will wait for the results to become available((waisting time)). |
|
|
SherpaDoug
Joined: 07 Sep 2003 Posts: 1640 Location: Cape Cod Mass USA
|
|
Posted: Thu Jan 19, 2006 8:19 am |
|
|
By the way you probably want some time delay between selecting the channel and starting the conversion. It takes the analog circuitry a little while to settle to the new voltage before the digital circuits can start measuring it. Look in the data sheet for "settling time"
I usually select the next channel as soon as I am done reading the old one. Then the analog circuits can settle while I am processing the data from the last reading. _________________ The search for better is endless. Instead simply find very good and get the job done. |
|
|
pfournier
Joined: 30 Sep 2003 Posts: 89
|
|
Posted: Thu Jan 19, 2006 8:48 am |
|
|
I've gotten 2 replies, but no one has answered the question I asked. _________________ -Pete |
|
|
Ttelmah Guest
|
|
Posted: Thu Jan 19, 2006 9:25 am |
|
|
The ADC 'cycle' comprises a whole series of 'parts'. First, you have to connect the input multiplexor to the voltage required (set_adc_channel). Then you need to wait for the capacitor inside the chip to charge to the voltage you want to read (the time taken for this, depends on the source impedance, the DC resistance present inside the chip, and the capacitor size - all in the data sheet - typically at least 10uSec needs to be allowed for this). Then the ADC circuit itself, can be triggered to do a read (read_adc(ADC_START_ONLY)). This takes twelve cycles of the internal ADC clock (so typically about 24uSec) to complete. You can then read the value (read_adc(ADC_READ_ONLY)). This only takes a couple of machine cycles transfer the bytes from the registers.
The default operation, is to trigger the start, and then wait for the chip to actually complete the cycle. This is 'read_adc(ADC_START_AND_READ)'. This is the _default_ behaviour, if you just call 'read_adc()'.
The downside of this, is that you sit waiting for many microseconds, when you could be performing other operations.
Best Wishes |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Thu Jan 19, 2006 9:55 am |
|
|
To answer your question.
NO.
The chanel stays to what you set untill you change it. set_adc_channel(1);
For all commands.
if doing two chan I make a int16 loop counter in main while(1) loop
Code: | while(1){
MainWhileCnt++;
if (MainWhileCnt==0)
{
value1=read_adc(ADC_READ_ONLY);//messed up on first go-round of loop
set_adc_channel(0);//set for next reading MainWhileCnt==32767
read_adc(ADC_START_ONLY);
}
if (MainWhileCnt==32768)
{
value0=read_adc(ADC_READ_ONLY);
set_adc_channel(1);//set for next reading MainWhileCnt==0
read_adc(ADC_START_ONLY);
}
}
|
you could of course get around the messed up first read by pr-setting the chan to 1 and doing a start before you get into the loop |
|
|
Ttelmah Guest
|
|
Posted: Thu Jan 19, 2006 10:04 am |
|
|
What you post, has the significant problem, that it'll return garbage.
You select an ADC channel, and immediately start the read. The 'result' will be a value something between the value on the last selected line, and the new line. You need a delay between the 'select', and the 'start', if the reading is really going to make sense. The _reading_ begins as soon as you send 'read_adc(ADC_START_ONLY)'. As soon as this is done, the input voltage is disconnected from the internal capacitor, and the sample cycle starts.
Best Wishes |
|
|
pfournier
Joined: 30 Sep 2003 Posts: 89
|
|
Posted: Thu Jan 19, 2006 10:24 am |
|
|
Ttelmah wrote: | The default operation, is to trigger the start, and then wait for the chip to actually complete the cycle. This is 'read_adc(ADC_START_AND_READ)'. This is the _default_ behaviour, if you just call 'read_adc()'.
|
Ttelmah seems to have answered the question. I assumed the same thing. I can't see the use of the ADC_START_AND_READ. What is needed is a ADC_READ_AND_START instead. _________________ -Pete |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Thu Jan 19, 2006 10:44 am |
|
|
I must admit I tryed to simplifiy my code from what I use.
Code: | while(1){
MainWhileCnt++;
if (MainWhileCnt==0)
{
set_pwm2_duty(read_adc(ADC_READ_ONLY));
set_adc_channel(0);//set for next reading
}
if (MainWhileCnt==16384)
{
read_adc(ADC_START_ONLY);
}
if (MainWhileCnt==32768)
{
set_pwm1_duty(read_adc(ADC_READ_ONLY));
set_adc_channel(1);//set for next reading
}
if (MainWhileCnt==49152)
{
read_adc(ADC_START_ONLY);
}
}
|
Just trying to get the idea accross. Guess I caused more harm than good. |
|
|
Humberto
Joined: 08 Sep 2003 Posts: 1215 Location: Buenos Aires, La Reina del Plata
|
|
Posted: Thu Jan 19, 2006 11:27 am |
|
|
Once defined the ADC setups, the AD convertion itself is a step by step procedure.
CCS offers and enhace the (PIC) hability to do this secuence in different 'flavours'.
The basic operation:
value = read_adc (parameter);
can get different behaviours according to the selected -optional- parameters:
1)-------read_adc (ADC_START_AND_READ );
Default option, has the same efect that
value = read_adc ();
2)-------read_adc (ADC_START_ONLY);
This option set the GO/DONE bit in the ADCON0 register, disconnect the holding capacitor
from the Analog Input, start the conversion and quit, do not wait for the end of convertion.
3)-------read_adc (ADC_READ_ONLY);
This option clear the GO/DONE bit in the ADCON0 Register, set the bit 6 (ADIF) in the PIR1
register, generates an interrupt if INT_AD was enabled and read the last conversion result
stored in ADRESH and ADRESL registers.
pfournier wrote: Quote: |
I can't see the use of the ADC_START_AND_READ.
|
Not exactly. If you enable the INT_AD you must use the ADC_START_AND_READ (default) option.
pfournier wrote:
Quote: |
What is needed is a ADC_READ_AND_START instead.
|
Not exactly. If you are using the AD feature and doesn't want to spend time waiting
at the end of conversion, you need to use ADC_START_ONLY option.
Humberto |
|
|
|