Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PWM и ADC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
amaora
1. Насколько я понял 100% заполнение выставить нельзя? Одиночные импульсы все таки проскакивают. Не помню точно а каком случае, когда 0 в регистрах сравнения или TOP.

2. ADC как известно умеет режим noise canlceler. Преобразование запускается при входе в сон. И это вызывает некоторые сложности. Задача: по регулярному событию делать две (четыре, + ещё две т.к. после смены опоры одно преобразование надо отбросить) выборки и преобразования с разных входов АЦП. Надо делать выборки без задержек и дрожащих фронтов. Это можно сделать по событию от например таймера или во free run режиме. В первом случае работу может нарушить sleep, может так случится, что в этот момент нет задач и выполение дойдет до входа в сон, начнется преобразование АЦП когда оно не должно быть (и это нельзя выключить). Во втором (free run) преобразование всегда в процессе, а обновлять ADMUX надо как-то особенно осторожно (в ДШ не очень ясно написано). Пока думаю использовать запуск по событию от таймера и запрещать сон на период использования АЦП (16% времени работы). Но как то это все не красиво, может можно лучше, а я не знаю как?

МК mega88/328, спасибо.

Добавка: Из ДШ,

The MUXn and REFS1:0 bits in the ADMUX Register are single buffered through a temporary register to which the
CPU has random access. This ensures that the channels and reference selection only takes place at a safe point
during the conversion. The channel and reference selection is continuously updated until a conversion is started.
Once the conversion starts, the channel and reference selection is locked to ensure a sufficient sampling time for
the ADC.
Continuous updating resumes in the last ADC clock cycle before the conversion completes (ADIF in
ADCSRA is set). 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.

If Auto Triggering is used, the exact time of the triggering event can be indeterministic. Special care must be taken
when updating the ADMUX Register, in order to control which conversion will be affected by the new settings.

If both ADATE and ADEN is written to one, an interrupt event can occur at any time. If the ADMUX Register is
changed in this period, the user cannot tell if the next conversion is based on the old or the new settings. ADMUX
can be safely updated in the following ways:
a. When ADATE or ADEN is cleared.
b. During conversion, minimum one ADC clock cycle after the trigger event.
c. After a conversion, before the Interrupt Flag used as trigger source is cleared.
When updating ADMUX in one of these conditions, the new settings will affect the next ADC conversion.

Какое-то здесь противоречие, а последнее выделенное (пункт с) я не понимаю. Тот флаг снимется до завершения преобразования.

Ещё добавка: Наверно надо понимать второй пункт немного иначе, "During conversion" там лишнее. Преобразование же начинается только про фронту тактоваого сигнала АЦП. То есть когда оно действительно начнется то ADMUX будет действительно "is locked". А до того это ещё не "During conversion".

Во free runing как я понял к моменту входа в прерывание АЦП уже начинается новое преобразование, то есть можно обновлять ADMUX в прерывании и следующее преобразование будет по заданному каналу.

По поводу пункта c. это больше похоже на флаг ADIF.

Ещё добавка:

3. Как по хорошему обновлять регистры сравнения? При записи в OCR1A/OCR1B может произойти переполнение таймера, между записию двух этих регистров. Одно значение возмется новое, второе старое. И ещё некоторое действие хотелось бы делать после каждого обновления регистров сравнения. А не так, чтобы регистры обновились а действие будет только при следующем переполнении. Решение: останавливать таймер и запрещать прерывание, все быстро делать и включать обратно. Лучше никак нельзя?
RabidRabbit
1. Phase correct PWM mode
The extreme values for the OCR0A Register represent special cases when generating a PWM
waveform output in the phase correct PWM mode. If the OCR0A is set equal to BOTTOM, the
output will be continuously low and if set equal to MAX the output will be continuously high for
non-inverted PWM mode. For inverted PWM the output will have the opposite logic values.

2. c. After a conversion, before the Interrupt Flag used as trigger source is cleared.
Флаг прерывания не обязан очищаться автоматом, можно и руками sm.gif

3. The OCR0x Registers are double buffered when using any of the Pulse Width Modulation
(PWM) modes. For the normal and Clear Timer on Compare (CTC) modes of operation, the double
buffering is disabled. The double buffering synchronizes the update of the OCR0x Compare
Registers to either top or bottom of the counting sequence. The synchronization prevents the
occurrence of odd-length, non-symmetrical PWM pulses, thereby making the output glitch-free.
Так что видимо можно обновлять в прерывании по compare match...
amaora
1. Видел это в ДШ, буду искать ошибку у себя.
2. Здесь больше беспокоит, что вход в сон стартует прерывание. А сон нужен для снижения потребления. Видимо надо будет выключать АЦП, а по событию включать во free running. Включать/выключать каждую миллисекунду тоже не красиво, хотя можно. И во free running менять ADMUX в прерывании тоже похоже можно.
3. Это прерывание может быть где угодно относително момента синхронизации регистров. У меня сейчас два решения,
а) Значения OCR регистров обновляются по миллисекундному (второму) таймеру. Задать частоту исходного таймера кратной первому. Так чтобы обновление происходило максимально далеко от синхронизации и стабильно (ошибка не накапливается) в этот момент.
б) Проверять TCNT регистр, если остается мало времени до синхронизации, то ждать её завершения и обновлять регистры уже после. Думаю как бы это покрасивее сделать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.