реклама на сайте
подробности

 
 
> ADC Mega168. Измерение напряжения "наоборот".
Буратино
сообщение Jun 29 2009, 10:53
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 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


--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dimka76
сообщение Jul 1 2009, 08:10
Сообщение #2


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.

Отсюда у вас первое ошибочное измерение.
И при смене опоры первое измерение тоже ошибочное. Вот вам и второе ложное измерение.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 1 2009, 08:30
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(dimka76 @ Jul 1 2009, 11:10) *
MUXn и REFS1:0 биты имеют буферизацию. И новые значения вступают в силу после одного такта АЦП. Отсюда у вас первое ошибочное измерение. И при смене опоры первое измерение тоже ошибочное. Вот вам и второе ложное измерение.
Все эти биты размещены в одном регистре ADMUX и изменяются в программе один раз. Биты REFS1:0 собственно и определяют опору - поэтому одно действие вызвать два ложных измерения, имхо, не может. Да и между инициализацией АЦП и просыпанием из спячки (когда производится измерение АЦП) пройдёт больше одного такта АЦП.
Возможно, что неверное измерение АЦП при выходе из спячки возникает из-за выключения/включения АЦП битом ADEN. В документации никаких предупреждений по использованию ADEN не нашёл, а сам я таким образом АЦП ни разу не использовал - поэтому это ИМХО.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jul 1 2009, 08:41
Сообщение #4


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);
}

В первой строчке он изменяет мультиплексор.
В третий дает старт АЦП.
АЦП стартанет не с этим состояние мультиплексора, а в это состояние он придет после первого преобразования.
А после первого преобразование обнаружится, что и опора сменилась. Вот и еще одно потерянное преобразование.

А это мое ИМХО smile.gif


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Буратино   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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 13:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01461 секунд с 7
ELECTRONIX ©2004-2016