|
ADC Mega168. Измерение напряжения "наоборот". |
|
|
|
Jun 29 2009, 10:53
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Есть устройство с автономным питанием. Для того ,Чтоб не использовать ключей, делителей и прочей обвязки - измеряю напряжение на аккумуляторе по сл. алгоритму:
AREF = AVCC = Vbat Данные АЦП: N = 1024*Vop/Vbat т.е. Vbat = Vop*1024/N
вот инициализация ADC: void adc_init(void) { ADMUX = (1<<REFS0)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1); ADCSRB = 0x00; ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0); }
Вот прерывание: #pragma vector= ADC_vect __interrupt void ADC_vect_isr (void) { //conversion complete, read value (int) using... value_ADC=ADCL; //Read 8 low bits first (important) value_ADC|=(int)ADCH << 8; //read 2 high bits and shift into top byte }
В тексте программы: ... __disable_interrupt();adc_init();ADCSRA |= (1<<ADEN); __enable_interrupt(); DelayMs(5); f_bat=(1.22*1024/value_ADC); V_BAT=(f_bat*100); __disable_interrupt();ADCSRA &= ~(1<<ADEN); __enable_interrupt(); ...
не могу понять, почему иногда считает ADC неверно!? Где ошибка? Я не использую никакой обвязки. То есть, на ногах проца имеющих отношение к преобразованию ничего не "висит". Может быть в этом проблема? AVСС тоже в воздухе. Если измерять напряжение на этом выводе, то там меньше, чем на питании проца. Сори за очередные глупые вопросы, но оч. нужна помощь. Спасибо.
Сообщение отредактировал Буратино - Jun 29 2009, 11:06
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
 |
Ответов
|
Jul 1 2009, 08:10
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Вот еще одна шибка. MUXn и REFS1:0 биты имеют буферизацию. И новые значения вступают в силу после одного такта АЦП. DS стр. 249 Цитата The MUXn and REFS1:0 bits in the ADMUX Register are single buffered through a temporary register to which the CPU has random access. Цитата Note that the conversion starts on the following rising ADC clock edge after ADSC is written. The user is thus advised not to write new channel or reference selection values to ADMUX until one ADC clock cycle after ADSC is written. Отсюда у вас первое ошибочное измерение. И при смене опоры первое измерение тоже ошибочное. Вот вам и второе ложное измерение.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Jul 1 2009, 08:41
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(Палыч @ Jul 1 2009, 12:30)  Все эти биты размещены в одном регистре ADMUX и изменяются в программе один раз. Биты REFS1:0 собственно и определяют опору - поэтому одно действие вызвать два ложных измерения, имхо, не может. Да и между инициализацией АЦП и просыпанием из спячки (когда производится измерение АЦП) пройдёт больше одного такта АЦП. Вот код автора Код void adc_init(void) { ADMUX = (1<<REFS0)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1); ADCSRB = 0x00; ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0); } В первой строчке он изменяет мультиплексор. В третий дает старт АЦП. АЦП стартанет не с этим состояние мультиплексора, а в это состояние он придет после первого преобразования. А после первого преобразование обнаружится, что и опора сменилась. Вот и еще одно потерянное преобразование. А это мое ИМХО
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
Сообщений в этой теме
Буратино ADC Mega168. Измерение напряжения "наоборот". Jun 29 2009, 10:53 rezident Цитата(Буратино @ Jun 29 2009, 16:53) Я н... Jun 29 2009, 12:14 Буратино Цитата(rezident @ Jun 29 2009, 16:14) Все... Jun 29 2009, 13:49  Палыч Цитата(Буратино @ Jun 29 2009, 16:49) При... Jun 29 2009, 15:12   singlskv Цитата(Палыч @ Jun 29 2009, 19:12) То, чт... Jun 30 2009, 00:41    Палыч Цитата(singlskv @ Jun 30 2009, 03:41) ... Jun 30 2009, 05:36     singlskv Цитата(Палыч @ Jun 30 2009, 09:36) Точнее... Jun 30 2009, 19:03    defunct Цитата(singlskv @ Jun 30 2009, 03:41) Пер... Jun 30 2009, 14:18 rezident А в чем заключается ошибка "ацепирования... Jun 29 2009, 15:02 Буратино Цитата(rezident @ Jun 29 2009, 19:02) А в... Jun 29 2009, 17:21  rezident Цитата(Буратино @ Jun 29 2009, 22:58) Нет... Jun 29 2009, 17:23  Палыч Цитата(Буратино @ Jun 29 2009, 20:21) Нет... Jun 30 2009, 06:44 Буратино Чувство такое, будто внутри процессора проходит пе... Jun 29 2009, 18:04 DpInRock В даташите АЦП посвещено нескольк страниц. И те не... Jun 30 2009, 00:56 singlskv Цитата(DpInRock @ Jun 30 2009, 04:56) Стр... Jun 30 2009, 01:09 DpInRock КодAREF = AVCC = Vbat
Тут уже говорилось автору, ч... Jun 30 2009, 07:31 Палыч Цитата(DpInRock @ Jun 30 2009, 10:31) Тут... Jun 30 2009, 07:54 Буратино поставил 10н на AREF, попробовал отключить вообще ... Jun 30 2009, 08:48 Палыч Цитата(Буратино @ Jun 30 2009, 11:48) Пер... Jun 30 2009, 09:18  Буратино Цитата(Палыч @ Jun 30 2009, 13:18) Вы изм... Jun 30 2009, 09:50 DpInRock Относительно чего ПЕРВЫЙ РАЗ? Например, после сбро... Jun 30 2009, 09:59 Буратино Цитата(DpInRock @ Jun 30 2009, 13:59) Отн... Jun 30 2009, 10:26  dimka76 Цитата(Буратино @ Jun 30 2009, 14:26) пер... Jun 30 2009, 10:39 rezident А может кто-то наконец внятно объяснить что и отно... Jun 30 2009, 10:10 Палыч Цитата(rezident @ Jun 30 2009, 13:10) А м... Jun 30 2009, 10:25  rezident Цитата(Палыч @ Jun 30 2009, 16:25) Измеря... Jun 30 2009, 10:35   Палыч Цитата(rezident @ Jun 30 2009, 13:35) Суд... Jun 30 2009, 10:51    Буратино Цитата(Палыч @ Jun 30 2009, 14:51) Кстати... Jun 30 2009, 13:29     Палыч Цитата(Буратино @ Jun 30 2009, 16:29) все... Jun 30 2009, 14:52 dimka76 Цитата(rezident @ Jun 30 2009, 14:10) А м... Jun 30 2009, 10:34 DpInRock Замечание по ходу. Использование ADC_isr в данном ... Jun 30 2009, 17:00 Буратино Код#pragma vector= ADC_vect
__interrupt void ADC_v... Jun 30 2009, 18:49 Палыч Цитата(Буратино @ Jun 30 2009, 21:49) Код... Jul 1 2009, 05:45 DpInRock А у кого вы научились так АЦП опрашивать? Вот отче... Jun 30 2009, 19:32 Буратино Цитата(DpInRock @ Jun 30 2009, 23:32) А у... Jun 30 2009, 20:04 DpInRock Я лично точно также измеряю абсолютное напряжение ... Jun 30 2009, 20:29   Палыч Цитата(dimka76 @ Jul 1 2009, 11:41) А пос... Jul 1 2009, 08:53 DpInRock Не путайте товарища. Какие еще 70 микросекунд... Ц... Jul 1 2009, 10:13 Палыч Цитата(DpInRock @ Jul 1 2009, 13:13) Не п... Jul 1 2009, 10:30 DpInRock А вот и нет. Цитатаthe reference voltage can be ma... Jul 1 2009, 11:24 Буратино Всем спасибо. Работает
ниже приведу код:
Код...
... Jul 1 2009, 11:29 Палыч Цитата(Буратино @ Jul 1 2009, 14:29) Код.... Jul 1 2009, 12:03  Буратино вот:
Код...
static volatile unsigned int value_AD... Jul 1 2009, 12:46   Палыч Цитата(Буратино @ Jul 1 2009, 15:46) вот:... Jul 1 2009, 15:56    Буратино Цитата(Палыч @ Jul 1 2009, 19:56) А, резу... Jul 1 2009, 16:27     Палыч Цитата(Буратино @ Jul 1 2009, 19:27) Код ... Jul 2 2009, 05:14      Буратино Цитата(Палыч @ Jul 2 2009, 09:14) Плавающ... Jul 2 2009, 06:53
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|