|
Вопрос по АЦП, Free running mode |
|
|
|
Jan 14 2008, 22:53
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
При работе с АЦП делаю заранее заданное демпфирование по каналам. То есть порядок выборки каналов у меня постоянно скачет. Это поменять нельзя. АЦП запущено в "Free running mode" и проверяется по таймеру. Время с момента переключения канала и до выборки значения АЦП вдвое превышает означенные 25 тактов (пробовал и увеличивать). По каким-то, для меня непонятным причинам, иногда (достаточно редко) с АЦП в память попадает не текущее значение АЦП (точнее не то, что должно быть), а с предыдущего канала. Причём если я в данной точке останавливаюсь по JTAG, то в АЦП микросхемы вижу правильное значение. Например: Код 127 default: 128 x0=Adc[TekChan].X1=ADCH; // Прочитать значение АЦП \ ??pvPWWLvl1_7: \ 000000B8 91300079 LDS R19, 121 \ ??pvPWWLvl1_9: \ 000000BC 8334 STD Z+4, R19 \ 000000BE 2E23 MOV R2, R19 То есть по databreakpoint останавливаюсь в последней строчке и вижу в АЦП значение FF к примеру, а в ячейку уже занесено 83. Каналы и всё прочее выставляется верно. Создаётся впечатление, что АЦП не успевает завершить операцию. Но, как я уже писал, при увеличении времени в разы сама ошибка остаётся. Может я чего не знаю. Может необходимо как то обновить значение. Типа прочитать два раза или что-то ещё. Я в непонятках.
|
|
|
|
|
 |
Ответов
|
Jan 15 2008, 10:48
|

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

|
Цитата(GDI @ Jan 15 2008, 12:04)  "ну его ф топку этот фри ран..."  Вот и я при чтении даташита пришел к тому же выводу - в режиме FreeRunning, если канал переключается не в прерывании АЦП первое измерение после переключения канала может относится как к старому, так и к новому каналу, поэтому его нужно отбросить. Это логически вытекает из описания и понятно. Но именно в режиме FreeRunning, если канал переключается не в прерывании АЦП, а не просто "При переключении мультиплексора". Поэтому я и уточнил - может есть еще какие-то тонкости.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 15 2008, 20:56
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Сергей Борщ @ Jan 15 2008, 13:48)  Вот и я при чтении даташита пришел к тому же выводу - в режиме FreeRunning, если канал переключается не в прерывании АЦП первое измерение после переключения канала может относится как к старому, так и к новому каналу, поэтому его нужно отбросить. Это логически вытекает из описания и понятно. Ну и где Вы такое прочитали в даташите ? Читаем внимательно: In Free Running mode, always select the channel before starting the first conversion. The channel selection may be changed one ADC clock cycle after writing one to ADSC.Правда это относится только к старту первого преобразования... Еще раз читаем внимательно, разговор о Free Running и выставление флага ADSC касается только первого преобразования... Для подтверждения этой мысли читаем даташит еще чуть подробнее: Note that the conversion starts on the following rising ADC clock edge after ADSC is written.А вот это нам указывает на то что преобразование будет запущенно не в момент когда мы скажем ADSC, а когда наступит этот самый "rising ADC clock edge", тока не нужно расказывать что он придет абсолютно в произвольный момент времени.... Он придет абсолютно синхронно через считаемое количество тактов после ADEN и ADSC, тока нужно научится считать эти такты...
|
|
|
|
|
Jan 15 2008, 23:54
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(singlskv @ Jan 16 2008, 00:56)  Он придет абсолютно синхронно через считаемое количество тактов после ADEN и ADSC, тока нужно научится считать эти такты... Ещё раз обращаю Ваше внимание на то, что ADSC, ADEN, ADIF я вообще не трогал. И согласно даташиту это не требуется (только ADSC и ADEN при инициализации АЦП). И так я работал без особых проблем в других проектах. Я предложил мой расчёт для получения результата. Тем не менее при съёме с периодом 75 тактов АЦП примерно 1 раз в 15 - 20 секунд и более (иногда до нескольких минут) АЦП запущенное на частоте 16М/128=125кГц каким то образом ловило предыдущий канал. Это я установил абсолютно точно. При одиночном запуске я сейчас считываю значение через 50 тактов. Всё работает отлично. Может быть при смене канала требуется дополнительное время? Это, в общем то логично, но я не нашёл такого упоминания в даташите. Может данный режим используется без смены канала? ЗЫ: Кристалл at90can128. Там возможна такая фишка, как задание источника перезапуска АЦП в этом самом FRM. Этим источником может являться к примеру таймер.
|
|
|
|
|
Jan 18 2008, 09:36
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(SasaVitebsk @ Jan 16 2008, 02:54)  Тем не менее при съёме с периодом 75 тактов АЦП примерно 1 раз в 15 - 20 секунд и более (иногда до нескольких минут) АЦП запущенное на частоте 16М/128=125кГц каким то образом ловило предыдущий канал. Это я установил абсолютно точно. Кстати, тут еще вспомнил один нюансик в работе АЦП. Судя по частоте появления ошибки, возможно Вы натыкаетесь на то, что преобразование заканчивается сразу же после считывания ADCL и до считывания ADCH. В этой ситуации запись со стороны ADC к ADCL и ADCH заблокированна и очередное преобразование просто теряется.
|
|
|
|
|
Jan 18 2008, 14:26
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(singlskv @ Jan 18 2008, 13:36)  ...сразу же после считывания ADCL и до считывания ADCH. В этой ситуации запись со стороны ADC к ADCL и ADCH заблокированна и очередное преобразование просто теряется. Вообще-то в момент чтения ADCL содержимое ADCH записывается во временный регистр, извините за банальность  , и таким образом за раз читаются все 16(10) бит. Было бы нелогично запрещать операции записи результата АЦП до завершения чтения временного регистра. Вы ничего не путаете?
|
|
|
|
Сообщений в этой теме
SasaVitebsk Вопрос по АЦП Jan 14 2008, 22:53 Baser Может быть там присутствуют наложения циклов АЦП и... Jan 15 2008, 08:38 GDI При переключении мультиплексора, вроде, рекомендую... Jan 15 2008, 08:52 Сергей Борщ Я тоже склоняюсь к мысли, что это биения от несовп... Jan 15 2008, 08:58 xemul Цитата(Сергей Борщ @ Jan 15 2008, 11:58) ... Jan 15 2008, 12:04    pokos Цитата(SasaVitebsk @ Jan 16 2008, 02:54) ... Jan 16 2008, 08:24     SasaVitebsk Цитата(pokos @ Jan 16 2008, 12:24) Ну, во... Jan 16 2008, 11:36      singlskv Цитата(_Pasha @ Jan 18 2008, 17:26) Вообщ... Jan 18 2008, 14:35   Сергей Борщ Цитата(singlskv @ Jan 15 2008, 22:56) Ну ... Jan 16 2008, 15:19    singlskv Цитата(Сергей Борщ @ Jan 16 2008, 18:19) ... Jan 16 2008, 20:16 pokos Насколько я понимаю процесс жизнедеятельности этог... Jan 15 2008, 14:01 xemul Цитата(pokos @ Jan 15 2008, 17:01) Наскол... Jan 15 2008, 14:32 Сергей Борщ Цитата(pokos @ Jan 15 2008, 16:01) Наскол... Jan 15 2008, 14:36 Anjey_N Хочу тоже задать вопрос!
МК ATmega8, задейств... Jan 15 2008, 17:03 Baser Цитата(Anjey_N @ Jan 15 2008, 19:03) При ... Jan 15 2008, 17:24  Anjey_N Цитата(Baser @ Jan 15 2008, 21:24) Можно ... Jan 15 2008, 17:40 SasaVitebsk Не буду утверждать, так как для каких либо утвержд... Jan 15 2008, 17:46 pokos "ADMUX can be safely updated in the following... Jan 16 2008, 11:49 oran-be Я отжимался со свободным режимом - отлично работае... Jan 16 2008, 18:26 _Pasha В самом первом посте увидел инструкцию STD. У меня... Jan 16 2008, 21:18 _Diman_ Разьясните пожалуйста пару моментов.
13 - 260 ... Jan 16 2008, 21:42 _Pasha Цитата(_Diman_ @ Jan 17 2008, 01:42) По э... Jan 16 2008, 22:09 _Diman_ Небольшоё, аккумулятор-> 510 ом и 0,2uF на земл... Jan 16 2008, 23:20 SasaVitebsk Ещё раз поясняю младший бит не может "отличат... Jan 16 2008, 23:33 IGK Цитата(SasaVitebsk @ Jan 17 2008, 01:33) ... Jan 17 2008, 15:38 SasaVitebsk Сейчас изделие отправили на натурные испытания на ... Jan 17 2008, 17:08 _Pasha Цитата(IGK @ Jan 17 2008, 19:38) Но есть ... Jan 17 2008, 20:14 IGK Цитата(_Pasha @ Jan 17 2008, 22:14) Чушь... Jan 17 2008, 22:47 _Pasha Цитата(singlskv @ Jan 18 2008, 18:35) А г... Jan 19 2008, 04:54 SasaVitebsk Ну это не мой вариант. Я работаю с 8-ми битным реж... Jan 19 2008, 14:18 singlskv Цитата(SasaVitebsk @ Jan 19 2008, 17:18) ... Jan 19 2008, 15:55  _Pasha Цитата(singlskv @ Jan 19 2008, 19:55) Ну ... Jan 19 2008, 19:43   singlskv Цитата(_Pasha @ Jan 19 2008, 22:43) Вы, с... Jan 19 2008, 20:04    _Pasha Цитата(singlskv @ Jan 20 2008, 00:04) Вы ... Jan 19 2008, 20:45 defunct 2 SashaVitebsk.
IMHO считывать АЦП по таймеру нем... Jan 20 2008, 01:56 alux Имею проблему с выводом по UART результата измерен... Apr 15 2008, 08:02 SasaVitebsk А Flags у вас объявлен как volatile?
Просто похоже... Apr 15 2008, 09:19 alux Цитата(SasaVitebsk @ Apr 15 2008, 12:19) ... Apr 15 2008, 12:38  Сергей Борщ Цитата(alux @ Apr 15 2008, 15:38) volatil... Apr 15 2008, 14:07   alux Цитата(Сергей Борщ @ Apr 15 2008, 17:07) ... Apr 15 2008, 16:12 SasaVitebsk Предложу вам другой вариант работы с флагами. Комп... Apr 15 2008, 20:36
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|