Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ацп в mege32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Чип-Хрум
Проблемка значит-це такая , работаю с аккомулятором в сельской месности , при
отсутствии напруги в сети подключается батарея с помощью ацп (первый замер),
в сети постоянно напруга прыгает, посему диодами не отвертишься и приходится во втором
месте мерить напругу чтобы ББума не было.
А вопрос такой насколько быстро можно ацп с 0-й ноги переключить на 1-ю ногу и обратно
да так чтобы показания были верные? Потому как мерил отдельно все выходит ,а пробую вместе
ничего не выходит, даже с задержкой на 300мкс .
defunct
Цитата(Чип-Хрум @ May 20 2007, 17:07) *
А вопрос такой насколько быстро можно ацп с 0-й ноги переключить на 1-ю ногу и обратно
да так чтобы показания были верные? Потому как мерил отдельно все выходит ,а пробую вместе
ничего не выходит, даже с задержкой на 300мкс .

После переключения канала, необходимо сделать одно холостое измерение.
На время "холостого" измерения включайте АЦП с предделителем 0, чтобы измерение проходило максимально быстро. Следующее измерение делайте с нормальными настройками предделителя.
singlskv
Цитата(defunct @ May 20 2007, 19:15) *
После переключения канала, необходимо сделать одно холостое измерение.

Где это написано в даташите ?
Цитата
На время "холостого" измерения включайте АЦП с предделителем 0, чтобы измерение проходило максимально быстро. Следующее измерение делайте с нормальными настройками предделителя.

И чем это поможет ? "Запоминающий" конденсатор перезарядится ?
А если сигнал быстро меняющийся ?
А если измерения происходят один раз в сек/мин/час я тоже должен для получения нужной
точности делать холостое измерение ???

На самом деле меня этот вопрос очень интересует, но к сожалению я ни разу еще не видел
в комплексе, схемы подключения + программы в которых происходит
так называемое "перетекание" из канала в канал.
Если у кого-то такое есть, приведите схему включения + прогу(все что касается данных с АЦП)
defunct
Цитата(singlskv @ May 20 2007, 23:51) *
Где это написано в даташите ?

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.
However, the simplest method is to wait for the first conversion to complete, and then
change the channel selection. Since the next conversion has already started automatically,
the next result will reflect the previous channel selection.
Subsequent conversions
will reflect the new channel selection.


Сценарий программы где перетекание обязательно будет присутствовать (по схеме - будем считать что все рекомендациям ДШ учтены):

void Timer_ISR(void)
{
// Выбор канала
// Запуск АЦП в free running mode (SFIOR == 0)
}

void ADC_ISR(void)
{
// чтение АЦП
// если не последний канал
// то смена канала и запуск АЦП
// обработка текущего рез-тата
}
singlskv
Цитата(defunct @ May 21 2007, 02:17) *
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.
However, the simplest method is to wait for the first conversion to complete, and then
change the channel selection. Since the next conversion has already started automatically,
the next result will reflect the previous channel selection.



Цитата(defunct @ May 21 2007, 02:17) *
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.
However, the simplest method is to wait for the first conversion to complete, and then
change the channel selection. Since the next conversion has already started automatically,
the next result will reflect the previous channel selection.


Ну и где здесь написано что первое преобразование будет неверным ?
ИМХО, здесь всего лишь написанно что если будет ошибка с моментом выбора
следующего канала, то вероятно, будет "оцифрован" не тот канал...
defunct
Цитата(singlskv @ May 21 2007, 00:44) *
Ну и где здесь написано что первое преобразование будет неверным ?

Since the next conversion has already started automatically,
the next result will reflect the previous channel selection. Subsequent conversions
will reflect the new channel selection.
--
Т.к. следующее измерение уже было автоматически запущено - следующий результат будет отображать старый канал. Последующие преобразования будут относиться к новому каналу.

Цитата
ИМХО, здесь всего лишь написанно что если будет ошибка с моментом выбора
следующего канала, то вероятно, будет "оцифрован" не тот канал...

Нет, об ошибках там не сказано..
Там сказано, что если АЦП не выключать (ADEN = 0), то однозначно первый результат после переключения будет со старого канала, последующие - уже с нового канала.
Это справедливо по крайней мере для m16/m32.

Про ошибки Single conversion mode, в ДШ ничего не сказано, но они есть.

Или отключать АЦП - менять канал - потом включать,
или пропускать одно измерение,
или .. обрабатывать со сдвигом..
singlskv
Цитата(defunct @ May 21 2007, 02:56) *
Since the next conversion has already started automatically,
the next result will reflect the previous channel selection. Subsequent conversions
will reflect the new channel selection.
--
Т.к. следующее измерение уже было автоматически запущено - следующий результат будет отображать старый канал. Последующие преобразования будут относиться к новому каналу.
Нет, ни о каких ошибках там не сказано.. И там также не сказано "вероятно".
Там сказано что однозначно первый результат после переключения будет со старого канала, следущий результат - уже с нового канала.

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

Вы просто не очень хорошо понимаете как происходит преобразование в АЦП
и в АЦП AVR в часности,

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

Попробуйте понять работу АЦП как некоторый таймер, со своим предделителем, и
при этом нужно иметь в виду что этот таймер/делитель начинает работать в
момент когда Вы сказали ADEN...
defunct
Цитата(singlskv @ May 21 2007, 01:15) *
Вы просто не очень хорошо понимаете как происходит преобразование в АЦП
и в АЦП AVR в часности,

Интересный вывод, может быть и так...

В АВР логика АЦП постороена так:

Компаратор на один из входов, которого заведен измеряемый сигнал, на второй - выход ЦАП.
На ЦАП выдаются комбинации:
0b1000000000
0bx100000000
0bxx10000000
..
0bxxxxxxxxx1
где x определяется логикой захвата с выхода компаратора < >
после того как последний бит "проверен" - значение входа ЦАП переписывается в регистры ADCx.

А в "физике" участвует еще входная цепь с RC..

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

Во Free running режиме АЦП работает постоянно. Считайте что любой момент времени "неправильный".

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

Нет, ADEN просто "подключает" питание к этому всему делу.
Работать же это все начинает по "запуску" (либо ADSC, либо внешний сигнал запуска)
Dopler
Цитата(defunct @ May 21 2007, 03:53) *


Автор про Free Runing mode ничего не говорил. Кто в данном случае мешает использовать Single Conversion mode по таймеру? Тогда никаких пустых циклов не нужно.
singlskv
Цитата(defunct @ May 21 2007, 03:53) *
Нет, ADEN просто "подключает" питание к этому всему делу.
Работать же это все начинает по "запуску" (либо ADSC, либо внешний сигнал запуска)

datasheet:
The channel selection may be changed one ADC clock cycle after writing one to ADSC.

Еще раз,
Побробуйте относится к работе ADC как к таймеру с предделителем в ранних AVR.
ADC(таймер) запускает свой цикл не в момент когда Вы записали ADSC, а
только когда в соответствии с выбранным преддителем начнется новый цикл ADC.

Цитата
А в "физике" участвует еще входная цепь с RC..

ИМХО, А вот это как раз и есть основная причина почему много кто жалуется на
так называемое "перетекание" из канала в канал

Цитата(Dopler @ May 21 2007, 09:17) *
Автор про Free Runing mode ничего не говорил. Кто в данном случае мешает использовать Single Conversion mode по таймеру? Тогда никаких пустых циклов не нужно.

Ну вот собственно так и делаю, никаких "перетеканий" не замечал.
defunct
Цитата(singlskv @ May 21 2007, 09:49) *
The channel selection may be changed one ADC clock cycle after writing one to ADSC.

Как это связано с приведенной вами моей цитатой?
Я не советовал менять канал после запуска АЦП... А говорил о разнице между ADEN и ADSC..

Цитата
Цитата
А в "физике" участвует еще входная цепь с RC..

ИМХО, А вот это как раз и есть основная причина почему много кто жалуется на
так называемое "перетекание" из канала в канал

Ok, если отбросить Free Running, тогда согласен, что это и есть причина "перетекания".

В таком случае чтобы этого не было надо придерживаться рекомендаций даташита, относительно выходного сопротивления сигнала (не более 10k). Но не всегда это возможно, например при измерении напряжения сети 220В выходное сопротивление будет однозначно больше 10k.
singlskv
Цитата
Нет, ADEN просто "подключает" питание к этому всему делу.
Работать же это все начинает по "запуску" (либо ADSC, либо внешний сигнал запуска)

Цитата(defunct @ May 21 2007, 14:28) *
Как это связано с приведенной вами моей цитатой?
Я не советовал менять канал после запуска АЦП... А говорил о разнице между ADEN и ADSC..

Так вот, как раз "запуск" (либо ADSC, либо внешний сигнал запуска), это на самом
деле не запуск преобразования, а всего лишь флаг который говорит процу
что мы хотим запустить преобразование. Реальный цикл преобразования
начнется в промежутке 0..(N-1)тактов от момента записи ADSC где N-значение предделителя.
Цитата
Ok, если отбросить Free Running, тогда согласен, что это и есть причина "перетекания".

А зачем его отбрасывать ?
Делаем так:
- включаем ADEN
- запускаем ADSC в режиме Singl Conversation на первом канале (это чтобы прошло первое
"длинное" преобразование)
- запускаем ADSC в режиме Free Running на первом канале и разрешаем прерывание ADC
- ждем N тактов (N - предделитель)
- меняем MUX на второй канал
- в прерывании ADC читаем значение последнего канала и в MUX выставляем следующий
Цитата
В таком случае чтобы этого не было надо придерживаться рекомендаций даташита, относительно выходного сопротивления сигнала (не более 10k).

Рекомендаций даташита нужно придерживаться всегда.
Никто ведь, например, не ставит в серийные устройства AVR на частоте 30 МГц smile.gif
А с АЦП рекомендации нарушают все кому не лень, после чего и появляются такие
топики smile.gif
Цитата
Но не всегда это возможно, например при измерении напряжения сети 220В выходное сопротивление будет однозначно больше 10k.

Ну операционник то, ведь можно поставить ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.