Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ЦАП на ШИМ Atmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
_Ie0nid
Добрый день.
Использую ШИМ в качестве ЦАП, и в будущем, допустим RC фильтр. С помощью, также местного АЦП, выборками в 6.6 раз чаще частоты сигнала (допустим 1кГц) оцифровываю аналоговый сигнал, закидываю значение выборки в ОЗУ и тут же ШИМю. ВОпрос-Могу ли я быстро ШИМить данную выборку, потом отключать ШИМ и производить различные вычисления? У меня в таком случае будут получаться очень тонкие печки с длинными промежутками. Правильно ли это?
И еще, есть ли возможность, выдрать из ОЗУ накопленные значения выборок взятых с частотой 6.6345 кГц и отправить их на ШИМ. Мне кажется я должен их выпленуть их точно с такой же частотой. Но мне также кажется что я ошибаюсь, потому как кооффициент заполнения, на котором все основано, не меняется. Пожалуста поясните этот момент.
И еще, если есть какие-то принципиальные моменты для построения бюджетного ЦАП на ШИМ, пожалуйста поделитесь.
Заранее спасибо.
V_G
ЦАП на ШИМ для формирования сигнала в реальном времени выглядит примерно так: новый отсчет (значение OCR) загружаете по прерыванию таймера от переполнения. При этом прерывания по переполнению должны следовать, понятно, с частотой дискретизации. Есть в меге128 (и в других, наверное) режим PWM, когда коэффициент переcчета (определяющий частоту дискретизации) можно менять довольно плавно значениями регистров ICRn или OCRnA, но при этом надо заботиться, чтобы в регистры сравнения PWM загружались числа, не превышающие модуля счета.

По Вашим вопросам
1. Частота дискретизации (переполнения PWM) не может давать 2 выборки на период - не выполняются условия теоремы Котельникова. Строго больше 2. А частота среза внешнего RC фильтра должна быть по возможности ближе к верхней частоте спектра формируемого сигнала, а сам фильтр должен макисмально подавлять частоты выше половины частоты дискретизации. Я обычно ставлю активный фильтр на операционниках, рассчитываю в каком-нибудь FilterWiz, хотя можно и пассивный, у меня просто нет соотв. программы синтеза. Чем выше частота дискретизации, тем проще фильтр.

2. Выборки выплевываются не сразу по получении с АЦП, а синхронно с перепролнением счетчика ШИМ (по прерыванию). Времени это особо не занимает, так что можно спокойно делать другие расчеты (если они не затрагивают выводимое значение)
_Ie0nid
здраствуйте

1. "При этом прерывания по переполнению должны следовать, понятно, с частотой дискретизации" - то есть, лучше всего ,как только я получил значение от АЦП, быстро преобразовать и сразу его ШИМИТЬ, чтобы частота дискретизация АЦП не отличалась от частоты преобразования ШИМ.
2. Я еще упустил как-то момент, имеет ли значение как быстро можно посчитать таймером ШИМА, можно ли это делать максимально быстро, или лучше поделить тактовую частоту таймера. Есть ли какие-то рекомендации у вас на этот счет.
3. И все-таки, если я заполнил когда-то ОЗУ данными, чтобы их восстановить я должен буду это делать ШИМОМ с точной такой же частотой дискретизации? А если частота дискритизации, с которой я их получил имеет довольно дробное значение. МОжно ли как ни будь от нее отклонится. Или есть возможность по другому реализовать эту проблему.

Заранее спасибо.

Прошу прощения если чего-то не понял
niXto
3. С какой частотой получались данные, с такой и кидайте их в регистр сравнения ШИМа. При этом обновление внутреннего регистра сравнения происходит ТОЛЬКО в моменты переполнения, то есть "лишние" байты (если частота оцифровки больше частоты ШИМа) будут игнорироваться.

2. Уменьшать разрядность ШИМа не рекомендую - уменьшится точность а она и так невелика - 8 бит... Рекомендую АТтини25...85 - у них под ШИМ есть встроенный 64-МГц генератор, дело пойдет гораздо веселей.
SasaVitebsk
Цитата(_Ie0nid @ Dec 3 2009, 06:31) *
здраствуйте

1. "При этом прерывания по переполнению должны следовать, понятно, с частотой дискретизации" - то есть, лучше всего ,как только я получил значение от АЦП, быстро преобразовать и сразу его ШИМИТЬ, чтобы частота дискретизация АЦП не отличалась от частоты преобразования ШИМ.

1) Если вы будете "не сразу ШИМить", то получите сдвиг по фазе. В общём-то он появится практически в любом случае, и как правило, ничего страшного в этом нет.
2) Частота дискретизации при получении и выдаче сигнала может отличаться. Вообще немного непонятно из вашего сообщения. Если требуется просто повторить сигнал, то зачем вообще этот огород городить, а если требуется его изменить, то привязка к частоте дискретизации входного сигнала необязательна. Даже при повторении сигнала, вы можете апроксимировать сигнал в нужных вам точках и вывести с любой частотой дискретизации.

Надо учитывать, что обработка сигнала требует значительных вычислительных ресурсов. Сколь-нибудь сложная обработка "на лету" сигналов частоты выше 4кГц в рамках меги достаточно затруднительна. Для этой цели используются другие процессоры.
Цитата
2. Я еще упустил как-то момент, имеет ли значение как быстро можно посчитать таймером ШИМА, можно ли это делать максимально быстро, или лучше поделить тактовую частоту таймера. Есть ли какие-то рекомендации у вас на этот счет.

Таймер всё делает автоматически. Предварительное деление частоты - естественно предусмотрено.
Цитата
3. И все-таки, если я заполнил когда-то ОЗУ данными, чтобы их восстановить я должен буду это делать ШИМОМ с точной такой же частотой дискретизации? А если частота дискритизации, с которой я их получил имеет довольно дробное значение. МОжно ли как ни будь от нее отклонится. Или есть возможность по другому реализовать эту проблему.

Я уже писал - нет. Вы можете по известным точкам восстановить сигнал в точках выдачи и выдать с другой частотой дискретизации. Правда объём памяти достаточно мал.
_Ie0nid
Здраствуйте.
"Я уже писал - нет. Вы можете по известным точкам восстановить сигнал в точках выдачи и выдать с другой частотой дискретизации..."
- Не смотря на то, что я решил все дать на лету. Прошу разъяснить все таки этот момент. Итак, я закидал в память значения сигнала полученные бог знает когда. Частота дискритезации мне известна, допустим она была 4456 Гц (предположим, на самом деле там другое число). Теперь, естсвенно, частота ШИМа у меня не совпадает, потому как АЦП это делала через 13 тактов, а Шим это делает через 512 и с другими коэффициентами деления. Даже если я буду вставлять задержки, частота ШИМ не будет совпадать с частотй дискритезации. И я естсветенно отклоняюсь от этого сигнала, и память начнет освобождаться медленеей (или быстрей), и вроде как, если представить это все на картинке, выборки будут растягиваться по времени одна от другой, а значит и частота сигнала вроде как на выходе будет уже другая. Я пдозреваю, что здесь решает все коэффициент заполнения, но как-то в голове с трудом вяжется этот физический процесс с возможностью апроксимировать сигнал в тот, что был раньше.
Я понимаю, что вопрос почти без последующего практического примнение и все таки прошу подсказать в чем соль, что упускаю.
Заранее спасибо.
niXto
Цитата(_Ie0nid @ Dec 4 2009, 06:44) *
Здраствуйте.
"Я уже писал - нет. Вы можете по известным точкам восстановить сигнал в точках выдачи и выдать с другой частотой дискретизации..."
- Не смотря на то, что я решил все дать на лету. Прошу разъяснить все таки этот момент. Итак, я закидал в память значения сигнала полученные бог знает когда. Частота дискритезации мне известна, допустим она была 4456 Гц (предположим, на самом деле там другое число). Теперь, естсвенно, частота ШИМа у меня не совпадает, потому как АЦП это делала через 13 тактов, а Шим это делает через 512 и с другими коэффициентами деления. Даже если я буду вставлять задержки, частота ШИМ не будет совпадать с частотй дискритезации. И я естсветенно отклоняюсь от этого сигнала, и память начнет освобождаться медленеей (или быстрей), и вроде как, если представить это все на картинке, выборки будут растягиваться по времени одна от другой, а значит и частота сигнала вроде как на выходе будет уже другая. Я пдозреваю, что здесь решает все коэффициент заполнения, но как-то в голове с трудом вяжется этот физический процесс с возможностью апроксимировать сигнал в тот, что был раньше.
Я понимаю, что вопрос почти без последующего практического примнение и все таки прошу подсказать в чем соль, что упускаю.
Заранее спасибо.

Запускай АЦП не когда ему захочется, а по таймеру например. И тогда по тем же настройкам таймера загоняй данные из ОЗУ в ШИМ
SasaVitebsk
Цитата(_Ie0nid @ Dec 4 2009, 07:44) *
Я понимаю, что вопрос почти без последующего практического примнение и все таки прошу подсказать в чем соль, что упускаю.

Вообще-то это базовые понятия. Представьте что у вас спрашивают "как дышать?". Ответ вы знаете, но объяснить сложно. Потому что объём пояснений непонятен.

Почитайте понятия "интерполяция" и "экстраполяция". В принципе требуется интерполяция или квадратичная интерполяция сигнала.

В двух словах поясню на простом примере (надо понимать, что на самом деле всё значительно сложнее).
Представим что мы оцифровываем входной сигнал с частотой дискретизации 4 кГц. А выходной сигнал с частотой 8 кГц. (Выбираю кратную частоту для упрощения понимания процесса).
Входной сигнал следующий 5,15,85,105,...
Выходной сигнал будет 5,х,15,х,85,х,105,х,... где х- "выпавшие" значения. То есть значения в котором неизвестен сигнал.
Если использовать линейную интерполяцию (как правило используется квадратичная, здесь я для примера привожу), то сигнал в помежуточных точках находится в середине от входного.
То есть он будет 5,10((5+15)/2),15,50,85,95,105,...
Возмите постройте график и постройте входной сигнал и результирующий.

При использовании квадратичной интерполяции качество восстановления сигнала намного выше получается. В цифрах не помню, но вроде для гармонического сигнала более 90%. Естественно пересчитываются все точки, а не надуманные выпавшие. При квадратичной интерполяции требуется 3 ближайших точки для восстановления сигнала в заданной.

Короче всего не расскажешь - надо читать. Это знания даже не базовые а начальные. Базовые должны быть значительно серьёзнее.
V_G
По-хорошему "выпавшие" значения при интерполяции заменяются нулями, и результирующий сигнал пропускается через цифровой ФНЧ. Это наиболее правильный метод с точки зрения сохранения спектра оцифрованного сигнала.
acorn
Цитата(V_G @ Dec 4 2009, 15:24) *
сигнал пропускается через цифровой ФНЧ

А вот подскажи формулу такого ФНЧ. У меня выборки в районе 1200 Гц, а интересуют сигналы намного меньшей частоты, 2-10 Гц, скажем. Или программу для рассчета таких фильтров, эффективных с точки зрения вычислений.
Спасибо.
V_G
Я считаю фильтры в Матлабе (с установленным компонентом filter design toolbox).
Для частоты выборки 1200, а верхней частоты спектра 10 Гц КИХ фильтр (FIR по ненашему) будет иметь минимальный порядок, Матлаб меньше 4 у меня вообще не считает.
БИХ (IIR) еще эффективней, но часто требует вычислений с плавающей точкой, т.к. коэффициенты фильтра разнятся на порядки.
По-любому это сумма произведений, аппаратное умножение в большинстве avr-ок есть, так что проблем быть не должно.
Для КИХ формула такая:

yn=a0xn+a1xn-1+...+aMxn-M

где y - выходной отсчет, x - входные отсчеты, а - коэффициенты фильтра, M - порядок фильтра
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.