I'm doing a project and wish to use A/D converter for the input signal from my force sensor. But I got no idea how to choose a suitable ADC specially how to give clock for the ADC from arduino? output from arduino?
For my understanding, with the analog read in, the arduino need more processing time for the signal, but with the digital signal input will allow my arduino to run faster?
Not sure what you're saying there.
It is true that the existing analogRead has a busy-wait, but as I pointed out in your other thread, this is easily reduced or eliminated.
You can even interrupt on the end-of-conversion condition if you wish.
The converter itself does not consume processor resources.
As for my system require fast feedback from the sensors so I can't afford to have such long busy-wait state.
In this case I would like to try if the arduino only work with digital input allow me to have the immediate feedback from the sensors.
int analogRead(uint8_t pin)
{
uint8_t low, high;
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#elif defined(__AVR_ATmega32U4__)
if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#else
if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif
#if defined(__AVR_ATmega32U4__)
pin = analogPinToChannel(pin);
ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#elif defined(ADCSRB) && defined(MUX5)
// the MUX5 bit of ADCSRB selects whether we're reading from channels
// 0 to 7 (MUX5 low) or 8 to 15 (MUX5 high).
ADCSRB = (ADCSRB & ~(1 << MUX5)) | (((pin >> 3) & 0x01) << MUX5);
#endif
// set the analog reference (high two bits of ADMUX) and select the
// channel (low 4 bits). this also sets ADLAR (left-adjust result)
// to 0 (the default).
#if defined(ADMUX)
ADMUX = (analog_reference << 6) | (pin & 0x07);
#endif
// without a delay, we seem to read from the wrong channel
//delay(1);
#if defined(ADCSRA) && defined(ADCL)
// start the conversion
sbi(ADCSRA, ADSC);
// ADSC is cleared when the conversion finishes
while (bit_is_set(ADCSRA, ADSC));
// we have to read ADCL first; doing so locks both ADCL
// and ADCH until ADCH is read. reading ADCL second would
// cause the results of each conversion to be discarded,
// as ADCL and ADCH would be locked when it completed.
low = ADCL;
high = ADCH;
#else
// we dont have an ADC, return 0
low = 0;
high = 0;
#endif
// combine the two bytes
return (high << 8) | low;
}
Just split this into two - the setup and start conversion in one routine, and the wait and read.
Do useful work between calling them.
PeterH:
What are you trying to minimise - the latency in getting the value, or the wasted processing time if your sketch waits while the conversion occurs?
I would like to minimise the latency in getting the value.