Jump to content

    
Sign in to follow this  
seven7

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

Recommended Posts

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

Задумка такая: по команде я один раз считываю значение на одном из 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 ...............

}

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this