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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> mega88PA и АЦП в Free Running mode, проблема с измерениями
arttab
сообщение Apr 18 2011, 04:38
Сообщение #1


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



в режиме одиночного преобразования АЦП выдает нормальные значения, а после переделки проги на постоянное преобразование (пока не запретишь) получаю FF. прерывания АЦП выкл.

опора АЦП от встроенного в мк опорника 1.1В

делаю так:

__disable_interrupt();

установки АЦП:
ADMUX = (1<<REFS0)|(1<<REFS1)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(1<<ADLAR);
ADCSRA =(1<<ADEN)|(1<<ADPS0)|(0<<ADPS1)|(0<<ADPS2); //|(1<<ADATE) //2for1MHz 001
ADCSRB = (0<<ACME)&(0<<ADTS2)&(0<<ADTS1)&(0<<ADTS0);

задержка на устаканивание:
for (unsigned char z=0; z<10; z++){
__delay_cycles(350000/8/10*F_MHZ); //
WATCHDOG_RESET;}


SETBIT(DDRB, 6); // для отладки ножкой буду дрыгать

SETBIT (ADCSRA, _ADC_Start); // запускаю АЦП

ADC_CONTROL_auto(); // Жду результата
//
unsigned char ADC_CONTROL_auto(void)
{
SETBIT(PORTB, 6); // Çàïóñê ÀÖ ïðåîáðàçîâàíèÿ;
while( !TSTBIT(ADCSRA, _ADC_Flag)); // Îæèäàíèå ôëàãà ïðåðûâàíèÿ - îêîí÷àíèÿ ïðåîáðàçîâàíèÿ;
CLRBIT(PORTB, 6);
return ADCH; // ×òåíèå ðåçóëüòàòà ïðåîáðàçîâàíèÿ;
}
//

// И делаю выборку значеий
for (char j = 0; j <_NUMB_OF_MEG; j++)
{
res_of_meg[j] = ADC_CONTROL_auto(); // Ìàññèâ èçìåðåííîãî çíà÷åíèÿ êàëèáðîâêè //
}


выключаю АЦП
ADCSRA = 0<<ADEN;


переделывал на одиночные режим работы - все ок. сигнал меняю - отчеты идут нормальные, а так FF только


есть errata но она при вкл. компоратора (я его использую в др. части проги), а я перед каждым использованием АЦП конфигурю АЦП.

что у меня с "лыжами"? почему не едут? wacko.gif


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 18 2011, 08:51
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (arttab @ Apr 18 2011, 07:38) *
прерывания АЦП выкл.
В этом случае надо принудительно сбрасывать ADIF записью в него единицы после чтения результата. Правда не понимаю, как его не сбрасывание может приводить к чтению FF - по идее, у вас просто буфер должен заполниться результатом первого измерения.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 18 2011, 09:52
Сообщение #3


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



спасибо. завтра попробую.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
hd44780
сообщение Apr 18 2011, 10:22
Сообщение #4


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

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



CvAVR предлагает вот такой код:

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 20 2011, 04:22
Сообщение #5


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



вы уверены что это free runтing режим, а не одиночное преобразование с ручным запуском?

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

еще поковыряюсь по этому вопросу.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 20 2011, 05:08
Сообщение #6


Гуру
******

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



Цитата(arttab @ Apr 20 2011, 08:22) *
в русском переводе нашел что нужно вычитывать оба регистра результата, причем младший первым.
Для двухбайтных регистров, обычно, есть три определения: младший (L), старший (H) и словный (W или "пусто").
Цитата(hd44780 @ Apr 18 2011, 14:22) *
return ADCW;
В этом случае транслятор сам разбирается с порядком чтения/записи.
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 20 2011, 07:56
Сообщение #7


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

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



получилось при такой инициализации:

void ADC_init_prescaler_on_2_auto(void)
{
ADMUX = (1<<REFS0)|(1<<REFS1)|(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(1<<ADLAR); //was chanel 011. just 000

ADCSRB = (0<<ACME)&(0<<ADTS2)&(0<<ADTS1)&(0<<ADTS0);
ADCSRA = (1<<ADATE);
ADCSRA |=(1<<ADEN)|(1<<ADPS0)|(0<<ADPS1)|(0<<ADPS2); //2for1MHz 001 деление тактирующей частоты на 16;
}

обработчик:
#pragma optimize=none
unsigned char ADC_CONTROL_auto(void)
{
unsigned char t;
SETBIT(PORTB, 6); // Запуск АЦ преобразования;
while( !TSTBIT(ADCSRA, _ADC_Flag)); // Ожидание флага прерывания - окончания преобразования;
CLRBIT(PORTB, 6);
t= ADCL;
return ADCH;


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 20 2011, 10:02
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (arttab @ Apr 20 2011, 10:56) *
получилось при такой инициализации:
1) Совершенно непонятно, зачем взводить ADATE отдельной командной.
2) Чтение ADCL излишне.
QUOTE
Consequently, if the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH.

3) А ADIF вы все же не сбрасываете. Что получилось в результате - непонятно, но явно не то, чего вы ожидатете.
QUOTE
ADIF is cleared by hardware when executing the corresponding interrupt handling vector. Alternatively, ADIF is cleared by writing a logical one to the flag.

Ну и запуск преобразования происходит совсем не в том месте, где стоит соответствующий комментарий.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 20 2011, 12:53
Сообщение #9


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(arttab @ Apr 20 2011, 06:56) *
получилось при такой инициализации:
ADCSRA = (1<<ADATE);
ADCSRA |=(1<<ADEN)|(1<<ADPS0)|(0<<ADPS1)|(0<<ADPS2); //2for1MHz 001 деление тактирующей частоты на 16;

Непонятно, как вам удалось запустить ацп. Для запуска первого преобразования во free running mode надо бы установить бит ADSC в регистре ADCSRA. Ну и ADIF надо сбрасывать ручками после каждого преобразования.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Index
сообщение Apr 20 2011, 14:45
Сообщение #10





Группа: Новичок
Сообщений: 4
Регистрация: 30-03-11
Пользователь №: 64 000



arttab !!! ИЗВИНИ !!! что в твоей теме вопрос задаю, но..

У меня проблема с АЦП на девайсе ATmega328P. Не запускаются непрерывные преобразования АЦП, ни free running, ни от Timer0 Overflow. Одиночные, это пожалуста.

Инициализировал так:

ldi r16, (0<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(0<<MUX0)
ldi r17, (0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0)
ldi r18, (1<<ADEN)|(0<<ADSC)|(1<<ADATE)|(0<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)

sts ADMUX, r16
sts ADCSRB, r17
sts ADCSRA, r18

Первое преобразование запускал так:

lds r16, ADCSRA
sbr r16, (1<<ADSC)
sts ADCSRA, r16

Первое преобразование заканчивается, вызывается обработчик прерывания АЦП, флаг прерывания АЦП сбрасывается аппаратно и ... все больше обработчик по окончании нового преробразования не вызывается, а следовательно новое преобразование и не запускается автоматически.

Что делать?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 20 2011, 16:03
Сообщение #11


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



При первом запуске попробуйте после чтения регистра ADCSRA
lds r16, ADCSRA

очистить ADIF (бит 4) в регистре r16, потом завершите остальное

sbr r16, (1<<ADSC)
sts ADCSRA, r16


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Index
сообщение Apr 20 2011, 16:21
Сообщение #12





Группа: Новичок
Сообщений: 4
Регистрация: 30-03-11
Пользователь №: 64 000



=GM=
хорошо, попробую

Пока выход такой .. в обработчике прерывания о таймера (Timer0 Overflow) вручную запускаю новое преобразование установкой бита ADSC.





Сообщение отредактировал Index - Apr 20 2011, 16:21
Go to the top of the page
 
+Quote Post
Fusion
сообщение Apr 20 2011, 16:46
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 19-07-06
Пользователь №: 18 920



Инициализация АЦП для меги 644:
Код
adcinit:

; REFS1=1  REFS0=1 (Internal 2.56V Voltage Reference with external capacitor at AREF pin), ADLAR=1(Left), MUX = 0
ldi temp, (1<<REFS1) | (0<<REFS0) | (1<<ADLAR) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0)
sts ADMUX, temp

; ADEN=1(ADCenable), ADSC=1(Start), ADATE=1(Auto Trigger Enable) ADPS: 010 (/4; 5 mHz)
ldi temp,(1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADPS2) | (1<<ADPS1) | (0 <<ADPS0)
sts ADCSRA, temp

ldi temp, 0b01000000; Free Running mode
sts ADCSRB, temp

ldi temp, 0b10000000; Digital Input Disable
sts DIDR0, temp

ret


Взято из рабочего проекта.
Free Running.
Результат забирается командой lds temp, ADCH.
Готовность Ацп не проверяется - просто задержка NOP.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 21 2011, 14:55
Сообщение #14


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Что-то я не пойму, какой смысл использовать ADC free-running режим без прерываний?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 21 2011, 15:51
Сообщение #15


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



То есть, без прерываний вообще не жизнь? И работать по флагу готовности ацп религия не позволяет.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 04:03
Рейтинг@Mail.ru


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