Шим контроллер на мк attiny2313

Регулятор скорости вентилятора отопителя салона на ATtiny2313 — Сообщество «Электронные Поделки» на DRIVE2

Обновление от 17.01.2015 г.:Есть несколько повторивших схему, по их просьбам были немного модернизированы прошивки. Из “полезностей” добавлен плавный старт вентилятора при включении и добавлены прошивки для индикатора с общим анодом.

Итак, очень краткое описание:

Индикатор с общим анодом, 5 положений (старая схема)t2313_Emelya_5_CA_old.eept2313_Emelya_5_CA_old.hex

t2313_Emelya_5_CA_old.rom

Индикатор с общим катодом, 5 положений (старая схема)t2313_Emelya_5_CC_old.eept2313_Emelya_5_CC_old.hex

t2313_Emelya_5_CC_old.rom

Индикатор с общим анодом, 10 положений (старая схема)t2313_Emelya_10_CA_old.eept2313_Emelya_10_CA_old.hex

t2313_Emelya_10_CA_old.rom

Индикатор с общим катодом, 10 положений (старая схема)t2313_Emelya_10_CC_old.eept2313_Emelya_10_CC_old.hex

t2313_Emelya_10_CC_old.rom

Для схем на 10 положений индикация от нуля до девяти.

// ———————————————————————–

В результате очередного приступа непреодолимого желания изготовить что-то полезное для любимого боевого коня был собран ШИМ регулятор для электродвигателя отопителя салона. Появился методом проб и ошибок, немного подробнее и с картинками ТУТ и ТУТ.

Но здесь, в отличие от БЖ, немного больше скучных подробностей.

Финальная схема выглядит так:

Схема 1

Схема 2

После первых испытаний в авто решил разнести силовую и управляющую части на разные платы. ШИМ применил аппаратный, кнопки также подключены к выводам, на которые настроены аппаратные прерывания.

Опыта работы с микроконтроллерами пока маловато, а такой подход позволил большую часть работы по написанию прошивки переложить на хрупкие плечи мастера проектов из CodeVision AVR. Также захотелось реализовать индикацию режима работы, поэтому на свободный порт В был подключен семисегментный светодиодный индикатор.

Небольшой неожиданностью стало отсутствие на радиорынке каких-либо декоративных панелек для монтажа индикатора. Пришлось использовать корпус от кнопки. В результате было собрано следующего вида “нечто”:

Нечто )))

Решил не утруждать себя изготовлением корпуса и упаковал платы в прозрачную термоусадку:

Комплект для установки

Видео работы схемы снимал на “стенде”, ибо в авто ничего и не видно:

Монтаж не занял много времени, потому как органы управления и индикации (если так пафосно можно обозвать кнопку на 2 положения и одноразрядный светодиодный индикатор) при помощи ножа, напильника, эпоксидки, суперклея и “такой-то матери” удалось разместить в штатной заглушке. Также пришлось произвести небольшое хирургическое вмешательство в электропроводку авто. Печальная история (с картинками) о разрезанном проводе ТУТ.

В работе (фото 1)

В работе (фото 2)

В ходе экспериментов менял и частоту ШИМ. Самым “тихим” оказалось значение частоты ШИМ 1,93 кГц. В результате запрограммировал 5 режимов работы вентилятора. 3-й режим приблизительно соответствует штатному через резистор. На первых двух — вентилятора вообще практически не слышно. Схема установлена в авто и проходит тестовую эксплуатацию.

Актуальная на 12.11.2013 г. прошивка ТУТ

Продолжение…

Источник: https://www.drive2.ru/c/767012/

AVR. Учебный курс. Использование ШИМ

Вот уже несколько раз я ругался странным словом ШИМ. Пора бы внести ясность и разьяснить что же это такое. Вообще, я уже расписывал этот режим работы, но все же повторюсь в рамках своего курса.
 

Вкратце, Широтно Импульсная Модуляция (в буржуйской нотации этот режим зовется PWMPulse Width Modulation) это способ задания аналогового сигнала цифровым методом, то есть из цифрового выхода, дающего только нули и единицы получить какие то плавно меняющиеся величины. Звучит как бред, но тем не менее работает. А суть в чем:
 

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

А вот если двигатель включать на десять секунд каждую минуту, то маховик раскрутится, но далеко не на полную скорость — большая инерция сгладит рывки от включающегося двигателя, а сопротивление от трения не даст ему крутится бесконечно долго.
 

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

При ШИМ мы гоним на выход сигнал состоящий из высоких и низких уровней (применимо к нашей аналогии — включаем и выключаем двигатель), то есть нулей и единицы.

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

Меня скважность (отношение длительности периода к длительности импульса) можно плавно менять эту площадь, а значит и напряжение на выходе.

Таким образом если на выходе сплошные 1, то на выходе будет напряжение высокого уровня, в случае моего робота, на выходе из моста L293 это 12 вольт, если нули, то ноль. А если 50% времени будет высокий уровень, а 50% низкий то 6 вольт.

Интегрирующей цепочкой тут будет служить масса якоря двигателя, обладающего довольно большой инерцией.  

А что будет если взять и гнать ШИМ сигнал не от нуля до максимума, а от минуса до плюса. Скажем от +12 до -12. А можно задавать переменный сигнал! Когда на входе ноль, то на выходе -12В, когда один, то +12В. Если скважность 50% то на выходе 0В. Если скважность менять по синусоидальному закону от максимума к минимуму, то получим… правильно! Переменное напряжение.

А если взять три таких ШИМ генератора и гнать через них синусоиды сдвинутые на 120 градусов между собой, то получим самое обычное трехфазное напряжение, а значит привет бесколлекторные асинхронные и синхронные двигатели — фетиш всех авиамоделистов. На этом принципе построены все современные промышленные привода переменного тока.

Всякие Unidrive и Omron Jxx  

В качестве сглаживающей интегрирующей цепи в ШИМ может быть применена обычная RC цепочка:

Так, принцип понятен, приступаем к реализации. ШИМ сигнал можно сварганить и на операционных усилителях и на микроконтроллере. Причем последние умеют это делать просто мастерски, благо все у них для этого уже есть.  

В случае ATMega16 проще всего сделать на его ШИМ генераторе, который встроен в таймеры. Причем в первом таймере у нас целых два канала. Так что без особого напряга ATmega16 может реализовать одновременно четыре канала ШИМ.  

Как это реализовано

У таймера есть особый регистр сравнения OCR**. Когда значение в счётном регистре таймера достигнает значения находящегося в регистре сравнения, то могут возникнуть следующие аппаратные события:

  • Прерывание по совпадению
  • Изменение состояния внешнего выхода сравнения OC**.

  Выходы сравнения выведены наружу, на выводы микроконтроллера

 
На демоплате Pinboard к этим выводам как раз подключены светодиоды. А если поставить джамперы вдоль, в сторону надписи RC то к выводу ШИМ будет подключена интегрирующая цепочка.  

Для Pinboard II разница в подключении невелика. Джамперы тут сгруппированы в один блок. А светодиоды и RC цепочки сгруппированы в левом верхнем углу платы.

Предположим, что мы настроили наш ШИМ генератор так, чтобы когда значение в счетном регистре больше чем в регистре сравнения, то на выходе у нас 1, а когда меньше, то 0.   Что при этом произойдет? Таймер будет считать как ему и положено, от нуля до 256, с частотой которую мы настроим битами предделителя таймера. После переполнения сбрасывается в 0 и продолжает заново.

  Как видишь, на выходе появляются импульсы. А если мы попробуем увеличить значение в регистре сравнения, то ширина импульсов станет уже.

Так что меняя значение в регистре сравнения можно менять скважность ШИМ сигнала. А если пропустить этот ШИМ сигнал через сглаживающую RC цепочку (интегратор) то получим аналоговый сигнал.  

У таймера может быть сколько угодно регистров сравнения. Зависит от модели МК и типа таймера. Например, у Атмега16

  • Timer0 — один регистр сравнения
  • Timer1 — два регистра сравнения (16ти разрядных!)
  • Timer2 — один регистр сравнения

  Итого — четыре канала. В новых AVR бывает и по три регистра сравнения на таймер, что позволяет одним МК организовать просто прорву независимых ШИМ каналов.   Самих режимов ШИМ существует несколько:  

Fast PWM

В этом режиме счетчик считает от нуля до 255, после достижения переполнения сбрасывается в нуль и счет начинается снова. Когда значение в счетчике достигает значения регистра сравнения, то соответствующий ему вывод ОСхх сбрасыватся в ноль. При обнулении счетчика этот вывод устанавливается в 1. И все!  

Частота получившегося ШИМ сигнала определяется просто: Частота процесора 8Мгц, таймер тикает до 256 с тактовой частотой. Значит один период ШИМ будет равен 8000 000/256 = 31250Гц. Вполне недурно. Быстрей не получится — это максимальная скорость на внутреннем 8Мгц тактовом генераторе. Но если переключить FUSE биты на внешний кварц то можно раскачать МК на 16Мгц.

  Еще есть возможность повысить разрешение, сделав счет 8, 9, 10 разрядным (если разрядность таймера позволяет), но надо учитывать, что повышение разрядности, вместе с повышением дискретности выходного аналогового сигнала, резко снижает частоту ШИМ.

Phase Correct PWM ШИМ с точной фазой. Работает похоже, но тут счетчик считает несколько по другому. Сначала от 0 до 255, потом от 255 до 0. Вывод OCxx при первом совпадении сбрасывается, при втором устанавливается.

Но частота ШИМ при этом падает вдвое, изза большего периода. Основное его предназначение, делать многофазные ШИМ сигналы, например, трехфазную синусоиду. Чтобы при изменении скважности не сбивался угол фазового сдвига между двумя ШИМ сигналами. Т.е. центры импульсов в разных каналах и на разной скважности будут совпадать.

 
Еще одна тонкость:
Чтобы не было кривых импульсов, то в регистр сравнения любое значение попадает через буфферный регистр и заносится только тогда, когда значение в счетчике достигнет максимума. Т.е. к началу нового периода ШИМ импульса.  

Clear Timer On Compare

Сброс при сравнении. Это уже скорей ЧИМ — частотно-импульсно моделированный сигнал. Тут работает несколько иначе, чем при других режимах. Тут счетный таймер тикает не от 0 до предела, а от 0 до регистра сравнения! А после чего сбрасывается.

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

Как это реализовать проще? Через Режим СТС! Пусть у нас частота 8Мгц.   Прескалер будет равен 64, таким образом, частота тиков таймера составит 125000 Гц. А нам надо прерывание с частотой 1000Гц. Поэтому настраиваем прерывание по совпадению с числом 125.   Дотикал до 125 — дал прерывание, обнулился.

Дотикал до 125 — дал прерывание, обнулился. И так бесконечно, пока не выключим.   Вот вам и точная тикалка.  

Нет, конечно, можно и вручную. Через переполнение, т.е. дотикал до переполнения, загрузил в обработчике прерывания заново нужные значение TCNTх=255-125, сделал нужные полезные дела и снова тикать до переполнения. Но ведь через СТС красивей! 🙂

 
Аппаратура А теперь контрольные регистры, которыми все это безобразие задается и программируется. Опишу на примере Двухканального FastPWM на таймере 1. В других все похоже. Даташит в зубы и вперед.  

Итак, тут правят бал регистры TCCR1A и TCCR1B. Гы, кто бы сомневался %)

  Распишу их по битам.

Регистр TCCR1A, биты COM1A1:COM1A0 и COM1B1:COM1B0. Эта братия определяет поведение вывода сравнения OC1A и OC1B соответственно.

 

COMxx1 COMxx0 Режим работы выхода
вывод отцеплен от регистра сравнения и не меняется никак.
1 Поведение вывода зависит от режима заданного в WGM, различается для разных режимов (FastPWM, FC PWM, Compar out) и разных МК, надо сверяться с даташитом.
1 прямой ШИМ (сброс при совпадении и установка при обнулении счета)
1 1 обратный ШИМ (сброс при обнулении и установка при совпадении)

 

Регистр TCCR1A, биты WGM11 и WGM10 вместе с битами WGM12 и WGM13, находящимися в регистре TCCR1B задают режим работы генератора.

WGM13 WGM12 WGM11 WGM10 Режим работы
1 1 Fast PWM 8 бит
1 1 Fast PWM 9 бит
1 1 1 Fast PWM 10 бит

 

Другие комбинации битов WGM задают режимы Phase Correct PWM и CTC (сброс OCxx при совпадении). Если интересно, то читай даташит, я для себя много интересного там не нашел, кроме Phase Correct PWM. И то мне сейчас важней скорость, а не точность фазы 🙂

 

После остается только запустить таймер, установив бит CS10 (подсчет тактовых импульсов с делителем 1:1)

 

Пример кода:

  Попробуем поиграться яркостью светодиодов с помощью ШИМ сигналов. Подключи джамперы, чтобы запитать светодиоды LED1 и LED2    Для версии Pinboard II все аналогично, с поправкой на другое расположение джамперов:  

  Теперь все готово, можно писать код. Вначале в раздел инициализации устройств добавляю настройку таймера на запуск ШИМ и подготовку выводов.

1
2
3
4
5
6
7
8
9
10
11
12
;FastPWM Init SETB DDRD,4,R16 ; DDRD.4 = 1 Порты на выход SETB DDRD,5,R16 ; DDRD.5 = 1  
; Выставляем для обоих каналов ШИМ режим вывода ОС** сброс при совпадении. ; COM1A = 10 и COM1B = 10 ; Также ставим режим FAST PWM 8bit (таймер 16ти разрядный и допускает ; большую разрядность ШИМ сигнала. Вплоть до 10 бит. WGM = 0101 ; Осталось только запустить таймер на частоте МК CS = 001   OUTI TCCR1A,2

Источник: http://easyelectronics.ru/avr-uchebnyj-kurs-ispolzovanie-shim.html

4-канальный ШИМ-контроллер на микроконтроллере AVR. Часть 1

» Схемы » Применение микроконтроллеров

01-02-2010

John Giffard, Mark Lewin

Широтно-импульсная модуляция очень часто используется для регулировки/управления источниками света, двигателями. Целью данного проекта было создание дешевого устройства – ШИМ-контроллера, которое будет полезно во многих областях.

Изначально основой конструкции был выбран микроконтроллер компании Atmel ATMega32, т.к.

имеющаяся периферия легко позволяла организовать не только многоканальный ШИМ с управлением по последовательному интерфейсу, но и добавить аналоговый интерфейс управления, клавиатуру и LCD-индикатор для организации пользовательского интерфейса, а также получить дополнительные выходные линии общего назначения. Однако, не проигрывая в функциональности, может использоваться и микроконтроллер ATMega16 (это учтено при разработке программного обеспечения). Рабочая частота выбрана из расчета возможности использования микроконтроллеров ATMega32L и ATMega16L.

Данная версия 4-канального 8-битного ШИМ-контроллера сконструирована с использованием микроконтроллера ATmegа16.

Устройство сдержит интерфейс RS232 для управления с компьютера, интерфейс для 12-кнопочной клавиатуры и 4 аналоговых 10-битных канала для подключения потенциометров. Для отображения текущих режимов работы и параметров имеется 4-х строчный LCD-дисплей.

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

Устройство имеет очень гибкие настройки.

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

Основные характеристики устройства:

  • 4-канала ШИМ, разрешение 8 бит, частота ШИМ – 31 кГц;
  • интерфейс RS232 для управления и контроля с PC;
  • простое схемотехническое решение с минимальным количеством внешних элементов;
  • 12-кнопочная клавиатура;
  • возможность аналоговой регулировки;
  • до 7 выходных линий общего назначения;
  • 4-строчный LCD-дисплей;
  • управление LCD-дисплеем через последовательный интерфейс;
  • пользовательское меню;
  • гибкие настройки;
  • программная реализация буферов FIFO для ускорения работы.

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

Благодаря таким гибким настройкам, выбирая соответствующую настройку, ШИМ-контроллер может использоваться в различных приложениях и как самостоятельное устройство.

В конструкции используется микроконтроллер ATmega16, минимальное количество внешних элементов, поскольку весь контроль и управление выполняет сам микроконтроллер.

Для пользователя возможно использование только необходимых компонентов, например, LCD-индикатор, если в нем нет необходимости, может быть исключен.

Логическая схема устройства.

Принципиальная схема устройства

Кликните для увеличения

Схемотехническое решение очень простое. Для тактирования микроконтроллера выбран кварцевый резонатор 8 МГц, источник питания +5.0 В собран на интегральном стабилизаторе LM7805, индуктивность 10 мкГн и конденсатор 100 нФ – образуют фильтр, предотвращающий проникновение помех при переключениях в аналоговых цепях.

Преобразователь логических уровней MAX232 используется для реализации последовательного интерфейса. LCD-индикатор на чипсете Hitachi (HD44780) с разрешением 20×4 либо 40×2. Узел управления подсветкой индикатора реализован на транзисторе MJE3055T (возможно использование более дешевого аналога).

Матрица клавиатуры, стандартная, 4×3.

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

ШИМ генерация присутствует всегда на всех четырех каналах после подачи питания.

Пользователь может настроить все параметры ШИМ-контроллера, используя последовательный интерфейс, посылая управляющие команды, а затем сохранить все сделанные настройки в EEPROM памяти микроконтроллера.

Полный список команд и значений приведен ниже в приложении. Последовательный интерфейс также может использоваться для пересылки текущих значений аналоговых каналов управления (по запросу).

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

Для примера практической реализации устройства и ШИМ управления различными внешними устройствами приведена следующая схема.

В данном примере показаны схемотехнические решения для подключения к 4 каналам ШИМ двигателя вентилятора, мощного светодиода семейства Luxeon Star, преобразователь ШИМ-напряжение на операционном усилителе LM358.

А также для возможности тестирования выходных линий общего назначения подключены светодиоды.

Пример реализации выходных каскадов ШИМ-контроллера

Кликните для увеличения

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

 circuitcellar.com

Источник: https://www.rlocman.ru/shem/schematics.html?di=62862

Регулируем скорость вращения двигателя с помощью ШИМ(PWM) на ATtiny2313

Реализация регулировки скорости вращения двигателя довольно не сложная. Для этого необходимо знать что такое Широтно Импульсная Модуляция (ШИМ по английски PWM), иметь понятие о возможных вариантах её реализации.

В данном примере я расскажу как использовать программную ШИМ, то есть специальные таймеры-счетчики при программной ШИМ не будут задействованы. ШИМ с применением аппаратного ресурса таймеров-счетчиков называется аппаратной ШИМ про нее хорошо рассказал мой коллега.

И так, алгоритм следующий, необходимо организовать уменьшение и увеличение заполненности импульсов, при нажатии на кнопки “+” и соответственно “-“.

Подпрограммы уменьшения и увеличения скорости вращения будет включаться двумя кнопками, которые в свою очередь будут присоединены к прерываниям int0 и int1. Такое решение в связи с тем что управляющих кнопок больше не будет, а значит прерывания просто грех не использовать.

Соответственно скорость будет увеличиваться или уменьшаться в зависимости от заполненности импульсов коммутирующих силовую схему управления двигателем.

Схема устройства представляет из себя следующее:

Используется только один полевой транзистор из сборки.

В основном цикле программы будет сама непосредственно программа реализации программной ШИМ.

  1. //Подключаем стандартные библиотеки необходимые для работы

  2. #include //библиотека ввода/вывода

  3. #include //библиотека прерываний

  4. #define nop() {asm(“nop”);}//функция позаимствованная из ассемблера “nop”

  5. //перечисление переменных

  6. unsigned int i=1;//переменная для ШИМ

  7. unsigned int p;//переменная для ШИМ

  8. unsigned int pp=50;//переменная для ШИМ скорость нарастания напряжения

  9. unsigned int ms;//переменная для задержки

  10. unsigned int x;//переменная для задержки

  11. //Попрограммы обработки прерываний

  12. SIGNAL(SIG_INTERRUPT0)//обработка прерываний кнопки “+”

  13. {pp=pp+1;} //увеличение при нажатии на кнопку “+” на 1

  14. SIGNAL(SIG_INTERRUPT1)//обработка прерываний кнопки “-“

  15. {pp=pp-1;} //уменьшение при нажатии на кнопку “-” на 1

  16. //функция задержки

  17. void delay_ms(int ms)

  18. {for (x=ms;x>0;x–) nop (); }

  19. //Функция включения бита 0 порта B

  20. void ledon(int ms)

  21. { PORTB = 0x01; delay_ms(ms); }

  22. //Функция выключения бита 0 порта B

  23. void ledoff(int ms)

  24. { PORTB = 0x00; delay_ms(ms); }

  25. //Основная программа

  26. int main( void )

  27. {

  28. DDRB=0x01;//конфигурирование порта B на выход

  29. GIMSK=0b11000000; //разрешаем прерывание int0 и int1

  30. MCUCR=0b00001111;// прерывание по возрастающему фронту – для кнопки 1 и 2

  31. sei();//разрешаем прерывания

  32. for (;;)//бесконечный цикл

  33. { p=pp-i;//реализация<\p>

  34. ledon(p);//программного

  35. ledoff(i);//ШИМ

  36. }

  37. }

Вывод 12 микроконтроллера AtTiny2313 необходимо соединить с силовой схемой. Силовую схему для управления двигателем предлагаю построить на сборке из двух полевых транзисторов IRF7105. Довольно дешевая, компактная и доступная в продаже сборка.

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

Небольшим недостатком является напряжение открытия полевых транзисторов этой сборки оно составляет по паспорту 5В, но экспериментально проверено что оно порядка 4В.

А это значит что мы будем иметь довольно узкий диапазон изменения скорости вращения двигателя от 4В до 5В.

В принципе можно использовать любую другую схему для управления мощной нагрузкой, применение такой схемы обусловлено маленькой мощностью портов микроконтроллера ATTiny2313 да и вообще всех микроконтроллеров семейства AVR.

Что бы не сжечь порты микроконтроллера как-раз и применяется силовая схема управления нагрузкой а в данном случаи коллекторным двигателем.
На фотографии:

– макетная плата для attiny2313;

– сборка IRF7105 на полевых транзисторах;
– маломощный коллекторный двигатель.

Видео работы регулятора:

»

Источник: https://avrlab.com/node/52

Конфигурируем ШИМ в Bascom

Источник: http://AVRproject.ru/publ/pwm_bascom/1-2-0-37

Плавный розжиг ламп фар. Часть2. PWM контроллер ATTiny2313 — DRIVE2

Всем привет! В этом посте поделюсь своим первым самостоятельным проектом на МК семейства AVR. Потому прошу сильно не плевать в монитор)))

В первой части я рассказал о будущем функционале устройства, а тут напомню лишь, что это будет автономный контроллер с автоматическим и ручным управлением головным освещением авто.

В первой части разработал, собрал и протестировал драйвер управления лампой автомобиля на основе N-канального MOSFET под управлением PWM-генератора на К155ЛН2. В этой записи ШИМ-генератор заменил на более “культурный” на основе Attiny2313 с кнопочным управлением и регулировкой скважности от 0 до 100%.

Ну вот и макетка! =))

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

Снял небольшое видео работы. Экран осциллографа не захотел, чтоб его снимали. Потому что частота выхода порядка 60Гц всего.

Для знатоков ассемблера есть вопрос.МК новый, фьюзы по дефолту. Настроил аппаратный PWM на ТС0. Судя по ДШ, частота встроенного RC-генератора по дефолту 8МГц. Рассчитывая получить частоту в режиме Fast PWM 122Гц, устанавливаю Кдел=256.

Частота будет рассчитываться по формуле:Fвых=Fclk/(Кдел*256) [формула на стр.

69 datasheet]Шью и наблюдаю неспешное мигание с частотой 15Гц!Меняю Кдел, поочереди 1/8/64/256/1024 и наблюдаю следующие частоты: 3,89кГц/486Гц/60,8Гц/15,6ГцИз этого делаю вывод, что частота генератора составляет всего 1МГц, вместо положенных 8! В чем может быть проблема?

Учитывая частоту в 1МГц, пересчитал и установил выдержку на ТС1 OCR1A=8 равную 8мс для 256 ступеней регулировки яркости (содержимое регистра OCR0A), при удерживании кнопки это будет изменение яркости от одного крайнего значения к другому за 2,09 секунды. Режим таймера — СТС, Кдел=1024. И тут вышло, что тактовая частота 1МГц вместо положенных 8.

.Include “tn2313def.inc”

.def temp1=R16.def temp2=R17.def input=R18.def output=R19.def bright=R20.def kdelH=R26

.def kdelL=R27

.CSEG.

org 0rjmp RESET ; Reset Handlerrjmp intt_0 ; External Interrupt0 Handlerrjmp intt_1 ; External Interrupt1 Handlerrjmp TIM1_CAPT ; Timer1 Capture Handlerrjmp TIM1_COMPA ; Timer1 CompareA Handlerrjmp TIM1_OVF ; Timer1 Overflow Handlerrjmp TIM0_OVF ; Timer0 Overflow Handlerrjmp USART0_RXC ; USART0 RX Complete Handlerrjmp USART0_DRE ; USART0,UDR Empty Handlerrjmp USART0_TXC ; USART0 TX Complete Handlerrjmp ANA_COMP ; Analog Comparator Handlerrjmp PCINT ; Pin Change Interruptrjmp TIMER1_COMPB ; Timer1 Compare B Handlerrjmp TIMER0_COMPA ; Timer0 Compare A Handlerrjmp TIMER0_COMPB ; Timer0 Compare B Handlerrjmp USI_START ; USI Start Handlerrjmp USI_OVERFLOW ; USI Overflow Handlerrjmp EE_READY ; EEPROM Ready Handler

rjmp WDT_OVERFLOW ; Watchdog Overflow Handler

; RESET: ; Reset Handlerintt_0: ; External Interrupt0 Handlerintt_1: ; External Interrupt1 HandlerTIM1_CAPT: ; Timer1 Capture Handler; TIM1_COMPA: ; Timer1 CompareA HandlerTIM1_OVF: ; Timer1 Overflow HandlerTIM0_OVF: ; Timer0 Overflow HandlerUSART0_RXC: ; USART0 RX Complete HandlerUSART0_DRE: ; USART0,UDR Empty HandlerUSART0_TXC: ; USART0 TX Complete HandlerANA_COMP: ; Analog Comparator HandlerPCINT: ; Pin Change InterruptTIMER1_COMPB: ; Timer1 Compare B HandlerTIMER0_COMPA: ; Timer0 Compare A HandlerTIMER0_COMPB: ; Timer0 Compare B HandlerUSI_START: ; USI Start HandlerUSI_OVERFLOW: ; USI Overflow HandlerEE_READY: ; EEPROM Ready HandlerWDT_OVERFLOW: ; Watchdog Overflow Handler

reti

;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж; -настройка-

;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж

RESET: cli

;——– СТЁКldi temp1,RamEnd ;установка указателя стека

out SPL, temp1

;——– ЛАПКИldi temp1,0b00000000 ; порт PD на входout ddrD, temp1ldi temp1,0b11111111 ; порт PB на выходout ddrB, temp1

out PORTD, temp1 ; включаем подтягивающие резисторы порта PD

;——— PWM OC0Aldi temp1,0b10000011 ; вкл ОС0A, уст. FAST PWMout TCCR0A, temp1ldi temp1,0b00000011 ; Кдел=64out TCCR0B, temp1clr temp1out OCR0A, temp1

out TCNT0,temp1

;——— НАСТРОЙКА ТАЙМЕРА ТС1А НА ЗАДЕРЖКУldi temp1,0b00001101 ; включаем режим СТС и clk/1024out TCCR1B, temp1ldi kdelH,0ldi kdelL,8out OCR1AH, kdelH

out OCR1AL, kdelL

;——— ИНИЦИАЛИЗАЦИЯ КОМПАРАТОРАldi temp1,80

out ACSR, temp1

sei;=======================================

;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж; -прога-;жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжINPT:in input, PINDsbrs input,0rjmp MAXsbrc input,1rjmp INPTcpi bright,0 ; из bright вычитаем нольbrne DE ; пропустить 1 шаг, еслине ноль т.е.

Z=0rjmp INPTDE: dec brightrjmp PWMMAX:CPI bright,255 ; из bright вычитаем 255brne I ; пропустить 1 шаг, если не ноль (Z=0) т.е.

если bright не 255rjmp INPTI: inc brightPWM:cliout OCR0A, bright ; грузим в ШИМ значение яркостиclr temp1out TCNT1H, temp1out TCNT1L, temp1 ; обнуляем содержимое счетчика выдержкиldi temp1,0b01000000out TIMSK, temp1 ; включаем разрешение прерывания по таймеруseiCIKL: nop

rjmp CIKL ; ждем выдержку таймера

;———— ОБРАБОТКА ПРЕРЫВАНИЯ ТАЙМЕРАTIM1_COMPA:clr temp1out TIMSK, temp1 ; отключаем прерыванияrjmp INPT

И еще, на осциллографе скважность ШИМ не уменьшается до нуля т.е. все-равно на выходе присутствуют узенькие импульсы, почему? Когда загоняю на максимум, генерация прекращается и на выходе четкая единица. Хотелось-бы видеть и четкий нуль на нижнем пределе…

Разъясните новичку, в чем ошибка? За прогу сильно не пинайте — первый опыт и некогда было сильно приводить в порядок.

Дальше планирую разработку нескольких вариантов девайсов под любой вкус:— плавное включение света, ручной и автоматический режим, выход на контрольную лампу, возможность включения режима ДХО “дальний в полнакала” — во всех вариантах— автоматическое переключение ближнего/дальнего света — опционально— контроль исправности нитей накала ламп — опционально

— отдельный выход включения ДХО, переключение режима с простых ДХО на “дальний в полнакала” — опционально

Себе соберу и установлю полную версию, за исключением последней опции — выхода на отдельные ДХО т.к. устанавливать их не планирую.

В ближайших выпусках блога:
— Мега8 вместо Тиньки2313
— эксперименты с фотодатчиками
— обкатка режимов работы контроллера
— изготовление ПП и сборка контроллера
— результаты работы и смета

Источник: https://www.drive2.com/b/884181/

Микроконтроллер Attiny2313. Описание

RISC (Reduced Instruction Set Computer). Данная архитектура обладает большим набором инструкций, основное количество которых исполняются в 1 машинный цикл. Из этого следует, что по сравнению с предшествующими микроконтроллерами на базе CISC архитектуры (например, MCS51), у микроконтроллеров на RISC быстродействие в 12 раз быстрее.

Или если взять за базу определенный уровень быстродействия, то для выполнения данного условия микроконтроллерам на базе RISC (Attiny2313) необходима в 12 раз меньше тактовая частота генератора, что приводит к значительному снижению энергопотребления. В связи с этим возникает возможность конструирование различных устройств на Attiny2313, с использованием батарейного питания.

Оперативно – Запоминающее Устройство (ОЗУ) и энергонезависимая память данных и программ:

  • 2 кБ самостоятельно программируемой в режиме Flash памяти программы, которая может обеспечить 10 000 повторов записи/стирания.
  • 128 Байт записываемой в режиме EEPROM памяти данных, которая может обеспечить 100 000 повторов записи/стирания.
  • 128 Байт SRAM памяти (постоянное ОЗУ).
  • Имеется возможность использовать функцию по защите данных программного кода и EEPROM.

Свойства периферии:

  1. Микроконтроллер Attiny2313 снабжен восьми разрядным таймер-счетчиком с отдельно устанавливаемым предделителем с максимальным коэффициентом 256.
  2. Так же имеется шестнадцати разрядный таймер-счетчик с раздельным предделителем, схемой захвата и сравнения.

    Тактироваться таймер – счетчик может как от внешнего источника сигнала, так и от внутреннего.

  3. Два ШИМ канала. Существует режим работы быстрый ШИМ-модуляции и ШИМ с фазовой коррекцией.
  4. Внутренний аналоговый компаратор.
  5. Сторожевой таймер (программируемый) с внутренним генератором.

  6. Последовательный универсальный интерфейс (USI). 

Особые технические показатели Attiny2313:

  1. Внутрисистемное программирование с использованием SPI порта. SPI (Serial Peripheral Interface) – последовательный высокоскоростной канал обмена информацией ATtiny2313 с периферийными устройствами.
  2. Улучшенный алгоритм организации сброса в момент включения питания.
  3. Программируемая модель выявления непродолжительных провалов в питании.

  4. Встроенный генератор с калибровкой частоты.
  5. Встроенный отладчик debugWIRE.

     Встроенный комплекс системы отладки debugWIRE применяет однопроводный интерфейс двойного направления для контроля над процессом исполнения программы, исполнения определенных команды процессора, а также для осуществления программирования всех типов энергонезависимой памяти микроконтроллера Attiny2313.

  6. Источники прерывания: внутренние и внешние.

     Причины, вызывающие прерывание выполнения основного кода программы с уходом в подпрограмму прерывания приведены в следующей таблице:

  7. Работа микроконтроллера Attiny2313 в состоянии пониженного потребления энергии:
  • Idle – Режим холостого хода. В данном случае прекращает свою работу только центральный процессор. Idle не оказывает влияние на работу SPI, аналоговый компаратор, аналого-цифровой преобразователь, таймер-счетчик, сторожевой таймер и систему прерывания. Фактически, происходит только остановка синхронизация ядра центрального процессора и флэш-памяти. Возврат в нормальный режим работы микроконтроллера Attiny2313 из режима Idle происходит по внешнему либо внутреннему прерыванию.
  • Power-down – Наиболее экономный режим, при котором микроконтроллер Attiny2313 фактически отключается от энергопотребления. В этом состоянии происходит остановка тактового генератора, выключается вся периферия. Активным остается лишь модуль обработки прерываний от внешнего источника. При обнаружении прерывания микроконтроллер Attiny2313 выходит из Power-down и возвращается в нормальный режим работы.
  • Standby – в этот дежурный режим энергопотребления микроконтроллер переходит по команде SLEE. Это аналогично выключению, с той лишь разницей, что тактовый генератор продолжает свою работу.

Порты ввода – вывода микроконтроллера Attiny2313:

Микроконтроллер наделен 18 выводами ввода – вывода, которые можно запрограммировать исходя из потребностей, возникающих при проектировании конкретного устройства. Выходные буферы данных портов выдерживают относительно высокую нагрузку.

  • Port A (PA2 – PA0) – 3 бита. Двунаправленный порт ввода-вывода с программируемыми подтягивающими резисторами.
  • Port B (PB7 – PB0) – 8 бит. Двунаправленный порт ввода-вывода с программируемыми подтягивающими резисторами.
  • Port D (PD6 – PD0) – 7 бит. Двунаправленный порт ввода-вывода с программируемыми подтягивающими резисторами.

Диапазон питающего напряжения:

Микроконтроллер успешно работает при напряжении питания от 1,8 до 5,5 вольт. Ток потребления зависит от режима работы контроллера:

Активный режим:

  • 20 мкА при тактовой частоте 32 кГц и напряжении питания 1,8 вольт.
  • 300 мкА при тактовой частоте 1 МГц и напряжении питания 1,8 вольт.

Режим энергосбережения:

  • 0,5 мкА при напряжении питания 1,8 вольт.

Скачать Attiny2313 Datasheet на русском и английском (3,6 Mb, скачано: 4 707)

Источник: http://www.joyta.ru/5791-mikrokontroller-attiny2313-opisanie/

Восстановление микроконтроллеров

Источник: http://elwo.ru/publ/skhemy_na_mikrokontrollerakh/vosstanovlenie_mikrokontrollerov/9-1-0-533

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}

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

  Наверно объяснять что это такое и в чем прелесть управления ШИМом не нужно, информации в интернете накопилось уже достаточно много, да и врядли мне получиться разжевать эту тему лучше. Поэтому сразу перейдем к делу, а именно запустим ШИМ на 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 на то, что происходит на выходе ШИМ в зависимости от значения регистра сравнения.

https://www.youtube.com/watch?v=Xki0CD3uy0Y

Когда выход сконфигурирован как 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. Тут я думаю, все понятно.

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

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

$regfile = “attiny2313.dat”
$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

Do

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

Do

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 Гц

   Уверен, многие имеют микроконтроллеры с неправильно прошитыми фузами и непригодными для дальнейшего использования. Но не спешите их выбрасывать – есть интересное устройство, специально предназначенное для исправления ошибочно установленных фьюзов. Представляем «» – это устройство предназначено вернуть к жизни с неправильно прошитыми фьзами. Такими фьюзами могут быть:

CKSEL фьюзы выбора задающего генератора (выбран внешний генератор при его отсутствии или выбрана очень маленькая частота внутреннего);

SPIEN запрет последовательного программирования;

RSTDISBL использование ножки сброса как дополнительной линии ввода-вывода;

– установленные LOCK биты;

– другие, мешающие последовательному программированию.

   Принцип работы восстановителя прост – подаем на плату 12 вольт, вставляем в панельку «испорченный» микроконтроллер, нажимаем кнопочку «START» и в момент получаем новенький рабочий микроконтроллер. Очень просто, даже не нужен компьютер. И если внешне устройство выглядит просто, то внутри все гораздо сложнее.

При нажатии кнопки «START» устройство читает сигнатуру микроконтроллера-пациента, при этом, если она не читается, делается несколько попыток прочитать различными способами. После того как сигнатура прочитана по базе определяется тип микроконтроллера и восстанавливаются заводские, для данного микроконтроллера, установки фьюз бит.

Если сигнатура неизвестна или микроконтроллер выдает ее неверно устройство установит фьюз биты в такое состояние, при котором станет возможным последовательное программирование. При восстановлении фьюз бит прошивка микроконтроллера остается нетронутой. Еще на плате есть перемычка «ALLOW ERASE», при замыкании которой устройство полностью «обнулит» микроконтроллер.

Это нужно в том случае, если пациент «залочен», т.е. установлены защитные биты которые препятствуют чтению/записи микроконтроллера.

   Для индикации работы устройство имеет два светодиода – и .

– Если горит зеленый – пациент успешно вылечен, фьюз биты восстановлены до заводских. Если микроконтроллер «залочен» (LockBits включены), просто проверяются фьюз биты и если они совпадают с заводскими – загорается зеленый светодиод.

– Если горит красный – проблемы с сигнатурой чипа, невозможно прочитать, нет микроконтроллера в панельке или нет такой сигнатуры в базе данных.

– Если зеленый мигает – сигнатура в порядке, фьюз биты с ошибкой, но исправить их невозможно, так как микроконтроллер «залочен» (LockBits включены), необходимо полное стирание микроконтроллера (нужно установить перемычку для стирания – «ALLOW ERASE»).

– Если мигает красный – сигнатура в порядке, микроконтроллер «не залочен», но, по какой-то причине, невозможно восстановить фьюз биты.

– Если Вы хотите получить более подробную информацию о процессе «лечения» – на плате есть выход UART. Отправьте этот сигнал на терминал и получите «распечатку» того, что было сделано. Установки для терминала:

 baudrate: 4800
 parity: none
 databits: 8
 stopbits: 1
 handshake: none

   На плате установлены три панельки для контроллеров на 20 (Attiny2313 …), 28(Atmega48/88/168, Atmega8 …), 40 (Atmega16, Atmega8535 …) ножек. Если Вы решили «полечить» другого «пациента», то на плате предусмотрен специальный разъем для подключения адаптеров с панельками под любой, нужный Вам, микроконтроллер. Устройство поддерживает аж 106 типов микроконтроллеров AVR. Вот полный список:

 1kB: AT90s1200, Attiny11, Attiny12, Attiny13/A, Attiny15

 2kB: Attiny2313/A, Attiny24/A, Attiny26, Attiny261/A, Attiny28, AT90s2333, Attiny22,Attiny25, AT90s2313, AT90s2323, AT90s2343

 4kB: Atmega48/A, Atmega48P/PA, Attiny461/A, Attiny43U, Attiny4313, Attiny44/A, Attiny48, AT90s4433, AT90s4414, AT90s4434, Attiny45

 8kB: Atmega8515, Atmega8535, Atmega8/A, Atmega88/A, Atmega88P/PA, AT90pwm1, AT90pwm2, AT90pwm2B, AT90pwm3, AT90pwm3B, AT90pwm81, AT90usb82, Attiny84, Attiny85, Attiny861/A, Attiny87, Attiny88, AT90s8515, AT90s8535

 16kB: Atmega16/A, Atmega16U2, Atmega16U4, Atmega16M1, Atmega161, Atmega162, Atmega163, Atmega164A, Atmega164P/PA, Atmega165A/P/PA, Atmega168/A, Atmega168P/PA, Atmega169A/PA, Attiny167, AT90pwm216, AT90pwm316, AT90usb162

 32kB: Atmega32/A, Atmega32C1, Atmega323/A, Atmega32U2, Atmega32U4, Atmega32U6, Atmega32M1, Atmega324A, Atmega324P, Atmega324PA, Atmega325, Atmega3250, Atmega325A/PA, Atmega3250A/PA, Atmega328, Atmega328P, Atmega329, Atmega3290, Atmega329A/PA, Atmega3290A/PA, AT90can32

 64kB: Atmega64/A, Atmega64C1, Atmega64M1, Atmega649, Atmega6490, Atmega649A/P, Atmega6490A/P, Atmega640, Atmega644/A, Atmega644P/PA, Atmega645, Atmega645A/P, Atmega6450, Atmega6450A/P, AT90usb646, AT90usb647, AT90can64

 128kB: Atmega103, Atmega128/A, Atmega1280, Atmega1281, Atmega1284, Atmega1284P, AT90usb1286, AT90usb1287, AT90can128

 256kB: Atmega2560, Atmega2561

   Схема устройства для восстановления испорченных микроконтроллеров довольно простая.

   Плата разведена хорошо, но есть один нюанс, о котором важно не забыть при сборке устройства. Ножки 40-ка пиновой панельки с 29 по 37 необходимо откусить (лучше в плате вообще не сверлить отверстия под эти ножки).

   Теперь осталось только прошить микроконтроллер ATmega8 и устройство готово! Данный вариант прошивки еще есть для микроконтроллеров: Atmega88, Atmega88P, Atmega168, Atmega168P, Atmega328, Atmega328P.

Прошивка для микроконтроллеров с 16kB и 32kB памяти, кроме того, выдает названия восстанавливаемых микроконтроллеров.

В результате работы «Atmega fusebit doctor» мною были возращены к жизни несколько ATtiny2313, ATmega48, Atmega8535. Схему испытал: феска.

   Форум по микроконтроллерам AVR

   Схемы на микроконтроллерах