Исправление фьюзов AVR. Исправление фьюзов AVR Fast avr схему


Широтно-Импульсная Модуляция (ШИМ, PWM). Урок AVR 8

Наверное, вы не раз задавались вопросом, как можно регулировать мощность потребителя, например управлять яркостью светодиода или регулировать обороты двигателя. Самый простой способ - последовательно нагрузке, например светодиоду, включить резистор, но ведь он будет греться и забирать драгоценную энергию, и чем мощней светодиод, тем сильней будет греться наш резистор, такой вариант не для нас. А что если светодиод очень быстро включать и выключать, при этом меняя длительность включений при константной частоте? Например, включать светодиод на 0,2 милисекунди каждую милисекунду, то светодиод засветится, но не на полную яркость. Аналогично с двигателем - включать движок на 30 секунд каждую минуту - тогда двигатель раскрутится, но не на полную скорость - относительно большой вес ротора сгладит рывки от включающегося двигателя, а сопротивление от трения будет его притормаживать. Таким образом, двигатель будет крутится на половину своей мощности.

Широтно-импульсная модуляция

- приближение желаемого сигнала (многоуровневого или непрерывного) к действительным бинарным сигналам (с двумя уровнями - вкл / выкл), так, что, в среднем, за некоторый отрезок времени, их значения равны.

Основной причиной внедрения ШИМ является сложность обеспечения произвольным напряжением. Есть какое-то базовое постоянное напряжение питания (сети, от аккумуляторов и пр.). И на его основе нужно получить более низкую и уже им питать электродвигатели или иное оборудование. Самый простой вариант - делитель напряжения, но он имеет пониженное КПД, повышенное выделением тепла и расходом энергии. Другой вариант - транзисторная схема. Она позволяет регулировать напряжение без использования механики. Основное преимущество ШИП - высокий КПД его усилителей мощности, который достигается за счет использования исключительно в ключевом режиме. Это значительно уменьшает выделение мощности на силовом преобразователе (СП).

ШИМ является импульсный сигнал постоянной частоты и переменной скважности, то есть отношения периода следования импульса к его длительности. С помощью задания скважности (длительности импульсов) можно менять среднее напряжение на выходе ШИМ . У цифровой технике, выходы которой могут принимать только одно из двух значений, приближение желаемого среднего уровня выхода с помощью ШИМ является совершенно естественным. Давайте на практике попробуем изменять яркость светодиода. Схема очень проста как в первом уроке:

Самое главное находится в прошивке:

void main(void)
{ PORTB=0x00; //Выставляем все выходы порта B на 0 DDRB=0xFF; //Делаем порт B как выход, чтобы мы могли менять лог уровень на ножках (устанавливать или 0 или 1) while (1) //Организовываем бесконечный цикл { PORTB.1=1; //Включаем светодиод на 1 выходе порта B delay_us(5); //разрешаем светодиоду посветится 5 микросекунд PORTB.1=0; //Выключаем светодиод на 1 выходе порта B delay_us(5); //Делаем задержку на 5 микросекунд }; }

Компилим и закидываем в мк, светодиод должен светится на половину яркости. Но вы, наверное, уже успели заметить, что наша программа только то и делает, что устанавливает лог-уровни на выводе мк. Чтобы освободить главный цикл от этой рутинной работы, мы воспользуемся таймером.

Апаратный ШИМ
Таймер может генерировать ШИМ в нескольких режимах:

Итак, для наших нужд (регулировка яркости светодиода) подходит режим Fast PWM . Запускаем CodeWizard AVR, переходим на вкладку timers->timer1, выставляем все, как показано на скриншоте

  • Clock Source - выбор источника тактирования таймера, выбираем System Clock - таймер тактируeтся частотой, на которой работает микроконтроллер
  • Clock Value - выбор частоты работы таймера, здесь мы установили 1000000 hz, это значит, что переменная TCNT1 будет переполнятся с частотой 1000000/255 = 3921 hz, частота ШИМ будет 3921 khz
  • out A (вывод А) определяет состояния ножки OC1A при совпадении счетного регистра и регистра сравнения
  • Comp. A значение регистра сравнения
Кликаем File->Generate and save.

#include void main(void) { // Port B initialization PORTB=0x00; DDRB=0x02; // Timer/Counter 1 initialization TCCR1A=0x81; TCCR1B=0x09; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x64;// число 100 в шестнадцатеричном виде OCR1BH=0x00; OCR1BL=0x00; while (1) { }; }

Компилим и закидаем в мк, теперь наш светодиод должен светиться примерно на половину яркости.

Давайте теперь попробуем что-нибудь пропищать с помощью таймера:
Схема подключения динамика к мк:

Таймер мы установим в режим Fast PWM и будем плавно менять частоту от 0 - 4 khz.
Код такой программы выглядит следующим образом:

#include #include void main(void) { // Port B initialization PORTB=0x00; DDRB=0x02; // Timer/Counter 1 initialization TCCR1A=0x40; TCCR1B=0x09; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x64; OCR1BH=0x00; OCR1BL=0x00; while (1) { OCR1AL++; // увеличиваем регистр сравнения на 1, чтобы изменилась частота delay_ms(100); }; }

Еще один простой пример изготовления отладочной платы, но на этот раз для устройств с применением микроконтроллера ATTiny2313. Расположение ножек для программирования у ATTiny2313 идентичное ATTiny13. Соответственно и платы выйдут похожими. Отличием от будет наличие внешнего задающего генератора (кварца). По умолчанию, с завода ATTiny2313 поставляется с включенным внутренним генератором, поэтому если работа микроконтроллера не планируется от внешнего генератора его можно не устанавливать. Разъем питания дублируем на случай подключения к плате программатора с питанием от схемы (на один разъем подаем питание, с другого питаем программатор).


Для изготовления отладочной платы устройств на ATTiny2313 нам нужно:


Собираем отладочную плату по рисунку:

1 припаиваем в панельку под микросхему и штырьки (как на рисунке);
2 как показано на рисунке (красная линия) делаем перемычку с лицевой стороны платы. Еще одну перемычку делаем с другой стороны;
3 перемычками-«соплями» соединяем штырьки и ножки панельки (места пайки обведены зеленым).

Наша отладочная плата готова!

Заключение.

— Ставим метки на GND, SCK для правильного подключения питания и программатора;
— Все остальное на отладочную плату будет допаиваться в согласно выбранной схемы устройства. (как вариант можно допаять штырьки к каждой ножке микроконтроллера для подключения других плат и периферии);
— Для более надежной работы в условиях повышенных помех очень желательно дополнить схему, подтягивающим к питанию ножку сброса, резистором (внутренний подтягивающий резистор имеет сопротивление около 10 кОм – этого бывает мало) и фильтрующим керамическим конденсатором на ножках питания (в пределах 0.1 мкФ);
-Теперь вставляем в панельку микроконтроллер и при помощи прошиваем ATTiny2313 нужной прошивкой.

(Visited 16 038 times, 1 visits today)

Раздел: Метки: ,

Навигация по записям

Простая отладочная плата для устройств AVR ATTiny2313 с кварцем. : 70 комментариев


  1. GetChiper Автор записи

    Фьюзы трогали?
    На другой тини2313 проверяли?

  2. Toxa12345

    я долго мучался о том: «КАКОЙ жэ мк выбрать» остановился на тиньке 2313 по тому, что она дешевле атмег, и не настолько кострирована как тинька 13 так жэ изза наличия линий RxD и TxD что позволяет осуществить связь по ЮАРТ
    З.Ы. у нас в Курске купить МК не проблема. тинька 2313-стоит 130 руб. а атмега8 аж 200руб про тиньку 13 не узнавал


  3. GetChiper Автор записи

    А может ATmega88 или ATmega48?

  4. Andrey1979

    Доброго времени.
    Собрал я плату по предложенной схеме, подключил к USBasp, подключил 2313, подал 5 в. Extreme Burner выдает Incorrect Chip Found. Соответственно ничего не прошить не считать нельзя. При замене тиньки то же самое.
    Кто нибудь сталкивался с подобным?
    Возможно это связано с помехами?

    «– Для более надежной работы в условиях повышенных помех очень желательно дополнить схему, подтягивающим к питанию ножку сброса, резистором (внутренний подтягивающий резистор имеет сопротивление около 10 кОм – этого бывает мало) и фильтрующим керамическим конденсатором на ножках питания (в пределах 0.1 мкФ);»

    а еще, специально для чайников, можно ли отразить данные действия в виде схемы.


  5. GetChiper Автор записи

    Чего там отображать.
    Конденсатор ставится параллельно питанию (т.е. между ножками 10 и 20)
    Резистор 10 кОм ставится между Vcc и сбросом (т.е. между ножками 1 и 20)

  6. Andrey1979

    Спасибо за ответ. Поставил 4,7 КОм и 220пФ. Стало немного веселее. extreme burner пишет то же что и было. А вот khazama через раз сообщает The chip signature is 0x1e000. MISMATCH Expected signature for ATTiny 2313 is 1e 91 0a. В остальных случаях также пишет ошибку соединения.

    Использую беспаечную макетную плату, так что проблем с грязной пайкой быть не должно. Где еще можно поискать?


  7. GetChiper Автор записи

    220пФ маловато. Нужно 0.1 мкФ — керамический (не полярный) и 10-100 мкФ электролитический (полярный) поставить в параллель.

  8. Dederik

    добрый день))) я ненашел кварц 20,000 вместо него толька смог найти кварц 4,000. если я поставлю кварц 4,000 то у меня будет тормозит микро-р? и конденсаторы то же надо ли менять для кварца 4,000? я живу в самарканде с радио запчастями у нас проблема(((даже и незнаю где найти панельку под микрокон-р(((можна ли самому сделать панельку под микро-р?

  9. Dederik

    ответе хоть кто нибудь)))


  10. GetChiper Автор записи

    Спокойно — были выходные 🙂

    Кварц можно поставить любой если Вы планируете на этой платке учиться и делать свои устройства (конденсаторы под кварц менять не нужно). А можно вообще не ставить кварц — пользоваться встроенным RC-генератором.

    Насчет сделать панельку — может просто насмерть припаять МК в макетке?

  11. Dederik

    спасибо за помощь))) у меня еще один к вам вопрос, но не по теме не знаю где и задать(((сегодня ко мне принесли электронный счетчик на ремонт Holley DDS28. я там покопалься и нашел там микро-р Fudan FM24C02 которая отвечает за показания счетчика. в микро-ре храниться вся запись. не подскажете как сделать под него программатор чтоб можно было считывать и редактировать данные микро-ра??? и как к вам на прямую писать???


  12. GetChiper Автор записи

    FM24C02 — это последовательная энергонезависимая память (EEPROM)
    я думаю найдется много шнурков и программ для этого дела (если поисковик поспрашивать) — вот первое попавшееся http://www.msplata.ru/teleprog.html

  13. Dederik

    Спасибо за помощь:-)

  14. kosmogon

Универсальная отладочная плата FastAVR для начинающих в программировании МК ATMEL разработана на основе анализа около десятка подобных конструкций. Плата представляет собой разумный компромисс между избыточной функциональностью большинства из них или слишком примитивных возможностей других. Имея некоторый опыт в работе с разными микропроцессорными системами, ниже я буду комментировать свои мысли,- как был задуман тот или иной узел платы. Соглашаться с ними или нет - ваше дело, но может быть частично они будут полезны осваивающим AVR в дальнейшем...

В основу конструкции легли разработки и аппноуты Микроэлектроники (http://www.mikroe.com/ru/). Но платы EasyAVR (да и не только) содержат слишком много компонентов, которые привлекают пестротой и качеством изготовления новичков в микропроцессорной технике, на самом деле половина из них становится ненужной после удачной компиляции 5-6 примеров программ и получения опыта. Посудите сами- зачем вам на плате куча светодиодов и кнопок подключенных на каждый порт? Все это актуально пока вы не научитесь управлять пинами порта и помигать индикаторами, а это произойдет весьма быстро;-) На этот случай на плате имеются 4 светодиода и переключатель, для начала вполне достаточно...

Итак, возможности отладочной платы:

  • основной набор периферии для поддержки ATmega: RS-232 конвертер, бипер, SPI EEPROM, LCD и LED-индикаторы, встроенный тактовый генератор + кварц, клавиатура PS-2, ADC тестер, логические тестеры;
  • возможность повторения в домашних условиях, односторонняя печатная плата оптимизированная под лазерно-утюжную технологию, небольшие размеры;
  • применение всех компонентов только в DIP корпусах- позволяет легко заменять их в процессе экспериментов либо запрограммировать сам процессор для других схем (например для JTAG);
  • полная функциональная достаточность для создания несложных прототипов устройств и их отладка;
  • разъем стандартного SPI программатора STK-200 с селективной подачей питания на программатор, возможность внешнего подключения JTAG;
  • возможность включения платы в режиме JTAG ICE простой перекоммутацией;
  • возможность независимой коммутации набортной периферии в любых сочетаниях благодаря линейной технологии расположения всех портов МК;
  • возможность легкого подключения любой внешней периферии и использования на 100% ресурсов ATmega в DIP-40, все порты поразрядно доступны, более того - вся внутренняя периферия платы позволяет использовать ее для внешних устройств (например тактовый генератор или LED индикаторы;

Все это не требует доработок платы или пайки. Т.о. на начальном этапе освоения МК возможностей FastAVR вполне достаточно. Тот, кто задумает двигаться дальше, уже после создания собственного ПО сможет самостоятельно решить, что ему нужно конкретно и делать прототип конструкции с собственным набором периферии. Еще раз повторяюсь- плата создана для начала изучения МК AVR, более никаких целей не преследовалось. Появление самой документации связано с интересом, который проявляют многие начинающие осваивать данный тип контроллеров или еще думают с чего начать. А начинать нужно естественно с тест-платы;-)

МК AVR- самодостаточные контроллеры, однако процессор это еще не вся система. "Кубики" обслуживающие его или управляемые им, сами по себе можно рассматривать как отдельные блоки будущих конструкций. Объединив их на основной плате все вместе можно комбинируя получить нужные результаты. Сначала плата задумывалась на основе ATmega8, т.к. он дешев и имеет практически все возможности AVR. Однако, вняв советам, я решил не экономить и поставить максимально доступный в DIP-корпусе микроконтроллер- ATmega16 либо 32. Цоколевка обоих МК идентична. Себестоимость такого решения сторицей окупается количеством портов ввода-вывода, к которым можно подключиться хотя бы на время отладки. Совместимость снизу-вверх для всех поколений AVR позволяет производить написание и отладку программ используя более мощный чип, а затем произвести компиляцию для целевого кристалла. Достаточный ресурс флеша позволяет не "зацикливаться" на ограниченности в возможностях перепрограммирования Меги, тем более что можно достаточно поупражнявшись, отправить доживать МК в рабочую конструкцию, прошив его в последний раз (JTAG ICE тому первый претендент)

Для изготовления платы потребуется немного недефицитного компьютерного "хлама", которого хватает в кладовках любого электронщика. Большинство компонентов применено от старых либо отказавших материнских плат IBM PC либо околокомпьютерной техники, в последнее время железо такого рода все больше приходит в негодность и выбрасывается либо валяется без применения. Т.к. с SMD мелочевкой практически ничего сделать не получается (отсортировать проблема, да и время...), я распаиваю такие девайсы целиком либо строительным феном, либо на электроплитке.

Основное описание FastAVR ниже по блочно:

Питание. Встроенный стабилизатор на 78(М)05 позволяет запитывать плату от широко распространенных адаптеров 9-12В взятых от другой аппаратуры, которые обычно простаивают. В обычном включении этого достаточно (Мега-16/32 + LCD + RS232 + TXO), при использовании набортного 7-ми сегментного LED, либо сильно прожорливой внешней периферии (сложного программатора) стабилизатор уже очень горячий. Подключение внешнего стабилизированного напряжения +5В возможно через pin-3 X1 (применен разъем от кулеров матплат). Предварительно необходимо отключить джамперы JP1-JP2 группы VCC_SEL. Х1 такого типа выбран по нескольким причинам, основная- почти всегда приходится делать переходник для питания платы от разных адаптеров что есть в наличии либо лабораторного БП. Проходные ферритовые дроссели (балун) FB1,FB2 фильтруют импульсные помехи и ВЧ наводки. На диодах VD1,VD2 выполнена защита от "переплюсовки". В нескольких местах платы установлены джамперы VCC_EXT и GND_EXT. Через них достаточно просто при подключении периферии снимать питающее напряжение и общую "землю".

Внешняя память реализована на стандартной I2C EEPROM 24cXXX. Хотя сам AVR содержит собственную энергонезависимую память, однако во многих конструкциях внешний чип может быть предпочтительней из-за объема либо ресурса. Схема включения стандартная, адрес кристалла 0x01.

Линейные LED индикаторы состояния портов HL2-HL5 выполнены на 4-х дискретных светодиодах. Для начала экспериментов с AVR этого достаточно, большее их количество считаю не оправданным и скорее украшательством. Светодиоды включаются при записи в порт лог."1", т.о. состояние порта отображается без инверсии сигнала, что удобно и наглядно.

Подключение к плате индикатора LCD сделано через 2 разъема, возможно использовать как 8-ми битный так и 4-х битный режим. Первый из них - 34-х пиновый Х2 (от 3,5" дисковода) позволяет использовать стандартные перепрессованные шлейфы от дисководов нужной длинны, соответственно на самом индикаторе лучше распаять штыревую джамперную линейку (пин-блок), это позволяет быстро менять разные индикаторы без боязни перепутать выводы. Подключение к портам авра осуществляется через пин-блок Х10, т.о. помимо самого режима подключения LCD можно гибко выбрать выводы МК. Такая конструкция позволяет легко адаптироваться к свободным портам контроллера, даже "набрать" их по-одному из разных групп портов, что бывает необходимо при соответствии конкретному отлаживаемому прототипу или вновь конструируемая печатная плата получается от этого удобнее в разводке.


Во многих случаях применение ЖК-индикатора может быть не оправдано по цене, габаритам либо надежности. Например, в простейшем зарядном устройстве или таймере вполне может потрудиться и 2-х разрядный LED индикатор. Имеющиеся у меня в наличии сдвоенные 7-сегментные индикаторы распространенного типа с высотой знака 14мм оказались как с общим анодом, так и с общим катодом (списанные кассовые аппараты и системные блоки 486 компьютеров). Пришлось применить 2-х тактные ключи на VT1-VT4 для подключения индикаторов любого типа и соответственно панельку под сам индикатор, чтобы в дальнейшем не ломать голову со схемотехникой.

Все подключение периферии к портам ATmega, как отмечалось ранее, выполнены через линейные пин-блоки X3-X6. В основном на отлаживаемых платах я наблюдал применение разъемов типа IDC-10 (2х5). Единственное их преимущество в этом случае- наличие "ключа", дабы не попутать местами шлейф при подключении. На этом достоинства такого способа кончаются и начинаются недостатки- даже визуально неудобно работать с 8-ми разрядными портами, т.к. выводы не расположены в ряд, невозможно кроме шлейфа ничем подключить встроенную периферию. Применение пин-блоков дает прямо противоположный результат, кроме того- через стандартную перемычку-джампер легко контролировать любые сигналы сверху, например логическим пробником или осциллографом, не нужно тыкаться и считать по ножкам порта боясь случайно "коротнуть" выводы. Прибавьте сюда максимальную дешевизну и многоразовость данного соединения, ведь гораздо проще заменить шлейф или джампер, чем разъем впаянный с плату. Тем более, что сейчас в продаже даже в нашей глубинке можно найти вот такие ответные части разъемов (либо использовать от старых системных блоков), что позволяет легко и быстро комбинировать соединители (рис):


Для звука применен распространенный бипер сопротивлением около 80 Ом от матплат. Сигнал не очень громкий, но достаточный для контроля (R23 и так выбран на пределе). Отдельный ключ я не стал ставить, желающие могут распаять его на местах для макетирования, обозначенных как TEMP. Небольшой совет - работая со звуком, не забывайте в конце процедуры генерации сигнала ставить команду, сбрасывающую в лог."0" вывод PD7, иначе после прекращения генерации там может остаться "1" и ток через динамик будет продолжать идти, что не есть good хотя бы по соображениям общего потребления AVR-а.

На 4-х разрядном DIP-переключателе SW4 собран задатчик логических сигналов для портов. Здесь ситуация с количеством аналогична LED светодиодам. Т.к. входы авров имеют внутренние подключаемые pool-up сопротивления, то соответственно "подтяжки" к питанию ставить нет нужды. На резисторах R18-R21 собрана защита от ошибок случайного включения портов МК на вывод. В ревизии платы 1.03 и выше дип-переключатель при отсутствии может быть заменен джамперами. Недавно мне понадобилось быстро сделать из платы JTAG ICE. В связи с чем в rev 1.4 введена резисторная матрица RN1, которая позволяет аппаратно формировать лигическую "1" на нескольких входах контроллера. Если вам это не нужно - можно не устанавливать RN1.

Тактирование МК выбирается пин-группой CL_SEL и может осуществляться от внешнего кварцевого резонатора Z1 (устанавливаются только JP37, JP38), интегрального кварцевого генератора G1 (16МГц), либо с делителя на:2 и:4. Т.о. помимо кварца можно тактировать процессор частотами 16, 8, 4 МГц. Можно легко прикинуть быстродействие отлаживаемой программы, либо получить стандартную тактовую частоту при запаянном спец. кварце. В-принципе при отсутствии TXO на данную частоту можно применить любой другой генератор до 16МГц. Генератор также может пригодиться вам при "поднятии" МК из-за неправильно прошитых фьюзов микроконтроллера, в этом случае частота тактирования не играет роли.

Преобразователь уровней последовательного интерфейса RS-232 для UART - неизменный атрибут большинства систем на AVR. Здесь не нужно "изобретать велосипед", достаточно стандартной MAX232. Задействованы только сигналы RX-TX, что вполне достаточно для большинства применений. Практически можно подключить CTS-RTS для аппаратного управления потоком без переделки платы, гибкими проводами на JP31-JP32 со стороны дорожек. В схеме проверены м/сх Maxim MAX232, TI MAX232 и SIPEX SP3232- ставьте любые совместимые по цоколевке аналоги.

Внешняя матричная клавиатура может быть выполнена на отдельной плате и подключаться шлейфами к МК (я решил применить из манипуляторов "мышь", как правило 2 микрика там всегда исправны). На самой отладочной плате установлен двойной блок разъемов PS-2. Стандартная клавиатура IBM PC подключается без аппаратных доработок, естественно при соответствующей программной поддержке со стороны AVR. Второй разъем свободен, используйте на свое усмотрение. Как правило клавиатура - весьма специфичная вещь, зависящая от отлаживаемого прототипа, поэтому после некоторых раздумий я решил не ставить даже простейшие кнопки на плате. Свои варианты плат выложу после разводки и их испытаний.

Индикатор HL7 установлен для экспериментов со встроенным аппаратным ШИМ-контроллером.

Разъем для внутрисхемного последовательного программирования X7 сделан в соответствии STK-200. Питание на программатор можно селективно выбирать через JP43. В моем случае используется простейший программатор от PonyProg на буфере 74ALS(LS,F)244 с подключением через LPT. Все проверялось на Core2Duo + i965чипсете под управлением XP SP2, никаких проблем не возникло. Программатор запитывается через разъем с отладочной платы и удобен в работе, т.к. буферы в нормальном режиме "уходят" в Z-состояние и абсолютно не мешают в работе FastAVR. Подключение адаптера JTAG для внутрисхемного программирования и отладки в реал-тайм также возможно без доработки платы через соответствующий линейный пин-блок порта C.

Осталось упомянуть еще несколько нужных элементов:

Цепь внешнего Reset, которая у AVR достаточно простая. Ее можно отключать через JP42, хотя эксплуатация совместно с программатором нисколько не мешает. Вход сброса может быть перепрограммирован через фьюз как стандартный порт ввода-вывода и использован для периферии, однако нужно помнить что в этом случае уже невозможно повторно запрограммировать кристалл через X7 .

Переменный резистор R27, включенный потенциометром - задатчик напряжения для опытов со встроенным АЦП, выход с него может быть подан на любой из аналоговых входов МК. Небольшое замечание - обратите внимание, если вы не устанавливаете этот резистор по каким либо причинам- обязательно поставьте перемычку (на рис. пунктиром) для нормального прохождения общей шины GND!

Немного о самой печатной плате и конструкции. Как уже отмечалось, плата односторонняя. Мной пока проверены 2 экземпляра, изготовленные по лазерно-утюжной технологии (одна при печати на фотобумаге от струйников, другая на основе от самоклейки), т.о. при желании все должно получаться;-) Если задумаете фотоспособом- прекрасно! Джамперные линейки разведены с учетом "запретных зон" и применения стандартных 16-ти пиновых шлейфов (планки от GAME-PORT) даже при подключении одним крайним рядом. При отсутствии ферритовых дросселей (я применяю от старых 286 матплат или горелых мониторов) можно смело ставить перемычки. Рекомендую сразу под все чипы поставить панели дабы потом не курочить плату. Не забудьте 2 перемычки с ключей на индикатор HL6.

А вот так выглядит интерфейс для проверялки ТТЛ/КМОП логики, по мере возможностей я постараюсь рассказать, что из этого получилось.

Достаточно часто появляется необходимость использовать управление какого-либо устройства (будь то лампочка накаливания, двигатель, ТЭН или простой светодиод) посредством ШИМ.

Наверно объяснять что это такое и в чем прелесть управления ШИМом не нужно, информации в интернете накопилось уже достаточно много, да и врядли мне получиться разжевать эту тему лучше. Поэтому сразу перейдем к делу, а именно запустим ШИМ на Attiny2313 средствами Bascom-AVR.

Шим в микроконтроллерах AVR работает на таймерах-счетчиках, в мк Tiny2313 таких таймеров всего 2: 8-и битный Timer0 считающий до 255 и 16-и битный Timer1 способный считать до 65535. Каждый таймер управляет двумя ШИМ-каналами, таким образом всего аппаратно можно реализовать целых 4 канала ШИМ.

Информацию о количестве каналов ШИМ и разрядность каждого канала можно глянуть на страницах даташита на микроконтроллер.

Так, на борту Attiny2313 имеются два 8-и битных канала ШИМ работающих от Timer0 и еще два канала под управлением таймера Timer1 имеют программируемую разрядность от 8 до 10 бит. В даташите эти ноги подписываются следующим образом:

Для того чтобы сконфигурировать таймер Timer1 на генерацию ШИМ в Bascom достаточно записать следующую строку:

Config Timer1 = Pwm, Pwm = 8 , Compare A Pwm = Clear Up, Compare B Pwm = Clear Down, Prescale = 64

Pwm = 8 выбирается разрядность ШИМ, для Timer1 как писалось выше может быть также Pwm = 9 или Pwm = 10.

Compare A/B Pwm = Clear Up/Clear Down здесь конфигурируем активное состояние для каждого канала ШИМ (А и В).

Prescale = 64 - уже знакомая строка конфигурации таймера, отвечающая за предварительное деление частоты переполнения таймера, в данном случае делитель будет задавать частоту ШИМ. Можем менять на свое усмотрение Prescale= 1|8|64|256|1024


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



Для нас регистры сравнения OCR1A и OCR1B всего-навсего переменные, в которые мы можем положить какое-нибудь значение. Например, так:


OCR1A = 100
OCR1B = 150


В баскоме для удобства предусмотрено и другое название этих регистров: PWM1A и PWM1B, так предыдущие строки будут равнозначны следующим:


PWM1A = 100
PWM1B = 150

Теперь разберемся, как влияет конфигурация активного состояния Clear Up/Clear Down на то, что происходит на выходе ШИМ в зависимости от значения регистра сравнения.

Когда выход сконфигурирован как Compare A Pwm = Clear Down активным состоянием выхода является высокий уровень и при увеличении значения регистра OCR (PWM) пропорциональное напряжение на этой ноге будет расти. С точностью до наоборот все будет происходить, если выход сконфигурирован как Compare A Pwm = Clear Up. Все это хорошо проиллюстрировано на картинке ниже



Значения, которые могут принимать эти регистры сравнения зависят от того, какую разрядность канала ШИМ мы выбрали. При PWM = 8 (8-и битный шим) возможно значение от 0 до 255; при PWM = 9 от 0 до 511; при PWM = 10 от 0 до 1023. Тут я думаю, все понятно.


Теперь небольшой пример: подключим к микроконтроллеру светодиоды как показано на схеме (питание мк на схеме не указано)


И напишем небольшую программку:


$crystal = 4000000

Config Timer1 = Pwm, Pwm = 9 , Compare A Pwm = Clear Down, Compare B Pwm = Clear Up, Prescale = 8
Config PORTB.3 = Output
Config PORTB.4 = Output

Incr Pwm1a "плавно увеличиваем значение регистра сравнения OCR1A
Incr Pwm1b "плавно увеличиваем значение регистра сравнения OCR1B

Waitms 20 "добавим задержку

Loop

End

После того как откомпилировали и прошили программу в контроллер один из светодиодов (D1) будет плавно набирать яркость, а другой (D2) плавно гаснуть


Если сейчас ткнуть осциллографом на выходы ШИМ, то можем увидеть такую вот картину с изменяющейся скважностью импульсов (синий сигнал на ОС1А, красный на ОС1В):


Конфигурация таймера Timer0 для генерации ШИМ практически такая же, за исключением того, что timer0 это 8-и битный таймер, и поэтому ШИМ генерируемый этим таймером будет всегда иметь разрядность 8. Поэтому конфигурируя этот таймер, разрядность ШИМ не указывается:

Config Timer0 = Pwm, Compare A Pwm = Clear Up, Compare B Pwm = Clear Down, Prescale = 64



Теперь аналогичный пример со светодиодами, но теперь шим сгенерируем при помощи Timer0:


$regfile = "attiny2313.dat"
$crystal = 4000000

Config Timer0 = Pwm, Compare A Pwm = Clear Down, Compare B Pwm = Clear Up, Prescale = 8
Config PORTB.2 = Output
Config PORTD.5 = Output

Incr Pwm0a " плавно увеличиваем значение регистра OCR0A
Incr Pwm0b " плавно увеличиваем значение регистра OCR0B

Waitms 20 "добавим задержку

Loop

End

Подключим светодиоды к выходу ШИМ Timer0, как показано на схеме:

Тут все аналогично: первый светодиод (D1) будет плавно набирать яркость, а второй (D2) будет плавно гаснуть.


Подсчет частоты генерации ШИМ

Если требуется узнать частоту генерации ШИМ, то сделать это не сложно. Смотри на формулу ниже:

Частота ШИМ = (частота кварца/предделитель) / (размер счетного регистра *2)

Для примера подсчитаем несколько значений:

1. Частота кварца = 4000000 Гц, предделитель = 64, разрядность ШИМ 10 бит => размер счетного регистра = 1024

Частота ШИМ = (4000000/64)/(1024*2) = 122 Гц

2. Частота кварца = 8000000 Гц, предделитель = 8, разрядность ШИМ 9 бит => размер счетного регистра = 512

Частота ШИМ = (8000000/8)/(512*2) = 976,56 Гц

3. Частота кварца 16000000 Гц, предделитель = 1, разрядность ШИМ 8 бит => размер счетного регистра = 256

Частота ШИМ = (16000000/1)/(256*2) = 31250 Гц

ШИМ (PWM) — широтно-импульсная модуляция. Не нужно пугаться данного термина. Это всего навсего способ регулирования напряжения. Допустим подсветка монитора горит слишком ярко, вы меняете яркость. А что же происходит в этот момент на самом деле?

Представим себе, что подсветка монитора это несколько светодиодов. Питается все это дело от постоянного напряжения. Но вот нам понадобилось уменьшить яркость монитора. Логично ответить, что это можно сделать переменным резистором. На маленьких токах — возможно. Но на больших, резистор будет сильно греться. Сильно возрастут габариты, потери, энергопотребление.

Поэтому люди придумали схему на транзисторах, которая делает из постоянного напряжения пульсирующее. Оказывается, пульсирующее напряжение, в зависимости от заполнения периода будет эквивалентно постоянному напряжению. Т.е. если в течение периода напряжение 50% времени было включено, 50% выключено, то эквивалент постоянного напряжения будет равен 50% от номинального.

В цифрах это просто — было 5В постоянного напряжения прогнали через ШИМ — получили 2,5В. Если заполнение импульса равно 75%, то эквивалентное постоянное напряжение будет 3,75В. Думаю идея понятна.

Теперь приступим к практической реализации. Будем при помощи микроконтроллера изменять заполнение от 0 до 100%, потом от 100% до нуля. Конечный результат должен выглядеть так:

Чтобы было более наглядно, подключим светодиод. В результате у нас будет плавно включаться и отключаться светодиод.

Запускаем наш любимый CodeVision. Создаем проект при помощи мастера. В разделе таймеров (Timers), выбираем Timer 2 и выставляем настройки как на рисунке.

Если попробовать сгенерировать проект, то прога может ругнуться. Соглашаемся, ведь у нас нога 3 порта В должна быть настроена как выход.

Приводим код к следующему виду:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include void main(void ) { PORTB= 0x00 ; DDRB= 0x08 ; // Timer/Counter 2 initialization ASSR= 0x00 ; TCCR2= 0x6C ; TCNT2= 0x00 ; OCR2= 0x00 ; TIMSK= 0x00 ; while (1 ) { } ; }

#include void main(void) { PORTB=0x00; DDRB=0x08; // Timer/Counter 2 initialization ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x00; TIMSK=0x00; while (1) { }; }

Уделим внимание строке OCR2=0x00; Эта переменная как раз и отвечает за величину заполнения импульса. Изменяется данная величина от 0 до 255(0хFF), т.е. 255 соответствует 100% -му заполнению (постоянный ток). Следовательно, если нужно 30% заполнение (255/100)*30=77. Далее 77 переводим в шестнадцатеричную систему OCR2=0x4D;

TCCR2=0x6C; Изменяя данную величину мы можем регулировать частоту ШИМ. Величина частоты работы ШИМ кратна частоте, на которой работает микроконтроллер. В проекте использована частота микроконтроллера 8 МГц, частоту ШИМ использовали 125кГц, следовательно делитель равен 8/125=64
0x6C в двоичной системе счисления 1101100, открываем даташит на Atmega8 и видим описание регистра TCCR2, так вот 1101100 последние цифры 100 и отвечают за выбор частоты работы ШИМ

Приступим непосредственно к программе:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include #include void main(void ) { PORTB= 0x00 ; DDRB= 0x08 ; ASSR= 0x00 ; TCCR2= 0x6C ; TCNT2= 0x00 ; OCR2= 0x00 ; TIMSK= 0x00 ; while (1 ) { while (OCR2< 0xff ) { OCR2= OCR2+ 0x01 ; delay_ms(5 ) ; } while (OCR2> 0x00 ) { OCR2= OCR2- 0x01 ; delay_ms(5 ) ; } } ; }

#include #include void main(void) { PORTB=0x00; DDRB=0x08; ASSR=0x00; TCCR2=0x6C; TCNT2=0x00; OCR2=0x00; TIMSK=0x00; while (1) { while(OCR2<0xff) { OCR2=OCR2+0x01; delay_ms(5); } while(OCR2>0x00) { OCR2=OCR2-0x01; delay_ms(5); } }; }

Код прост до безобразия: сначала в цикле увеличиваем заполнение от 0 до 255(ff), потом уменьшаем от 255 до 0.
И напоследок видосик, как это все должно работать. Успехов в изучении)