Регулятор напряжения на микроконтроллере
Регулятор напряжения на микроконтроллере
Очень часто нужно иметь возможность регулировать ток, протекающий через лампы или нагревательные элементы. Поскольку нагрузка у них резистивная – самое простое решение собрать небольшой PWM (с английского ШИМ – широтно-импульсная модуляция) регулятор. Поскольку простые схемы на базе таймеров NE555 не интересовали – решено было разработать и собрать свою, несколько похожую на микроконтроллерный LED драйвер.
Схема, несмотря на наличие микроконтроллера PIC18LF2550, очень проста для повторения и может быть условно разделена на 3 части:
Распиновка ESP32
Микроконтроллер оснащен 48 контактами плюс 1 большой тепловой контакт, которые обладают разными функциями. Выводы микросхемы:
- 18 каналов 12-разрядного АЦП;
- 10 GRIO портов;
- 3 SPI;
- 3 UART;
- 2 I2C;
- 16 ШИМ выводов;
- 2 8-битных ЦАП вывода;
- 2
Расположение выводов зависит от производителя. Например, есть плата ESP32 DEVKIT V1 DOIT, у которой 36 контактов. Распиновка представлена на рисунке ниже.
Одним из самых популярных модулей является ESP-WROOM-32. Распиновка также приведена на картинке.
К портам GRIO 0, 4, 2, 15, 13, 12, 14, 27, 33 и 32 подключены сенсорные выводы. Они могут использоваться для вывода ESP32 из глубокого сна. Они фиксируют любое изменение электрического заряда.
Порты с 34 по 39 используются только для ввода информации. На них отсутствуют подтягивающие резисторы, поэтому их нельзя использовать как выходы.
На некоторых платах отображаются контакты 6-11. Они подсоединены к к интегрированной SPI flash. Их не используют в проектах.
Есть различные версии платы ESP32 размерами 5х5 мм или 6х6 мм. Также на основе ESP32 существуют модули SMT для интегрирования в другие платы.
Потенциометры
Аналоговые пины и АЦП в целом очень часто используются при работе с потенциометрами (он же переменный резистор или реостат). 10 бит АЦП позволяют дать возможность задавать в программу значения от 0 до 1023 (или кратные им), то есть влиять на ход работы программы, менять какие-то настройки и тому подобное. У потенциометра всегда три ноги: две крайние и одна центральная. Всё вместе это представляет собой делитель напряжения, который и позволяет менять напряжение в диапазоне 0-VCC: К Arduino потенциометр подключается вот так, средний вывод на любые A-пины, крайние – на GND и питание. От порядка подключения GND и питания зависит направление изменения значения. Что касается сопротивления, то читай заметку по делителям напряжения ниже в этом уроке. Чаще всего для микроконтроллеров ставят потенциометры с сопротивлением 10 кОм, но диапазон в принципе очень широк: от 1 кОм до 100 кОм. Чем больше, тем более шумным будет приходить сигнал, а если брать меньше – пойдут потери тока в нагрев потенциометра, а это никому не нужно.
Принцип работы схемы
Рассматриваемая схема устройства регулирования силы свечения светодиода на микроконтроллере AVR ATmega32 приведена на следующем рисунке.
В микроконтроллере ATmega32 четыре ШИМ (PWM) канала используются на четырех контактах. Мы можем использовать только выход ШИМ на этих контактах. Поскольку мы решили использовать PWM0 (8-битный канал) мы должны использовать ШИМ сигнал с контакта OC0 (PORTB 3-й контакт). Как можно видеть из схемы, мы соединяем базу транзистора к контакту OC0 микроконтроллера чтобы управлять мощным светодиодом.
Параллельно кнопкам увеличения/уменьшения яркости свечения подсоединены конденсаторы для предотвращения биений (нежелательных колебаний, шумов). Всегда, когда нажата кнопка, на контакте, к которому она подсоединена, присутствует определенный шум. Этот шум стабилизируется в течение нескольких миллисекунд. Но для микроконтроллера пики этого шума (до того как он стабилизируется) действуют как триггеры. Этот эффект можно исключить как программным, так и аппаратным способом, программным – проще. Но мы в данной схеме используем аппаратный способ путем добавления конденсаторов, которые сводят к нулю эффект биения от кнопок.
В микроконтроллерах ATmega есть два способа генерации ШИМ:
- Фазовая (правильная) ШИМ.
- Быстрая ШИМ.
Мы будем использовать более простой способ – быстрый метод формирования ШИМ.
Сначала необходимо выбрать частоту ШИМ, которая будет зависеть от используемого приложения (применения). Для светодиода эта частота должна быть не менее 50 Гц. Мы выберем частоту счетчика времени 1 МГц. Теперь чтобы получить быструю ШИМ 50 Гц на микроконтроллере ATmega, мы должны задействовать соответствующие биты в регистре TCCR0 – это единственный регистр, который нам будет нужен для получения 8 битной быстрой ШИМ.
На представленном рисунке:
1. CS00, CS01, CS02 (выделены желтым цветом) – выбирают prescalar (предварительное масштабирование) для выбора частоты временного интервала. Таблица для соответствующих prescalar показана на рисунке ниже. Таким образом, для предварительного масштабирования, равного 1, oscillator clock=counter clock (шкала осциллятора равна шкале счетчика). То есть установим CS00=1, остальным двум битам установим нулевые значения.
2. Биты WGM01 и WGM00 изменяют чтобы выбрать нужный режим генерации формы сигнала. Исходя из необходимых нам параметров (быстрая ШИМ – Fast PWM) по таблице, представленной на следующем рисунке, выбираем WGM00=1 и WGM01=1.
3. Теперь мы знаем, что ШИМ – это сигнал с различными интервалами ON и OFF сигнала (различными продолжительностями включения). Для получения различных продолжительностей включения (отношение длительности импульса к периоду повторения) нам необходимо выбрать значение между 0 и 255 (от 0 до 2^8 поскольку мы используем 8 битную ШИМ). Допустим мы выбрали значение 180, это значит что счетчик начинает счет от 0 и когда он достигает значения 180, то отклик на выходе может быть приведен в действие (запустится триггер). Этот триггер может быть инвертирующим и неинвертирующим. То есть выход можно сконфигурировать так, чтобы по достижении счетчиком заданного значения он либо опускал фронт импульса, либо поднимал его. Этот выбор производится с помощью установки битов CM00 и CM01 (выделены зеленым цветом на рисунке выше).
Как показано в следующей таблице, с помощью установки этих битов можно выбрать режим как с инвертированием, так и без инвертирования. Мы выберем режим с инвертированием, таким образом установим эти биты в COM00=1 и COM01=1.
За установку того самого значения, которое задает различные продолжительности включения (отношение длительности импульса к периоду повторения), в микроконтроллере ATmega32 отвечает байт OCR0 (Output Compare Register 0) – в нем сохраняется нужное нам значение от 0 до 255. Пример выбранного нами режима инвертирования показан на рисунке ниже. Таким образом, если мы запишем в OCR0=180, то контроллер будет изменять уровень сигнала на выходе когда счетчик досчитает до 180 (начиная с 0).
Если необходимо будет изменить яркость свечения светодиода, то тогда в байт OCR0 следует записать другое число (вместо 180). В представленной схеме присутствуют 2 кнопки. Одна кнопка служит для увеличения числа в байте OCR0 (увеличение яркости свечения), а другая – для уменьшения числа в байте OCR0 (уменьшение яркости свечения).
Программирование микроконтроллеров
Курс «Программирование микроконтроллеров» читается для студентов 2 курса в течение осеннего и весеннего семестров. Занятия проводятся один раз в неделю в течение 4 академических часов (5 и 6 пары).
Учебная нагрузка — 60 часов/семестр.
Оборудование
Обучение производится на микроконтроллерах STM32F429.
Курсовые и зачётные работы могут выполняться с использованием других микроконтроллеров STM32, а также на устройствах TI Stellaris или TI Tiva.
Программа курса (осенний семестр)
Базовая часть
Тема 1. Введение. Программирование микроконтроллеров на языке С
Теория. Микроконтроллеры. Функции и применение микроконтроллеров. Основные параметры микроконтроллеров. Архитектура микроконтроллеров. Семейства микроконтроллеров ARM и их назначение. Устройство микроконтроллеров. Ядра Cortex — M 0/ M 3/ M 4 F . Периферийные блоки микроконтроллеров: ввод-вывод общего назначения, тактирование, таймеры, прерывания.
Язык С для микроконтроллеров ARM . Особенности разработки программ для микроконтроллеров по сравнению с программированием для ПК. Ввод и вывод. Адресация. Двоичное и шестнадцатеричное счисления. Среда программирования IAR EWARM . Возможности отладки программ.
Практика. Создание и настройка проекта в среде IAR. Создание прошивки, осуществляющей работу с блоком ввода-вывода общего назначения. Работа с технической документацией (поиск адресов аппаратных регистров, работа с принципиальной схемой тестовой платы).
Тема 2. Прерывания
Теория. Прерывания. Виды прерываний. Контроллер прерываний NVIC в ядре Cortex — M . Вектора прерываний. Приоритеты. Флаги прерываний в контроллерах STM . Рекомендации по написанию обработчиков прерываний.
Практика. Создание программы, реализующей асинхронный ввод-вывод сигналов. Освоение документации NVIC . Настройка прерываний блока ввода-вывода общего назначения.
Тема 3. Таймеры
Теория. Таймеры. Виды таймеров. Режимы работы таймеров. Измерение малых промежутков времени. Система тактирования микроконтроллера и методы её настройки.
Практика. Разработка программы для периодического вывода сигналов с использованием таймера и делителей частоты. Измерение параметров сигналов с помощью цифрового осциллографа.
Тема 4. Широтно-импульсная модуляция
Теория. Широтно-импульсная модуляция. Применение ШИМ для управления электронными устройствами. Особенности реализации ШИМ на микроконтроллере. Сглаживание. Специальные режимы работы таймеров.
Практика. Разработка программы для генерации ШИМ сигнала с заданными параметрами.
Тема 5. Цифро-аналоговые и аналого-цифровые преобразования
Теория. АЦП и ЦАП. Частота дискретизации и разрядность. Основные виды АЦП (АЦП прямого преобразования, АЦП последовательного приближения, сигма-дельта АЦП) и их характеристики. Режимы запуска АЦП. Дифференциальный режим измерения. Алгоритмы усреднения измеряемых величин: скользящее среднее и экспоненциальное усреднение. Библиотека для работы с периферийными блоками HAL Driver .
Практика. Разработка программы, осуществляющей измерение напряжения внешнего аналогового сигнала с помощью АЦП.
Тема 6. Обмен данными
Теория. Последовательные и параллельные интерфейсы. UART . Принцип работы шины UART , протокол передачи данных. События блока UART на микроконтроллерах STM 32. Протоколы SPI и I2C, их принципы работы. Концепция ведущий-ведомые.
Практика. Разработка прошивки для микроконтроллера, осуществляющей приём и отправку данных по UART . Освоение программного обеспечения для работы с COM -портами на ПК.
Тема 7. Флеш-память
Теория. Принцип работы ячейки флеш-памяти (транзистор с плавающим затвором, чтение и запись данных). NOR и NAND конструкции флеш-памяти. Многоуровневые ячейки. Особенности работы с флеш-памятью из программ.
Практика. Разработка программы для подсчёта импульсов с использованием флеш-памяти для сохранения значения счётчика на случай перезагрузки или потери питания.
Дополнительные темы (читаются по усмотрению преподавателя)
Тема Д1. Дисплеи
Теория. Виды дисплеев. Электронно-лучевые трубки (принцип работы, развёртка). Жидкокристаллические дисплеи (принцип действия ЖК ячейки, устройство мониторов, адресация). Кодирование цветов, битность изображения. Плазменные дисплеи. Светодиодные дисплеи. Проекторы (3 LCD , LC 0 S , DLP ). Резистивные и ёмкостные сенсорные дисплеи. Перспективные виды дисплеев ( OLED, интерференционные дисплеи, SED, PixelSense ) .
Практика. Написание программы, осуществляющей вывод графических примитивов и текста на TFT — LCD дисплей тестовой платы. Освоение высокоуровневых библиотек для работы с периферийными блоками и внешними устройствами.
Тема Д2. Система тактирования микроконтроллера
Теория. Классификация и принципы работы генераторов тактовой частоты. Кварцевые и RC-генераторы. Фазовая автоподстройка, делители и умножители частоты. Тактовые частоты шин данных и периферийных блоков микроконтроллера.
Практика. Настройка системы тактирования микроконтроллера, вывод тактового сигнала микроконтроллера. Измерение частоты тактирования с помощью осциллографа. Изучение зависимости формы сигнала от значения тактовой частоты.
Тема Д3. USB
Теория. Краткая история внедрения шины USB . Физический уровень (кабели и разъёмы, состояния шины, кодирование данных). Пакетный уровень (структура и виды пакетов). Транзакционный уровень (адреса, конечные точки). Логический уровень (виды каналов, передача данных по периодам). Дескрипторы и классы устройств. Краткий обзор спецификаций USB.
Практика. Передача данных с ПК на контроллер по USB c использованием CDC класса.
Тема Д4. Операционные системы реального времени
Теория. Операционные системы мягкого и жёсткого реального времени, а также их особенности. Диспетчеризация задач. Синхронизация задач. Операционная система Free RTOS . Некоторые функции для управления задачами во Free RTOS .
Практика. Настройка Free RTOS и создание многозадачной программы для управления светодиодами.
Программа курса (весенний семестр)
- Тематические лекции
- Дополнительные разделы программирования микроконтроллеров
- Выполнение курсовой работы по программированию
Отчетность
Осенний семестр — зачет
Весенний семестр — зачет с оценкой
— В конце осеннего семестра в течение 4 занятий выполняется зачетная работа.
Примеры тем зачетных работ:
- Измерение частоты внешнего сигнала с выводом результата на дисплей.
- Генерация ШИМ сигнала с регулировкой частоты и скважности.
- Измерение ёмкости конденсатора путём анализа формы отклика RC -цепи на периодический сигнал.
- Измерение индуктивности путём анализа формы отклика RL -цепи на периодический сигнал.
- Генерация гармонического сигнала путём модуляции одиночными импульсами.
- Измерение расстояния между акустическим излучателем и микрофоном с помощью измерения задержки распространения звука.
- Измерение скорости звука импульсным методом
- Стабилизация напряжения в RC цепи с обратной связью. Напряжение задаётся с компьютера и выводится на дисплей.
— В течение весеннего семестра выполняется курсовая работа.
По согласованию с научными руководителями курсовая работа по программированию может быть совмещена с курсовой работой по физике. Для этого нужно, чтобы работа в значительной мере была посвящена автоматизации эксперимента или другим задачам, подразумевающим программированию микроконтроллеров.
Записки программиста
Тема программирования микроконтроллеров ранее многократно поднималась в этом блоге, но исключительно в контексте микроконтроллеров AVR и, соответственно, Arduino. Сегодня же речь пойдет о микроконтроллере STM32F103C8T6 на базе ядра ARM 32 Cortex-M3. Вы наверняка слышали об архитектуре ARM — она используется в большинстве современных телефонов и планшетов, а также Raspberry Pi, полетных контроллерах для квадрокоптеров, и много где еще.
Список покупок
Для повторения шагов из сей заметки вам понадобится следующие железки:
К моменту, когда вы будете читать эти строки, ссылки могут устареть. Однако необходимые товары легко находятся по запросам «STM32F103C8T6 Development Board» и «ST-Link v2 Programmer» как на AliExpress, так и на eBay. Плата также известна под названием «STM32 Blue Pill».
Важно! Заметьте, что USB-разъем на этих платах часто не слишком надежно припаян и может быстро оторваться. Первым делом после покупки рекомендуется его подпаять.
О плате Blue Pill
Ниже приведены некоторые характеристики платы и используемой в ней микроконтроллера:
- Микроконтроллер 32-х битный;
- Рабочая частота 72 МГц;
- 64 Кб flash-памяти;
- 20 Кб оперативной памяти;
- Мне удалось насчитать 32 GPIO;
- 12-и битный АЦП, 10 аналоговых пинов;
- 16-и битный ШИМ, 15 ШИМ-пинов;
- 3 UART канала, 2 I2C шины, 2 SPI шины;
- Возможность отладки по SWD;
- Плата питается от 3.3 В;
Расположение пинов (кликабельно — GIF, 1082 x 759, 143 Кб, источник):
Для сравнения, Arduino Nano стоит столько же и имеет похожий форм-фактор, но работает на 8-и битном микроконтроллере, имеет частоту 16 МГц, меньше пинов, лишь 32 КБ flash-памяти, 2 Кб оперативной памяти, 10-битный АЦП, 8-и битный ШИМ, по одному каналу UART, I2C и SPI, а про отладку он и вовсе слыхом не слыхивал. То есть, за те же деньги мы получаем куда более мощную железку.
Настройка Arduino IDE
Интересная особенность платы заключается в том, что под нее можно писать из Arduino IDE, используя знакомый набор процедур и классов, а также многие библиотеки, изначально написанные под Arduino. Это делает плату весьма привлекательной для начинающих.
Для программирования под данную плату нам понадобится кросс-компилятор для ARM, отладчик, стандартная библиотека C и клиент к программатору. В Arch Linux соответствующие пакеты ставятся так:
Далее учим Arduino IDE работать с нашей платой:
/ opt / arduino / hardware
git clone https: // github.com / rogerclarkmelbourne / Arduino_STM32.git
Мне дополнительно пришлось поправить Arduino_STM32/STM32F1/platform.txt:
… ибо сыпались ошибки про то, что Arduino IDE не может найти исполняемый файл arm-none-eabi-g++ .
После этого если открыть Arduino IDE, то в меню Tools → Board вы обнаружите большой выбор плат на базе микроконтроллеров STM32. Выбираем Generic STM32F103C. В Tools → Upload Method выбираем STLink. Четыре пина на плате с подписями 3.3V, IO, CLK и GND подключаем к пинам 3.3V, SWDIO, SWCLK и GND программатора соответственно. Проверяем джамперы на плате. Оба джампера (так называемые boot0 и boot1) должны стоять в положении 0.
Fun fact! Чтобы постоянно не возиться с проводами при подключении программатора, выясняя, провод какого цвета к какому пину платы нужно подключить в этот раз, можно взять кусок макетки и спаять адаптер на базе разъема IDC-10. Адаптер подключается к плате через четыре угловых гнезда с шагом 2.54 мм, а затем адаптер подключается к программатору через соответствующий шлейф. Больше никакой путаницы!
Пробуем скомпилировать и залить такой скетч:
void loop ( ) {
digitalWrite ( PC13, HIGH ) ;
delay ( 100 ) ;
digitalWrite ( PC13, LOW ) ;
delay ( 100 ) ;
}
Fun fact! В плате Blue Pill светодиод стоит между ногой PC13 и VCC (схема [PDF]), а не между ногой и землей, как можно было бы ожидать. Поэтому, подавая HIGH на PC13, мы гасим светодиод, а подавая LOW — зажигаем.
Если при прошивке возникает ошибка:
… проверьте, не перепутали ли вы пины CLK и IO, а также попробуйте зажать кнопку Reset на плате.
Если все сделано правильно, светодиод на плате будет мигать, а частота мигания будет меняться при внесении соответствующих изменений в код.
Поздравляю, среда разработки настроена!
Более сложный пример
Ниже приведен код посложнее, демонстрирующий использование ШИМ, аналоговых пинов, а также отладочный вывод по UART:
const int LED1 = PB8 ;
const int LED2 = PB9 ;
const int PTNT = PA0 ;
const int BTN = PB7 ;
int selected_led = LED1 ;
bool btn_was_high = false ;
void setup ( ) {
pinMode ( LED1, PWM ) ;
pinMode ( LED2, PWM ) ;
pwmWrite ( LED1, 0 ) ;
pwmWrite ( LED2, 0 ) ;
pinMode ( BTN, INPUT ) ;
pinMode ( PTNT, INPUT_ANALOG ) ;
if ( digitalRead ( BTN ) == HIGH ) {
btn_was_high = true ;
} else if ( btn_was_high ) {
btn_was_high = false ;
if ( selected_led == LED1 ) {
selected_led = LED2 ;
pwmWrite ( LED1, 0 ) ;
} else {
selected_led = LED1 ;
pwmWrite ( LED2, 0 ) ;
}
}
int ptnt = analogRead ( PTNT ) ;
int ptnt_mapped = map ( ptnt, 0 , 4095 , 0 , 65535 ) ;
Serial. println ( String ( "ptnt = " ) + ptnt + ", ptnt_mapped = " +
ptnt_mapped ) ;
pwmWrite ( selected_led, ptnt_mapped ) ;
}
Соответствующая цепь, собранная на макетной плате:
При нажатии на кнопку один светодиод гаснет, а второй загорается. Яркость свечения светодиода регулируется потенциометром. Как видите, код очень мало отличается от обычного кода для Arduino. Отличаются только названия пинов, а также диапазоны значений, с которыми работают процедуры analogRead и pwmWrite.
Еще больше примеров можно найти в File → Examples → A_STM32_Examples.
Сторонние библиотеки
Многие библиотеки уже портированы под STM32 — Wire, Servo, LiquidCrystal, и другие. А что, если попытаться использовать стороннюю библиотеку с GitHub? Для эксперимента я решил попытаться воспользоваться библиотекой LiquidCrystal_I2C, уже знакомой нам по заметке Об использовании экранчиков 1602 с I2C-адаптером.
Добавляем библиотеку в Arduino IDE:
/ Arduino / libraries
git clone
https: // github.com / fdebrabander / Arduino-LiquidCrystal-I2C-library.git
. / LiquidCrystal_I2C
LiquidCrystal_I2C lcd ( 0x3F , PB6, PB7 ) ;
lcd. setCursor ( 0 , 1 ) ;
unsigned long tstamp = millis ( ) ;
int h = tstamp / 1000 / 60 / 60 ;
int m = ( tstamp / 1000 / 60 ) % 60 ;
int s = ( tstamp / 1000 ) % 60 ;
Стоит помнить, что экранчику нужно 5 В, а плата питается от 3.3 В. Поэтому, чтобы все заработало, плату нужно запитать от USB, а экранчик подключить к пину 5V. Экранчик оказался совместим с 3.3-вольтовой логикой, но в более общем случае может потребоваться преобразователь логических уровней.
Само собой разумеется, не всякая библиотека, написанная под Arduino, так просто возьмет и заработает под STM32. Но, по всей видимости, для многих библиотек это действительно так.
Заключение
Итак, что же мы выяснили? Плата стоит как Arduino Nano, имеет похожий форм-фактор, но является при этом куда более мощной. Писать под нее можно точно так же, как под Arduino. При этом нам доступны если и не все те же библиотеки, что под Arduino, то по крайней мере очень многие из них.
А программируете ли вы под STM32 и если да, то что для этого используете?
Переходим от Arduino к программированию ATtiny13 на C
Программирование Arduino даёт не только огромный простор для фантазии и возможностей, но, как и любой фреймворк , одновременно навязывает свой стиль и ограничивает возможности.
Поэтому, если чувствуется, что Arduino становится тесноват — можно не только перейти на 32-битные контроллеры (например, STM32), но и попробовать более низкоуровневое программирование контроллеров.
Уходя ближе «к железу» — программировать придётся на более близком к железу уровне — и если это не ассемблер, то уж язык программирования Си — точно.
Пример подобного программирования уже приводился в статье Arduino/CraftDuino и WinAVR — программируем на чистом С .
У такого стандартного программирования микроконтроллеров есть существенное преимущество перед использованием Arduino-вских скетчей.
Однако, за низкоуровневый полный контроль и возможность использовать все ресурсы микроконтроллера, приходится расплачиваться долгим и внимательным изучением документации (datasheet-а) на микроконтроллер.
Т.е., если у вас ещё не было опыта работы с конкретным микроконтроллером — то вместо быстренького набрасывания скетча для решения своей задачи — вам придётся потратить дополнительное время на изучение мат. части.
Разумеется, не всегда это может быть оправдано и если задачу нужно и можно быстро решить при помощи Arduino — то почему бы и нет?
Однако, если решение задачи на Arduino невозможно, то придётся потратить время на получение ценных опыта и знаний, которые помогут открыть все возможности, которые под силу микроконтроллеру.
Для примера, возьмём меленький, простой и дешёвый контроллер ATtiny13.
ATtiny13
8-битный AVR микроконтроллер с 1 КБ программируемой Flash памяти
— RISC архитектура
— 120 команд, (большинство выполняется за один такт)
— 32 8-битных регистра общего применения
— 1 КБ программируемой Flash памяти программы
— 64 байта EEPROM памяти данных, (до 100 000 циклов записи/стирания)
— 64 байта SRAM памяти (статическое ОЗУ)
— Один 8-разрядный таймер/счётчик с отдельным предделителем и два ШИМ канала
— 4-канальный 10-битный АЦП со встроенным ИОН
— Программируемый сторожевой таймер (watchdog) со встроенным генератором
— Встроенный аналоговый компаратор
— Внутрисистемное программирование через SPI порт
— Внешние и внутренние источники прерывания
Корпусное исполнение:
— 8-выводные PDIP и SOIC корпуса: 6 программируемых линий ввода-вывода
Диапазон напряжения питания, частота:
1.8 – 5.5В (для ATtiny13V) — до 10МГц
2.7 – 5.5В (для ATtiny13) — до 20МГц
Выводы микроконтроллера ATtiny13:
Документация на ATtiny13:
Как видим, микросхема микроконтроллера — маленькая — всего 8 ножек.
Чтобы заставить её работать — нужно просто воткнуть её в макетную плату, подтянуть RESET (первый пин — на схеме обозначается — PB5) к шине питания через 10-килоомный резистор и подать питание — например, 5V снятые с пинов питания контроллера Arduino / CraftDuino.
Подключение ATtiny13 через SPI к CraftDuino
В статье Делаем ISP-программатор из Arduino , уже подробно расписано как нужно подключить микроконтроллер ATtiny13 к контроллеру Arduino или CraftDuino, чтобы его можно было программировать через выводы микросхемы FT232RL используя режим bit-bang (режим управления отдельными выводам микросхемы). Поэтому сразу переходим к софтовой части.
Atmel Studio
Раз решили программировать «по-взрослому», то и среда разработки нужна «взрослая».
Идём на сайт Atmel -a, и скачиваем свежую версию Atmel Studio .
Atmel Studio — (наследница AVR Studio) — это бесплатная среда разработки для микроконтроллеров Atmel.
Сама IDE должна быть знакома, т.к. используется оболочка от Microsoft Visual Studio, однако следует обратить внимание, что в качестве компилятора используется GCC.
После установки, на рабочем столе появится ярлык с симпатичной красной божьей коровкой. Запускаем IDE и привычным образом, быстренько создаём проект.
File -> New -> Project.
Выбираем С/С++ и GCC C Executable Project, пишем имя проекта, например, blink 🙂
Затем, среда предложит выбрать тип используемого микроконтроллера — выбираем ATtiny13.
Всё — шаблонный файл уже создан и можно начинать программировать:
Предлагаемый шаблон программы — напоминает что-то знакомое :
Соответствие функций Arduino на Си
Описание работы портов микроконтроллера и используемых для насткройки и работы регистров, очень подробно приводится в документации на микроконтроллер — ATtiny13 datasheet .
Как увидим далее, конфигурирование и работа с портами сводится к установке соответствующих битов в нужных регистрах микроконтроллера.
Если вы уже имели дело с установкой/проверкой/очисткой битов (работа с битовыми масками), то вам будет проще разобраться в происходящем.
Но, на всякий случай, напомню:
чтобы установить бит N — нужно выполнить побитовое ИЛИ с числом, где этот бит установлен (чтобы получить такое число — мы побитово сдвигаем влево единицу на заданное число позиций).
Соответственно, чтобы сбросить бит N — нужно выполнить побитовое И с числом в котором установлены все биты кроме заданного (чтобы получить такое «интвертированное число» — мы сначала получаем число в котором бит установлен, а потом применяем к нему операцию побитового НЕ).
Так как процедура установки бита встречается чрезвычайно часто — для неё даже есть удобный макрос
, который рекомендуется к использованию.
Для простоты понимания Си-шных методов работы, сопоставим им функции Arduino.
Базовые функции управления портами (см. datasheet стр. 48):
В принципе, хотя у ATtiny13 всего 1 килобайт флеша на котором сильно не разгуляешься, но даже для этой крохи частично реализован Arduino-вский фреймворк — Core13 .
В нём есть реализации для:
Подробнее про использование Core13 можно прочитать здесь: Прошивка и программирование ATtiny13 при помощи Arduino .
Но даже если использовать Arduino IDE не собираетесь — взглянуть на код всё равно стоит, чтобы проверить как работает и что скрывается за реализацией функций Arduino:
Реализация функций digitalWrite() и digitalRead() из Core13 (core13_022_arduino_1_6)
Даже здесь используется много проверок, что разумеется даёт «защиту от дурака», но и является причиной, почему при использовании Arduino-вских функций производительность кода будет ниже.
Частота работы микроконтроллера
По-умолчанию, микроконтроллер ATtiny13 работает на частоте 1.2 МГц — определяется фьюз-битами (так называются специальные конфигурационные биты, находящиеся в специальных ячейках памяти и отвечающие за параметры конфигурации всего МК).
Младший фьюз-байт lfuse = 0x6A
Старший фьюз-байт hfuse = 0xFF
Посмотреть, что означают эти параметры можно в удобном калькуляторе фьюзов для AVR — AVR Fuse Calculator .
В калькуляторе, можно увидеть, что меняя значение младшего фьюз-байта с 0x6A на 0x7A — мы получим работу микроконтроллера на частоте 9.6 МГц за счёт отключения делителя тактового сигнала на 8 (CKDIV8).
9.6 МГц / 8 = 1.2 МГц.
Посмотреть текущие значения фьзов можно при помощи avrdude, командой:
— получим два файла — low_fuse_val.hex и high_fuse_val.hex с шестнацетиричным значением соответствующих фьюзов.
Blink для ATtiny13
Теперь, зная частоту работы контроллера и базовые методы работы с портами, можем написать микроконтроллерный Hello World — а именно — Arduino-вский — Blink:
Выбираем тип сборки — Release и жмём F7 для сборки проекта (Build -> Build Solution).
Чтобы проверить работу программы — подключаем к третьей ножке (PB4) светодиод с токоограничительным резистором:
Прошивка МК ATtiny13
Остаётся прошить наш микроконтроллер.
Можно взять готовый hex-файл из папки проекта и используя avrdude, прошить МК командой:
А можно, для удобства прошивки, соответствующим образом настроить Atmel Studio.
Настройка Atmel Studio для прошивки МК ATtiny13 через avrdude
Настроить Atmel Studio для прошивки МК ATtiny13 через avrdude, очень просто .
Идём в меню
Tools -> External Tools
И добавляем нашу тулзу — avrdude:
Title:
Deploy ATtiny13
Command:
C:ArduBootavrdude.exe
Arguments:
-C C:ArduBootavrdude.conf -c ftbb -P ft0 -B 9600 -p attiny13 -U flash:w:$(TargetDir)$(TargetName).hex:i
Чтобы видеть лог процесса прошивки — нужно поставить галочку рядом с пунктом «Use Output window».
Вот и всё.
Теперь, чтобы прошить МК нужно зайти в меню Tools и выбрать наш пункт «Deploy ATtiny13».