Но измерения мягко говоря странные. ADC0 и ADC2 "близки к нолю", т.е. по сути там делитель "вход" которого "висит" в воздухе. На ADC1 есть напряжение около 3х вольт.
Результат измерения получается 4, 805, 800 (ну +-3 от раза к разу). Ну 4 ладно, это 0,018 вольта, 805 тоже понимаю это где-то 3.8В, но от куда 800? Стою осцилографом на этой шожке и ничего не вижу, а измерение есть...
В коде измеряем значения следующим образом:
Код
#include <avr/io.h>
#define AD_CNT 3
#define AD_CLC 5
volatile uint16_t ADBuf[AD_CNT][AD_CLC];
volatile uint16_t ADSum[AD_CNT];
volatile uint8_t src=0,ad_calc=0;
void init_adc(void) {
uint8_t i,j;
for (i=0;i<AD_CNT;i++) {
for (j=0;j<AD_CLC;j++)
ADBuf[i][j] = 0;
ADSum[i] = 0;
}
ADCH = 0;
ADCL = 0;
ADMUX = _BV(REFS0);
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADSC);
}
int main(void) {
PORTC = 0;
DDRC = 0;
....
init_adc();
....
while(1) {
if (bit_is_clear(ADCSRA,ADSC)) {
uint16_t ADres=ADC;
ADSum[src] -= ADBuf[src][ad_calc];
ADBuf[src][ad_calc] = ADres; // Place new value into Buffer
ADSum[src] += ADres;
ad_calc++;
ad_calc%=AD_CLC;
if (!ad_calc) {
src++;
src%=AD_CNT;
ADMUX = _BV(REFS0) | src;
}
ADCSRA |= _BV(ADSC);
}
....
}
}
#define AD_CNT 3
#define AD_CLC 5
volatile uint16_t ADBuf[AD_CNT][AD_CLC];
volatile uint16_t ADSum[AD_CNT];
volatile uint8_t src=0,ad_calc=0;
void init_adc(void) {
uint8_t i,j;
for (i=0;i<AD_CNT;i++) {
for (j=0;j<AD_CLC;j++)
ADBuf[i][j] = 0;
ADSum[i] = 0;
}
ADCH = 0;
ADCL = 0;
ADMUX = _BV(REFS0);
ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADSC);
}
int main(void) {
PORTC = 0;
DDRC = 0;
....
init_adc();
....
while(1) {
if (bit_is_clear(ADCSRA,ADSC)) {
uint16_t ADres=ADC;
ADSum[src] -= ADBuf[src][ad_calc];
ADBuf[src][ad_calc] = ADres; // Place new value into Buffer
ADSum[src] += ADres;
ad_calc++;
ad_calc%=AD_CLC;
if (!ad_calc) {
src++;
src%=AD_CNT;
ADMUX = _BV(REFS0) | src;
}
ADCSRA |= _BV(ADSC);
}
....
}
}