|
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, 11:29
|

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

|
Всем спасибо. Работает ниже приведу код: Код ... static volatile unsigned int value_ADC; ...
void adc_init(void) { ADMUX = (1<<REFS0)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1); ADCSRB = 0x00; ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS0); }
main(void) { unsigned char V_BAT; float f_bat; ... adc_init(); ...
while(1) { ... for (i=0;i<5;i++) { ADCSRA=0x87; DelayMs(1); while((ADCSRA&(1<<ADSC))!=0); ADCSRA=0xC7; } value_ADC= ADC; f_bat=(1.1*1024/value_ADC); V_BAT=(f_bat*100) - 250; // отнимаю 250 для того, чтоб результат уложился в восемь бит (так нужно) ... } } Не понял: почему если объявить "value_ADC" локально и, как "unsigned int" программа не работает. Вообще виснет и фик его знает где. Всем большое спасибо! Палычу и DpInRock - вселенский респект! По поводу точности могу сказать следующее: С закороченым AVCC на VBAT, без конденсатора на AREF - больше, чем на 0,04-0,08 вольта АЦП не врал. (это при том, что я меряю 3,6вольтовую сборку аккумов) Мои цели, такой точностью, замечательно достигаются.
Сообщение отредактировал Буратино - Jul 1 2009, 11:50
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Jul 1 2009, 12:03
|

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

|
Цитата(Буратино @ Jul 1 2009, 14:29)  Код ... while(1) { ... for (i=0;i<5;i++) { ADCSRA=0x87; DelayMs(1); while((ADCSRA&(1<<ADSC))!=0); ADCSRA=0xC7; } ... } } Ну-у-у... Странная конструкция... Вы пять раз запускаете преобразование, и только последний результат берёте (да и тот сразу после последнего пуска!)... За что боролись? Вроде бы получить верное измерение с первого (ну, может быть, со второго) раза. Выключения АЦП (сброса ADEN) в программе не наблюдается... Регистр ADCSRA в main портится: в init задаётся (1<<ADEN)|(1<<ADPS2)|(1<<ADPS0) в main (1<<ADEN)|(1<<ADPS2)| (1<<ADPS1)|(1<<ADPS0). Присваивать регистрам константы (типа 0x87, 0xC7) - моветон! Имхо, если АЦП не выключать, то этот кусок программы можно записать так Код ... while(1) { ... for (i=0;i<5;i++) { ADCSRA|= (1<<ADSC); while((ADCSRA&(1<<ADSC))!=0); } ... } } (Р.S. думаю, что и for здесь лишний, раз не выключаете АЦП) Или ADEN всё-таки сбрасывается\устанавливается, но не приведено здесь? Цитата(Буратино @ Jul 1 2009, 14:29)  По поводу точности могу сказать следующее: С закороченым AVCC на VBAT, без конденсатора на AREF - больше, чем на 0,04 вольта АЦП не врал. Из документации не видно от чего зависит истинное значение Vbg. Может быть от партии к партии МК оно разное, от температуры, питающего напряжения, фиг его знает от чего ещё...
|
|
|
|
Сообщений в этой теме
Буратино 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 Вот еще одна шибка.
MUXn и REFS1:0 биты имеют буфе... Jul 1 2009, 08:10 Палыч Цитата(dimka76 @ Jul 1 2009, 11:10) MUXn ... Jul 1 2009, 08:30  dimka76 Цитата(Палыч @ Jul 1 2009, 12:30) Все эти... Jul 1 2009, 08:41   Палыч Цитата(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, 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
|
|
|