Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ШИМ на ATtiny25
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
vv_gulyaev
Здравствуйте. Хочу реализовать ШИМ-контроллер на ATtiny25 в 8 выводном корпусе. Собираюсь использовать внутренний 8МГц RC-генератор. В связи с этим возникли вопросы: импульсы какой максимальной частоты можно будет получить на выходах и возможен ли сдвиг по фазе импульсов друг относительно друга.
Палыч
Цитата(vv_gulyaev @ May 6 2009, 09:41) *
возникли вопросы импульсы какой максимальной частоты можно будет получить на выходах и возможен ли сдвиг по фазе импульсов друг относительно друга.
Формула частоты приведена в даташите. О максимальной частоте говорить трудно - можно и 8МГц, но шириной импульсов тогда невозможно будет управлять...
Сдвиг по фазе - это сдвиг при изменении ширины импульса? Если это критично, можно выбрать нужное условие изменения выхода ШИМ.

P.S. Про максимальную частоту в 8МГц - соврал, с tiny26 перепутал. В tiny25 максимальная частота будет 8/256=31,25 кГц.
stells
Цитата(vv_gulyaev @ May 6 2009, 10:41) *
возможен ли сдвиг по фазе импульсов друг относительно друга.

на каких именно выводах?
vv_gulyaev
Цитата(Палыч @ May 6 2009, 11:16) *
Формула частоты приведена в даташите.


Там написано, что в режиме Clear Timer on Compare Match (CTC) Mode f=FclkI_O/(2(1+OCRnx)). Я правильно понял, что управляя регистром OCRnx, можно регулировать выходную частоту.

Цитата(Палыч @ May 6 2009, 11:16) *
Сдвиг по фазе - это сдвиг при изменении ширины импульса?


Нужно, чтобы, на 4х выводах импульсы были сдвинуты по фазе друг относительно друга, т.е. передние фронты импульсов начинаются в разное время.
Палыч
Цитата(vv_gulyaev @ May 6 2009, 10:32) *
Там написано, что в режиме Clear Timer on Compare Match (CTC) Mode f=FclkI_O/(2(1+OCRnx)). Я правильно понял, что управляя регистром OCRnx, можно регулировать выходную частоту.
Вам ведь не просто частота нужна, а ШИМ - т.е. другой режим таймера: один из PWM mode. В обоих этих режимах у t25 частота зависит от частоты генератора и установленного прескалера - и всё!
Цитата(vv_gulyaev @ May 6 2009, 10:32) *
Нужно, чтобы, на 4х выводах импульсы были сдвинуты по фазе друг относительно друга, т.е. передние фронты импульсов начинаются в разное время.
Это Вы - большой мечтатель! У t25 только один таймер и его выход можно получить на одной ноге. Не получится получить аппаратно четыре ШИМа. Только - программно! Сделать это можно, но точности по длительности будут, конечно, хуже, чем при аппаратной реализации...

Вы озвучте: какая частота следования импульсов Вам нужна; какие длительности импульсов (от... до...), сдвиги фаз между импульсами на разных ногах; требуемые точности всего этого... Попробуйте сформулировать стоящую перед Вами задачу.
vv_gulyaev
Цитата(Палыч @ May 6 2009, 12:15) *
Попробуйте сформулировать стоящую перед Вами задачу.


Нужно получить 4 сигнала одинаковой частоты сдвинутые друг относительно друга на 1/4 периода. Частота примерно 100КГц. Также интересует какую минимальную длительность импульса можно получить программно.
stells
Цитата(Палыч @ May 6 2009, 12:15) *
Это Вы - большой мечтатель! У t25 только один таймер и его выход можно получить на одной ноге.

у него 2 таймера, у каждого по два выхода, но они инверсные
но 4 разных сигнала по любому можно получить только программно и соответственно с меньшими частотами
Палыч
Цитата(vv_gulyaev @ May 6 2009, 11:23) *
Частота примерно 100КГц.
Ну, давайте подсчитаем... Частоту генератора (8МГц) делим на частоту следования импульсов. Получаем 80 тактов на период следования импульсов. За это время можно выполнить не более 80 команд. Если тупо генерить программно импульсы, то возможно бы этого бы и хватило (но, не факт). Вам же ещё нужно принимать от внешнего источника ширину импульса... Очень даже сомневаюсь, что программно можно это реализовать для таких частот...
stells
Цитата(vv_gulyaev @ May 6 2009, 12:23) *
Нужно получить 4 сигнала одинаковой частоты сдвинутые друг относительно друга на 1/4 периода. Частота примерно 100КГц. Также интересует какую минимальную длительность импульса можно получить программно.

с частотой 100кГц программно запросто все сгенерите, правда все зависит от общей загрузки МК. минимальная длительность импульса - 1 такт.
Палыч
Цитата(stells @ May 6 2009, 11:42) *
с частотой 100кГц программно запросто все сгенерите, правда все зависит от общей загрузки МК. минимальная длительность импульса - 1 такт.
Товарищ, конечно, погорячился...
Длительности импульсов откуда берутся? Как определяется их ширина?
Думаю, что реально можно получить Ваши сигналы с частотой следования 1кГц (может быть 2кГц). При этом длительности импульсов можно задавать с точностью 0,01мс (или 0.005мс).
stells
Цитата(Палыч @ May 6 2009, 12:55) *
Товарищ, конечно, погорячился...
Длительности импульсов откуда берутся? Как определяется их ширина?

не погорячился, хотя конечно времени на обработку не много. но если длительность берется из таблицы, а ширину получаем (допустим) из непрерывного АЦП, то почему Вы считаете, что за 10мкс нельзя сформировать программно 8 переключений портов?
Microwatt
MK такого калибра для этого принципиально не годится. Можно получить эффект ШИМ, но не ШИМ для работы реального силового ключа. Разве что, светодиодики по яркости регулировать.
По-видимому, нужно смотреть дискретные счетчики, регистры, компараторы.
stells
Цитата(Microwatt @ May 6 2009, 13:06) *
Можно получить эффект ШИМ, но не ШИМ для работы реального силового ключа. Разве что, светодиодики по яркости регулировать.

конечно, серьезную задачу таким ШИМом не решить
Палыч
Цитата(stells @ May 6 2009, 12:04) *
но если... то почему Вы считаете, что за 10мкс нельзя сформировать программно 8 переключений портов?
Полностью условия задания мы с Вами не знаем... Конечно, если напрячься, то что-то сделать - можно. Но, не забывайте, что автор вопроса - начинающий (раз сюда запостил свой вопрос), и такую задачу он вряд ли вытянит...
stells
Цитата(Палыч @ May 6 2009, 13:20) *
Полностью условия задания мы с Вами не знаем... Конечно, если напрячься, то что-то сделать - можно.

не знаем, согласен... но теоретически сделать 4-канальный ШИМ с низким разрешением можно... аккуратненько, на ассемблере
Палыч
Цитата(stells @ May 6 2009, 12:25) *
с низким разрешением можно...
Термин "с низким разрешением" - это "точность плюс-минус лапоть"?
stells
Цитата(Палыч @ May 6 2009, 13:30) *
Термин "с низким разрешением" - это "точность плюс-минус лапоть"?

80 команд на цикл - это теоретически 1,25%. реально конечно хуже получится
не о том спорим, нужно понимание, для чего это нужно
Палыч
Цитата(stells @ May 6 2009, 12:40) *
80 команд на цикл - это теоретически 1,25%. реально конечно хуже получится
Вот именно - реально хуже получится. Имхо, при однократном задании длительности импульсов (т.е. задали длительность и не меняем) можно, наверное, получить временные интервалы с погрешностью менее 5%, если же длительности импульсов будут меняться на каждом периоде (даже если и "очень плавно"), то погрешности, наверное, будут под 50%.

Может быть, автору решить задачу иначе: МК генерит один сигнал ШИМ, а внешний сдвигающий регистр формирует недостающие три; тактирование сдвигающего регистра - от МК?
vv_gulyaev
Цитата(Палыч @ May 6 2009, 14:02) *
Может быть, автору решить задачу иначе: МК генерит один сигнал ШИМ, а внешний сдвигающий регистр формирует недостающие три; тактирование сдвигающего регистра - от МК?


Спасибо, за советы. Наверное я остановлюсь на том, чтобы задать длительность жестко и выдавать импульсы с 4 выходов. На сколько я понял из обсуждения это получить реально.
stells
Цитата(vv_gulyaev @ May 6 2009, 14:45) *
Спасибо, за советы. Наверное я остановлюсь на том, чтобы задать длительность жестко и выдавать импульсы с 4 выходов. На сколько я понял из обсуждения это получить реально.

с постоянными частотой и скважность? конечно
но погрешность все-равно появится из-за разного времени выполнения программы при условных переходах и т.д.
Microwatt
Цитата(vv_gulyaev @ May 6 2009, 13:45) *
Спасибо, за советы. Наверное я остановлюсь на том, чтобы задать длительность жестко и выдавать импульсы с 4 выходов. На сколько я понял из обсуждения это получить реально.

На всякий случай, разберитесь с тем что такое ШИМ, тем более, многофазный, и для чего он нужен. Чтобы после окончательной отладки программы не осенило, что все это были бесполезные усилия изначально.
Плохонький ШИМ может иметь 128 позиций. Да на четыре фазы, да на 100кГц. Это будет такт решения задачки.... попробуйте посчитать. И каждый такт ждите потенциального прерывания по короткому замыканию. Его нужно обработать максимум за 500наносекунд.
Ищите постановщика системной задачи - грамотного схемотехника. Он дальше расскажет что и где нужно написать в программе, а где вообще без программ обойтись нужно.
vv_gulyaev
Цитата(Microwatt @ May 6 2009, 15:08) *
На всякий случай, разберитесь с тем что такое ШИМ, тем более, многофазный, и для чего он нужен.

Да, я погорячился с названием темы. На данном этапе нужно просто 4 импульса одинаковой частоты(примерно 100 КГц) сдвинутые на 1/4 периода.
Палыч
Цитата(vv_gulyaev @ May 6 2009, 13:45) *
Наверное я остановлюсь на том, чтобы задать длительность жестко и выдавать импульсы с 4 выходов.
Если это - то, что Вам нужно (в чём я сомневаюсь), то реализовать можно. Писать программу нужно будет на ассемблере, на языке высокого уровня вряд ли получится что-то путное. Основной цикл программы будет довольно примитивный:
1.Вывод "значение 1" в порт В
2.Задержка 1
3.Вывод "значение 2" в порт В
4.Задержка 2
5.Вывод "значение 3" в порт В
6.Задержка 3
...........
15.Вывод "значение 8" в порт В
16.Задержка 8
17.Переход на п.1
Значения, выводимые в порт, и величины задержек будут зависить от длительности импульсов. Кроме того, общее время выполнения цикла должно быть 80 тактов для частоты 100кГц и частоты тактирования МК 8МГц. Можно значения, выводимые в порт, и величины задержек хранить в виде двух массивов, а программу упростить до:
1.Вывод "значение i" в порт В
2.Задержка i
3.Взять следующее i
4.Переход на п.1
Однако, такая программа хоть и станет "более настраиваемой", но точность выдержки задержек - резко упадёт. Если это не критично, то второй вариант мне кажется предпочтительней...
vv_gulyaev
Еще возник вопрос по поводу программирования tiny25. Имеется программатор ByteBlasterII и программа Avreal Shell. В списке доступных микросхем нет tiny25, хотя в сети видел упоминания, что она должна поддерживаться этим программатором. В наличии микросхем пока нет, поэтому хотелось бы узнать возможно ли использовать BBII для программирования tiny25, или нужно покупать/паять AVRISP.
ReAl
Цитата(vv_gulyaev @ May 8 2009, 11:34) *
В списке доступных микросхем нет tiny25, хотя в сети видел упоминания, что она должна поддерживаться этим программатором. В наличии микросхем пока нет, поэтому хотелось бы узнать возможно ли использовать BBII для программирования tiny25, или нужно покупать/паять AVRISP.
Можно и довольно давно, c 2006 года, просто avreal shell об этом может не знает (или версия shell-а посвежее нужна), это только оболочка над собственно программатором avreal (хм... а там и звёздочку давно пора снимать...)
vv_gulyaev
Цитата(ReAl @ May 8 2009, 12:55) *
просто avreal shell об этом может не знает (или версия shell-а посвежее нужна),

В интернете нашел лишь одну версию avreal shell это версия 1,08.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.