Перейти к содержанию
    

нужна помощь с АЦП в АТмеге48

Для меня микроконтроллеры скорее хобби и вот столкнулся с проблемой.

Задумка такая: по команде я один раз считываю значение на одном из 4 каналов.

Так вот при включении питания 1 раз корректно считывается. Потом всегда выдаёт, тоже значение, что по этому же каналу, что по другим. Т.е. ощущение что АЦП не запускается больше.

В режиме debugWIRE все работает! Я в растеренности.

 

Вот такой код у меня:

 

static volatile unsigned char newDataReady; //!< ADC ready flag

static volatile unsigned char ADCchannel; //!< ADC channel selection

static volatile unsigned char ADCLresult; //!<

static volatile unsigned char ADCHresult; //!<

 

ISR (ADC_vect) {

newDataReady = TRUE;

}

 

void initADC ( void )

{

ADMUX |= (1<<REFS0);// AVcc with external capacitor on AREF pin

ADCSRA |= (1<<ADPS2); //Use prescale factor 128 -> ADC clock is 62.5 kHz

ADCSRA |= (1<<ADPS1); //Use prescale factor 128 -> ADC clock is 62.5 kHz

ADCSRA |= (1<<ADPS0); //Use prescale factor 128 -> ADC clock is 62.5 kHz

ADCSRA |= (1<<ADIE); // Enable ADC interrupt

}

 

 

void getADCresult( void )

{

newDataReady = FALSE;

ADMUX = (ADMUX & 0xF0) | ADCchannel; // Select ADC channel

ADCSRA |= (1<<ADEN); // Enable ADC

_delay_ms(1);

sei();

ADCSRA |= (1<<ADSC); // Start conversion

while (newDataReady == FALSE) {;} // wait ADC result ready

ADCHresult = ADCH;

ADCLresult = ADCL;

ADCSRA &= ~(1<<ADEN); // Disable ADC

}

 

int main (void)

{

initADC();

// stuff ...........

 

else if (byte1 == CMD_VOLT_READ) {

initADC();

ADCchannel = volt_channel;

getADCresult();

putChar_ext(byte2);

_delay_ms(2);

putChar_ext(ADCHresult);

}

else if (byte1 == CMD_VOLT_LREAD) {

putChar_ext(byte2);

_delay_ms(2);

putChar_ext(ADCLresult);

}

 

else if (byte1 == CMD_CAL_READ) {

initADC();

ADCchannel = calibration_channel;

getADCresult();

putChar_ext(byte2);

_delay_ms(2);

putChar_ext(ADCHresult);

}

else if (byte1 == CMD_CAL_LREAD) {

putChar_ext(byte2);

_delay_ms(2);

putChar_ext(ADCLresult);

}

 

// stuff ...............

}

 

Буду признателен за подсказки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если не переключая канала и не отключая АЦП запустить и прочитать АЦП еще раз?

Если эффект будет нулевой, то предположу что у вас одно из двух:

1. Завышена тактовая АЦП.

2. Высокое сопротивление источника сигнала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...