Как настроить мк AVR на частоту 1Мгц без кварцевого резонатора? — Хабр Q&A
Если бы вы имели дело с ARM-ами, то могли бы настраивать частоту на лету. Какую захотел, такую и поставил прямо на месте через API CMSIS. Но тут у вас AVR, и частота задаётся через фьюзы. А ещё через фьюзы контроллер влёт превращается в кирпич, да так что без высоковольтного программатора (который та ещё редкость), МК обратно не оживить. И настройка частоты — это одна из тех вещей, неправильно значение которой может убить (почти) МК.
Поэтому первый момент — никогда не ставьте/снимайте галочки там, где не уверены!
Вот картинка настройки фьюзов в Atmel Studio
Когда попадёте на эту страницу, нажмите Read, чтобы удостовериться что на экране правильная инфа.
Самый нижний носит имя SUT_CKSEL, а через один над ним CKDIV8.
Для начала SUT_CKSEL — у вас должен стоять один из вариантов INTOSC_8MHZ. И нет значения, какой именно. Все эти KCK, CK и MS указывают на время задержки между подачей питания и стартом МК, нужны лишь для случая работы от полудохлых батареек без контроллера питания.
Если у вас и так значение SUT_CKSEL начинается с INTSOC_8MHZ, то не трогайте там ничего. Убить МК вы сумеете, а лучше для вашей задачи вы всё равно не сделаете.
Теперь проверьте наличие галочки CKDIV8. И вот она вам и нужна. Её нужно установить. Если она стоит, то вот эти самые 8мгц с внутреннего генератора делятся на 8. Итого — 1Мгц, то что вам и нужно!
Хотя насколько я вспоминаю, эта галка прошивается на заводе, и во фьюзы вам лезть не нужно вообще.
Если после нажатия на Read вы увидели, что SUT_CKSEL уже показывает на INTOSC_8MHZ…, а галка CKDIV8 уже стоит, то никуда больше не жмите и просто уйдите с этой страницы. Повторять не устану — любые необдуманные манипуляции здесь убъют ваш МК. Особенно опасными являются галки:
SPIEN — а вот её никак нельзя снимать, а то результат будет не менее плачевен.
Ну и выбор любого EXTXOSC_… источника тактирования приведёт к тому, что ваш МК станет кирпичом до того, как вы подключите данный источник тактирования. Выбрали керамический резонатор — бегите в ЧипДип за таковым и парочкой конденсаторов, чтобы хотябы поставить фьюзы назад!
А теперь по поводу того, что вы уже сделали:
прописав:
#define F_CPU 1000000
или
#ifndef F_CPU 1000000UL
в реальности — совершенно равноправные строчки, вы тем самым указали всяким библиотекам (вроде того-же delay.h), что МК будет работать на частоте в 1Мгц. Дело в том, что метод delay(…) или любые другие методы, завязанные на реальное время или реальные временные интервалы без этой строчки ничего о этом самом времени не знают. Они могут лишь посчитать количество тактов МК. И когда вы указываете, что вам нужно пауза а 1сек, то на основании записи о частоте (на основании F_CPU) библиотека delay.h высчитывает количество тактов, которые нужно провисеть внутри функции, чтобы получить задержку в 1с (в вашем случае, разумеется идёт речь о миллионе тактов).
Если эта настройка (F_CPU) не выполнена, или если она не отражает реальную частоту МК, то все функции ожидания и прочие будут работать несколько странно — то есть ждать либо большее либо меньшее чем запрошенное время.
Ну и вдогонку — существует 1001 различных причин, почему на дисплей выводится 0. В том числе может быть нерабочим дисплей.
И ещё — датчик ds18b20 работает по протоколу single wire, аппаратной реализации на AVR этого протокола банально не существует, да и не нужна она то особо, при условии крайне низкой скорости самого протокола. А программным библиотекам должно быть не так уж и важно, какая там частота у МК. Поэтому мне кажется очень странным ваше желание получить частоту ровно в 1Мгц для взаимодействия с данным датчиком.
Введение во встраиваемую электронику, часть 3 | avr
Продолжение переводов руководства для начинающих от SparkFun [1]. Эта часть посвящена тактированию микроконтроллера, его работе от кварцевого (или керамического) резонатора. Вы также познакомитесь с фьюзами микроконтроллера.
Предыдующая часть: Введение во встраиваемую электронику, часть 2 (как программировать микроконтроллер).
На прошлом уроке Вы запустили свой первый проект — мигание светодиодом. Это был пожалуй самый трудный и ответственный шаг. Теперь мы сделаем так, что светодиод будет мигать намного чаще!
Вы загрузили код в микроконтроллер ATmega168 (или ATmega328P) и запустили его в работу, но почему он работает? И от чего зависит его скорость работы? Любой микроконтроллер всегда работает, получая такты от специального тактового генератора (oscillator). Этот генератор можно для наглядности представить себе как ‘музыкальный ритм’, который микроконтроллер использует для выполнения своего кода — с каждым ударом ритма выполняется одна команда. Без наличия тактовой частоты микроконтроллер не знает о том, когда нужно выполнить очередную команду, и когда тактовая частота некачественная или нестабильная, выполнение идет с непредсказуемой скоростью.
Есть несколько способов подавать тактовую частоту (такты) на микроконтроллер. Микроконтроллер ATmega168 имеет для этого много настроек (все микроконтроллеры AVR имеют очень похожие настройки, которые могут весьма незначительно отличаться у разных типов AVR). Здесь приведен краткий обзор разных типов генераторов для получения тактовой частоты:
1. External RC (внешний генератор, частота которого определяется параметрами цепочки RC). Этот вариант генератора используется для чрезвычайно дешевых приложений. Подбором номинала резистора и конденсатора выбирается скорость циклов перезарядки конденсатора (постоянная времени RC-цепочки), от чего зависит полученная частота генератора. Я никогда не использовал такой способ генерации тактовой частоты.
2. Internal RC (внутренний RC-генератор, встроенный в микроконтроллер). Это очень удобный тип генератора тактов. Он имеется на большинстве современных микроконтроллеров AVR. Вы можете просто настроить (фьюзами) ATmega168 генерировать собственную тактовую частоту! Генератор и соответствующая RC-цепочка расположены на кристалле AVR. К сожалению такой генератор не очень точный.
3. External Oscillator (внешний кварцевый резонатор, от которого работает встроенный в микроконтроллер генератор). Это стандартный тип получения тактовой частоты, используемый чаще всего. Подключите кварцевый резонатор (его для краткости называют ‘кварц’) к 2 выводам генератора, и код будет выполняться с частотой кварцевого резонатора.
4. External Resonator (внешний керамический резонатор). То же самое, что и вариант с кварцевым резонатором, только здесь применяется более дешевый тип резонатора, у которого хуже допуск по частоте.
5. External Clock (подача внешней тактовой частоты). В этом варианте подается тактовая частота от внешнего генератора (например, собранного на логических элементах, или частота, сгенерированная другим микроконтроллером). Этот вариант полезен, когда нужно запустить несколько микроконтроллеров на одинаковой тактовой частоте. Я никогда не использовал этот вариант.
В действительности обычно используются только 3 из этих 5 вариантов, поэтому стоит их рассмотреть подробнее.
Примечание переводчика: на самом деле есть еще и 6 способ, синтез тактовой частоты с помощью ФАПЧ (PLL). Однако он имеет в основном профессиональное применение, и не во всех микроконтроллерах AVR имеется такая возможность.
Internal RC (внутренний калибруемый RC-генератор). Этот генератор, который сделала компания Atmel, по-настоящему хорош. По умолчанию с завода ATmega168 поставляется настроенной на частоту внутреннего генератора 1 МГц. Микроконтроллер ATmega168 (как и все AVR) может работать, выполняя 1 инструкцию на 1 машинный цикл, т.
External Oscillator (внешний кварцевый резонатор, или просто кварц). Это наиболее часто используемый тип генератора. На фотографии показан стандартный кварцевый резонатор в усеченном корпусе HC49/US.
Кварцы поставляются в различных корпусах, и бывают на разные частоты. Чаще всего встречаются частоты 20, 16, 15, 12, 10, 4 МГц. Также бывают частоты наподобие 14.7456 МГц, 9.216 МГц и 32.768 кГц — такие частоты используются потому, что они привязаны к стандартным скоростям обмена данными или предназначены для точного отсчета определенных интервалов времени. Например, если нужно достичь очень точно установленной скорости последовательного обмена данными 9600 bps, частота 9.216 МГц делится на 960, в результате получится 9600. Если использовать частоту 16 МГц, то не найдется целого делителя, чтобы получить 9600. Так что последовательный обмен данными будет очень точен при использовании частоты кварца 9.216 МГц, а при кварце 16 МГц всегда будет некоторая (хотя и незначительная) ошибка.
Внутри металлического корпуса прячется маленький кусочек кристалла кварца, размер которого и срез подобраны так, что он вибрирует на определенной частоте. Внутренний RC-генератор ATmega имеет точность +/-5%. В то же время кварц обычно имеет точность ‘+/-20ppm’. Аббревиатура ppm означает ‘parts per million’, т. е. точность +/-20 периодов на миллион! Таком образом, частота резонатора может быть в диапазоне от 15999680 до 16000320 Гц. Это эквивалентно точности +/-0.002%, так что кварц точнее внутреннего RC-генератора в 2500 раз.
Примечание: прошу прощение за то, что забиваю Вам голову скучными техническими подробностями, но это довольно важно. Понятия генератор (oscillator) и кварц (crystal) часто заменяют одно другим, что вносит путаницу. Показанный на фотографии резонатор не является собственно генератором, это просто кварцевый резонатор (кварц). Кварцы дешевы. Однако генераторы намного дороже (стоят примерно 2..4 доллара). В чем разница? Генератор требует подачи внешнего питания и сам вырабатывает импульсы выходной частоты. Эти импульсы могут использоваться для тактирования любых видов периферийных устройств и микроконтроллеров. Кварц полностью пассивный элемент, для работы которого требуется внешний драйвер (усилитель), только при их совместном использовании получается генератор. К счастью 99% микроконтроллеров имеют встроенные узлы драйвера для получения генератора, так что достаточно просто подключить снаружи дешевый кристалл к 2 внешним выводам микроконтроллера. Внутренний драйвер раскачает кварц, и микроконтроллер получит точный источник тактовой частоты.
Некоторые недостатки кварцев:
1. Кварцы немного дороже керамических резонаторов: $0.25 в сравнении с $0.10 для керамического резонатора.
2. Трудно сделать по-настоящему малогабаритный кварц (это сложнее, чем для керамического резонатора), так что для размещения кварца потребуется больше площади на печатной плате. Миниатюрные кварцы довольно дороги, и не очень широко распространены.
3. Кварцы требуют внешних нагрузочных конденсаторов, которые помогают запуску генерации. Без этих конденсаторов кварц может не заработать (хотя обычно работает нормально). Нагрузочные конденсаторы недороги, однако для них также нужна дополнительная площадь на печатной плате.
External Resonator (внешний керамический резонатор). По точности и цене керамические резонаторы занимают промежуточное положение между внутренним RC-генератором и кварцем.
Резонатор сделан из кусочка пьезокерамики, так что он может колебаться на определенной резонансной частоте. К сожалению, эта технология не позволяет достичь высокой точности, поэтому стандартный допуск по частоте для керамических резонаторов составляет +/-0.5%. Так что резонаторы в 10 раз точнее внутреннего RC-генератора, но по точности сильно проигрывают кварцам.
Резонаторы имеют тенденцию быть дешевле, чем кварцы, также их частота обычно ниже, и размеры меньше. Резонаторы удобнее использовать, потому что не нужны нагрузочные конденсаторы — они уже встроены в резонатор (по этой причине у резонатора 3 вывода). Резонаторы можно изготовить очень маленькими по размеру, и они будут занимать на печатной плате совсем мало места.
Сделайте для себя выбор. Для большинства приложений внутренний генератор будет отлично работать! Но если Вы попробуете осуществить обмен данными по последовательному каналу связи, то точность 5% обычно недостаточна (нужна точность 1-2%). Я обычно для своих проектов использую кварцы, но для по-настоящему маленьких устройств использую керамические резонаторы. Приложения для цифровой радиосвязи требуют обычно кварцев из-за жестких требований к точности частоты. Частота любого генератора будет изменяться во времени (из-за эффекта старения), и на неё будет влиять изменение температуры.
Как упоминалось ранее, ATmega168 поставляется сконфигурированной на работу от внутреннего RC-генератора на частоте 1 МГц. Но мы сможем ускорить выполнение программы. Попробуем настроить ATmega168 для работы на частоте 16 МГц от внешнего кварца.
Какие еще дополнительные изменения в работе произойдут, когда ATmega168 будет работать на повышенной тактовой частоте? Нельзя будет работать на маленьких напряжениях питания (таких как 3.3V или 2.8V). Поскольку у нас напряжение питания 5V, то это неважно. Работающий на повышенных частотах 16..20 МГц микроконтроллер будет потреблять больше тока, чем при работе на 1 МГц. Это следует учитывать при разработке Вашей системы.
Подключите кварц на 16 МГц к выводам 9 и 10 микроконтроллера, как это показано на схеме. Также подключите к ним 2 конденсатора на 22 пФ, вторые выводы конденсаторов подключите на шину GND.
Теперь нужно настроить ATmega168 на использование выводов 9 и 10 как выводов генератора, работающего от внешнего кварца. Это делается с помощью перепрограммирования фьюзов.
Прим. переводчика: если Вы загружаете код с помощью загрузчика (USB bootloader типа USBasp или UART bootloader Arduino), то в Вашей системе фьюзы уже настроены на использование внешнего кварца. Кроме того, загрузчик не позволяет менять значения фьюзов, это нужно делать с помощью внешнего ISP-программатора.
[Настроечные биты фьюзов (Fuse Bits)]
Это одна из самых трудных вещей, которые используются в AVR. Фьюзы позволяют производить самое низкоуровневое конфигурирование системы микроконтроллера. Путем установки или сброса этих бит можно полностью поменять работу и функционирование AVR. Я был много лет фанатом PIC, и конфигурационные биты PIC были очень просты. Вы просто кликали в удобное окошко Windows-программы, или могли менять биты конфигурации прямо в коде языка C. Никакой суеты, никаких проблем. Микроконтроллеры AVR в этом плане сильно отличаются, и Вы даже можете буквально повредить свой AVR, если запрограммируете биты защиты кое-как.
Два байта для настроек, которые есть в ATmega168, как раз и составляют эти ‘fuse bits’. Если Вы этого еще не сделали, загрузите полный даташит на ATmega168 (сейчас он размером в целых 448 страниц!), и сохраните его на Рабочий Стол компьютера. Если Вы никогда до этого не читали даташит, не беспокойтесь! Вовсе не нужно изучать все эти 448 страниц, нужно только рассмотреть в нем нужную Вам необходимую часть.
Перейдите в раздел даташита «8. System Clock and Clock Options» (удобно пользоваться для этого оглавлением и закладками, которые по умолчанию появляются с левой стороны открытого PDF-документа). В подразделе «8.2 Clock Sources» Вы увидите, что есть много вариантов настройки тактовой частоты для ATmega168. Давайте сначала переключим работу внутреннего RC-генератора с частоты 1 МГц на частоту 8 МГц.
Таблица 8-1. Опции для настройки тактирования микроконтроллера.
Режим тактирования | Фьюзы CKSEL3 .. CKSEL0 |
Маломощный генератор с внешним кварцем. | 1111 .. 1000 |
Обычный режим генератора с внешним кварцем. | 0111 … 0110 |
Низкочастотный генератор с внешним кварцем. | 0101 … 0100 |
Внутренний RC-генератор на 128 кГц. | 0011 |
Внутренний калиброванный RC-генератор. | 0010 |
Внешний источник тактов. | 0000 |
Зарезервировано. | 0001 |
В самом начале секции 8.6 написано: «По умолчанию Internal RC Oscillator (внутренний RC-генератор) предоставляет частоту примерно 8.0 МГц. Поскольку эта частота зависит от напряжения питания и температуры, она может быть при необходимости очень точно откалибрована пользователем. Микроконтроллер поставляется с запрограммированным фьюзом CKDIV8. Дополнительную информацию см. в разделе System Clock Prescaler».
Запрограммированный бит CKDIV8 приводит к тому, что частота внутреннего генератора 8 МГц проходит через делитель частоты на 8, и в результате получается частота 1 МГц, на которой и работает микроконтроллер. Чтобы микроконтроллер работал на частоте 8 МГц, нужно отключить делитель на 8, для чего нам нужно поменять значение фьюза CKDIV8. Фьюз CKDIV8 находится в младшем байте фьюзов, см. таблицу ниже.
Таблица 27-9. Fuse Low Byte (младший байт фьюзов).
Low Fuse Byte | № бита | Описание | Значение по умолчанию |
CKDIV8 | 7 | 0 включает деление тактов на 8. | 0 (запрограммировано) |
CKOUT | 6 | 0 включает вывод тактовой частоты на ножку порта PORTB0. | 1 (не запрограммировано) |
SUT1 | 5 | Выбор времени запуска генератора. | 1 (не запрограммировано) |
SUT0 | 4 | Выбор времени запуска генератора. | 0 (запрограммировано) |
CKSEL3 | 3 | Выбор варианта работы тактового генератора. | 0 (запрограммировано) |
CKSEL2 | 2 | Выбор варианта работы тактового генератора. | 0 (запрограммировано) |
CKSEL1 | 1 | Выбор варианта работы тактового генератора. | 1 (не запрограммировано) |
CKSEL0 | 0 | Выбор варианта работы тактового генератора. | 0 (запрограммировано) |
Значение байта фьюзов по умолчанию 0b.01100010. Новое значение байта фьюзов, в котором поменян бит CKDIV8, равно 0b.11100010.
Прим. переводчика: бит CKDIV8 находится в самом старшем бите 7 младшего байта фьюзов. Обратите внимание, что «запрограммированное» значение бита соответствует не лог. 1, а лог. 0. «Незапрограммированное» значение соответствует лог. 1. Почему так? Это вносит дополнительную путаницу в интерпретацию значения бит фьюзов. Все пошло от технологии EEPROM и FLASH — очищенная память имела всегда ячейки, заполненные единицами, и «программирование» битов ячейки соответствовало записи туда нулей. Чтобы уменьшить путаницу при вычислении бит фьюзов, старайтесь использовать шестнадцатеричные значения для байт фьюзов, и пользуйтесь для этого специальным онлайн ресурсом — калькулятором бит фьюзов [2].
С новым значением бита CKDIV8 микроконтроллер ATmega168 должен заработать от внутреннего RC-генератора на частоте 8 МГц, и мы увидим, что светодиод LED начнет мигать в 8 раз быстрее! Есть пара способов изменить фьюзы, но самый «прямой» метод сделать это через командную строку утилиты avrdude. Изменение фьюзов будет показано на примере использования программаторов от Olimex типа AVR-PG1 (подключается через последовательный порт RS-232) или AVR-PG2 (подключается через параллельный порт LPT).
# Чтобы прочитать фьюзы ATmega168 с помощью программатора AVR-PG1: avrdude -p m168 -P COM1 -c ponyser -U lfuse:r:-:h -U hfuse:r:-:h
# Чтобы прочитать фьюзы ATmega168 с помощью программатора AVR-PG2: avrdude -p m168 -P lpt1 -c stk200 -U lfuse:r:-:h -U hfuse:r:-:h
После выполнения команды чтения фьюзов утилита avrdude сообщит их значение в шестнадцатеричном виде: High fuse = 0xDF (значение старшего байта фьюзов), Low fuse = 0x62 (значение младшего байта фьюзов).
Новое значение для младшего байта фьюзов должно быть E2 (шестнадцатеричное значение). Как я сформировал новое значение для байта фьюзов? Таблица 27-9. Fuse Low Byte из даташита показывает значение по умолчанию байта фьюзов, равное 0x62, что в двоичном виде составит 0b01100010. Чтобы изменить значение фьюза CKDIV8 на противоположное состояние («незапрограммированное» состояние лог. 1), младший байт фьюзов должен изменить свой старший бит, и стать 0xE2, что в двоичном виде равно 0b11100010. Итак, чтобы переключить ATmega168 на работу от внутреннего RC-генератора на частоте 8 МГц, нужно выполнить следующую команду avrdude (конечно же, питание должен быть подключен программатор и подано питание на схему микроконтроллера):
# Запись младшего байта фьюзов ATmega168 с помощью программатора AVR-PG1: avrdude -p m168 -P COM1 -c ponyser -U lfuse:w:0xE2:m
# Запись младшего байта фьюзов ATmega168 с помощью программатора AVR-PG2: avrdude -p m168 -P lpt1 -c stk200 -U lfuse:w:0xE2:m
После перепрограммирования бита фьюзов CKDIV8 светодиод будет мигать в 8 раз быстрее. Давайте продолжим изучение настроек младшего байта фьюзов, и переключим микроконтроллер на использование внешнего кварца на 16 МГц, после чего светодиод будет мигать еще в 2 раза быстрее.
Примечание: на фотографии показана собранная схема с кварцем, однако нагрузочные конденсаторы 22 пФ для кварца тут не установлены. Имейте в виду, что это плохое решение, так как без них генератор может не запуститься.
Продолжим изучение настройки опций включения внешнего кварца. Перейдите снова в раздел даташита «8.2 Clock Sources». Таблица 8-1 Device Clocking Options Select (опции выбора тактирования) показывает разные варианты конфигурирования генератора, которые задают биты CKSEL3..CKSEL0 фьюзов.
Сейчас у нас состояние битов CKSEL3..CKSEL0 следующее:
CKSEL3 = 0
CKSEL2 = 0
CKSEL1 = 1
CKSEL0 = 0
Это значение включило внутренний RC-генератор. Чтобы включить использование кварца на 16 МГц, нужно поменять значение бита CKSEL2 на 1:
CKSEL3 = 0
CKSEL2 = 1
CKSEL1 = 1
CKSEL0 = 0
В результате получим новое значение младшего байта фьюзов 0xE6 (0b11100110). Выполните следующую команду, чтобы записать этот байт фьюзов:
# Запись младшего байта фьюзов ATmega168 с помощью программатора AVR-PG1: avrdude -p m168 -P COM1 -c ponyser -U lfuse:w:0xE6:m # Запись младшего байта фьюзов ATmega168 с помощью программатора AVR-PG2: avrdude -p m168 -P lpt1 -c stk200 -U lfuse:w:0xE6:m
После выполнения этой команды заработает внешний кварц на 16 МГц, и светодиод начнет мигать еще быстрее. Если это не произошло, проверьте подключение кварца и внешних нагрузочных конденсаторов 22 пФ. По даташиту ATmega168 может работать на частоте до 20 МГц. Можно попробовать разогнать ядро AVR на частоте 30 и даже 40 МГц, и это возможно даже заработает. Однако я никогда не буду разрабатывать реальные системы с превышением рекомендованных в спецификации параметров.
Настало время «домашней работы». Предстоит научиться пользоваться мультиметром для измерения тока (см. [3]). Поскольку ток измеряется последовательным включением прибора (напряжение измеряется параллельным подключением), то Вам нужно найти такую цепь питания на Вашем макете, которую можно разорвать, чтобы туда подключить мультиметр в режиме измерения тока. Измерьте токи потребления в следующих ситуациях:
1. Когда ATmega168 в состоянии сброса (нажата кнопка S2).
2. Когда ATmega168 работает на частоте 1 МГц от внутреннего RC-генератора.
3. Когда ATmega168 работает на частоте 8 МГц от внутреннего RC-генератора.
4. Когда ATmega168 работает на частоте 16 МГц от внешнего кварца.
[Дополнительные замечания]
Для вычисления значения фьюзов в шестнадцатеричном формате пользуйтесь удобным калькулятором [2]. Несколько раз перепроверяйте себя, перед тем как записать новое значение фьюзов, чтобы случайно не вывести AVR из строя.
Во время выполнения экспериментов проверьте степень нагрева микросхемы стабилизатора напряжения. Обычно регулятор должен быть почти холодный. Если же он очень горячий, сразу выключите питание, и проверьте Вашу breadboard на наличие коротких замыканий.
Почему регуляторы могут нагреваться? У нас используется очень простой линейный регулятор напряжения. Этот тип регулятора имеет на входе высокое напряжение (в нашем случае 9V), которое на выходе понижается до рабочего напряжения схемы (5V). Разница между этими напряжениями падает на микросхеме стабилизатора, и приводит к его нагреву из-за рассеивания мощности. Эта мощность называется мощностью потерь, и измеряется в Ваттах (Вт). Если входное напряжение стабилизатора 9V, выходное 5V, и система потребляет ток 50 mA от 5V, то мощность потерь составит:
(9 — 5) * 0.050 = 0.2 Вт или 200 мВт
200mW не приведет к большому нагреву регулятора. А что, если ток возрастет до ампера?
(9 — 5) * 1.000 = 4 Вт!
Это уже серьезный нагрев. Без радиатора микросхема регулятора станет очень горячей и может выйти из строя, если будет работать в таком режиме долгое время.
Как Вы можете заметить, потери можно снизить, если уменьшить входное напряжение стабилизатора. Почему нельзя просто использовать напряжение уровня порядка 5..6V? Дешевые линейные регуляторы 7805 требуют обязательного падения напряжения не ниже определенного уровня (это падение напряжения называют ‘drop-out voltage’). Если падение напряжения на регуляторе будет меньше допустимого, то стабилизатор перестанет выполнять свои функции, и напряжение на выходе стабилизатора упадет ниже допустимого рабочего. Для LM7805 хорошим правилом является использование минимального напряжения 1.5V, так что для получения выходного напряжения 5V на входе должно быть как минимум 6.5V. Если вы подадите входное напряжение на стабилизатор меньше чем 6.5V (например, от 4 батареек AA), то выходное напряжение 5V не гарантируется. Каждый тип регулятора напряжения может иметь свое значение минимального drop-out voltage, поэтому проверяйте даташит. Некоторые регуляторы напряжения специально разработаны для получения низкого падения напряжения (так называемые регуляторы с фичей ‘low drop-out voltage’), которое может доходить до 50mV! Наш стандартный 3.3V регулятор требует минимального входного напряжения 3.35V, чтобы получить на выходе чистые 3.3V.
Многие регуляторы имеют функцию внутреннего отключения для защиты от выхода из строя при коротком замыкании на выходе. Если Вы щелкнули выключателем и подали питание на стабилизатор, но индикационный светодиод (показывающий наличие питания) не загорелся, то возможно регулятор не может предоставить достаточно тока из-за наличия ошибок в монтаже (есть короткое замыкание, или Вы где-то перепутали полярность подключения). Скорее выключите свой макет и тщательно все проверьте.
Нормальный рабочий режим регуляторов когда они незначительно нагреты, и можно на них держать руку. Если же Вы чувствуете специфический запах и ощущаете излучение тепла от breadboard, просто выключите питание и разберитесь, что на самом деле происходит.
Дальше в экспериментах будет использоваться кварц на 16 МГц.
Следующая часть: Введение во встраиваемую электронику, часть 4 (UART и последовательный обмен данными).
[Ссылки]
1. Beginning Embedded Electronics site:sparkfun.com.
2. Engbedded Atmel AVR® Fuse Calculator site:engbedded. com.
3. Руководство: как пользоваться мультиметром.
4. Как определить тактовую частоту микроконтроллера?
5.б. Подробнее об AVR Studio 4
Следующий:
5.в.
Настройка вашего программатора для AVR Studio 4 Предыдущий:
5.а.
Использование AVR Studio 4
В этом разделе представлен краткий обзор других вкладок диалогового окна AVRISP. Редко, когда вы захотите использовать что-либо кроме вкладки Программа , но полезно знать, что другие вкладки позволяют вам делать в тех редких случаях, когда они вам понадобятся.
- Главное: настройка частоты вашего провайдера
Интерфейс AVR Studio для настройки частоты провайдера.
В разделе Режим программирования и настройки цели можно установить частоту часов, используемую при программировании целевого устройства. Эта частота должна быть меньше четверти тактовой частоты вашей цели . Важно отметить, что частоты в списке ISP Freq неверны, когда вы используете USB-программатор Orangutan. Вот как указанные частоты соотносятся с реальными частотами:
Зарегистрированная частота Фактическая частота Allowed Target Frequency 1.845 MHz 2.5 MHz > 10 MHz 460.8 kHz 1.25 MHz > 5 MHz 115.2 kHz 625 kHz > 2.5 MHz 57,6 кГц 156 кГц > 625 кГц 4,00 кГц 3,91 кГц > 16 кГц 1,21 кГц* 610 Гц* > 2,5 кГц* может использоваться для программирования предохранителей и битов блокировки.
Вы должны быть в состоянии запрограммировать любое устройство, работающее на частоте 1 МГц или выше, используя указанную настройку 57,6 кГц , которая является частотой ISP по умолчанию для USB-программатора Orangutan. Устройство с частотой 8 МГц (например, орангутанг) можно безопасно запрограммировать с помощью 460,8 кГц и устройство 20 МГц (например, орангутанг SV-xx8, орангутанг LV-168, детеныш орангутанга и робот 3pi) можно безопасно запрограммировать, используя самую быструю настройку 1,845 МГц . Две самые низкие частоты существуют в качестве подстраховки на случай, если вы случайно установите часы целевого устройства на частоту менее 1 МГц. Настройка 1,21 кГц слишком медленная для фактического программирования целевого устройства (AVR Studio истечет время ожидания ответа от вашего орангутанга), но все же позволит вам установить фьюзы. Имейте в виду, что если вы попытаетесь запрограммировать флэш-память или EEPROM с помощью 4,00 кГц , это может занять от пяти до десяти минут в зависимости от размера вашей программы, поэтому вы должны использовать эту частоту интернет-провайдера только в крайнем случае.
- Предохранители (действуйте с осторожностью!)
Щелкнув по вкладке Предохранители , программатор прочитает настройки предохранителей целевого устройства. Если ваш программатор не подключен к вашему Orangutan, когда вы выбираете эту вкладку, вы получите сообщение об ошибке. Предохранители позволяют настраивать определенные аспекты вашего микроконтроллера, такие как размер загрузочной флэш-памяти, уровень обнаружения отключения и часы, от которых он должен работать (например, внешний кристалл, внутренний генератор). Чтобы узнать больше о фьюзах и их функциях, см. техническое описание ATmega48/88/168/328P.Примечание. Вы можете навсегда отключить Орангутанга, неправильно установив предохранители. Только опытные пользователи, которые точно знают, что они делают, должны изменять эти настройки предохранителей!
- Lock Bits
Щелкнув по вкладке Lock Bits , программатор прочитает настройки битов блокировки целевого устройства. Если ваш программатор не подключен к вашему Orangutan, когда вы выбираете эту вкладку, вы получите сообщение об ошибке. Биты блокировки позволяют защитить микроконтроллер, предотвращая дальнейшую запись или чтение флэш-памяти. Биты блокировки можно сбросить в полностью разблокированное состояние, выполнив стирание чипа (т. е. щелкнув Кнопка Erase Device на вкладке Program ). Биты блокировки обычно важны только в том случае, если вы хотите выпустить продукт для других людей, не предоставляя им доступ к программе, в которой он работает, или если вы хотите немного затруднить перезапись запрограммированного чипа. - Дополнительно
Вам не нужно беспокоиться о калибровке генератора. - HW Info
На этой вкладке будут указаны версии аппаратного и программного обеспечения вашего USB-программатора Orangutan. В разделе 5.c объясняется, как настроить программатор для изменения этих номеров версий, чтобы они соответствовали ожиданиям вашей AVR Studio. - Авто
Эта вкладка позволяет автоматически выполнять набор программных действий по сценарию. Если вы собираетесь настраивать множество устройств одинаковым образом, вам может быть удобно сделать это с помощью функций вкладки Авто.
Следующий:
5.в.
Настройка вашего программатора для AVR Studio 4 Предыдущий:
5.а.
Использование AVR Studio 4
Системные часы AVR: Arduino / ATmega328p
Note
0007 . Подумайте о том, чтобы изучить домашнюю страницу курса и найти статьи на похожие темы.
Учебное пособие по Arduino Мастер-класс по встроенному уровню регистра C Arduino Master Class
Также посетите страницу выпуска , чтобы ознакомиться с библиотекой аппаратных абстракций уровня регистра и кодом для AVR .
Введение
В этой статье обсуждаются основные системы синхронизации в AVR и их распределение среди различных аппаратных периферийных устройств.
В микроконтроллерах тактовая частота обычно относится к частоте, с которой тактовый генератор микроконтроллера может генерировать импульсы, которые используются для синхронизации операций его периферийных устройств и используются в качестве индикатора скорости процессора. Он измеряется в тактовых циклах в секунду или его эквиваленте, единице СИ в герцах (Гц), но наиболее распространенные микроконтроллеры работают в МГц. ATmega328P поддерживает несколько источников синхронизации, которые распределяются через мультиплексор синхронизации и блок управления синхронизацией AVR. ATmega328P может работать на максимальной тактовой частоте 20 МГц.
Чему вы научитесь
- Какие источники тактового сигнала есть в Arduino?
- Как тактовая частота процессора контролируется в чипе AVR ATmega328p?
- Какова тактовая частота процессора ATmega328p?
Система распределения тактовой частоты ATmega328P
Система распределения тактовой частоты ATmega328PНа приведенном выше рисунке представлена система распределения тактовой частоты ATmega328P. У нас есть три основных блока: Источники и Ввод часов, Управление часами, Выход часов. У нас есть несколько источников синхронизации, которые мультиплексируются на несколько периферийных устройств через блок управления часами AVR.
Выходы блока управления синхронизацией ATmega328P
- Тактовая частота ЦП – clk ЦП
Тактовая частота ЦП направляется в части системы, связанные с работой ядра AVR. Примерами таких модулей являются файл регистров общего назначения, регистр состояния, SRAM и память данных, содержащая указатель стека. Остановка тактовой частоты процессора запрещает ядру выполнять общие операции и вычисления.
- Часы ввода/вывода – clk Ввод/вывод
Часы ввода-вывода используются большинством модулей ввода-вывода, таких как таймеры/счетчики, SPI и USART. Часы ввода/вывода также используются модулем внешних прерываний.
- Флэш-часы – clk Флэш-память
Флэш-часы управляют работой интерфейса флэш-памяти. Часы флэш-памяти обычно активны одновременно с часами процессора и отвечают за чтение и запись памяти.
- Часы асинхронного таймера – clk ASY
Часы асинхронного таймера позволяют тактировать асинхронный таймер/счетчик непосредственно от внешнего тактового генератора или внешнего тактового генератора с частотой 32 кГц. Выделенный домен часов позволяет использовать этот таймер/счетчик в качестве независимого счетчика реального времени, даже когда устройство находится в спящем режиме.
- Часы АЦП – clk АЦП
АЦП снабжен выделенным доменом часов. Это позволяет останавливать тактовые импульсы ЦП и ввода-вывода во время преобразования АЦП, чтобы уменьшить шум, создаваемый цифровыми схемами. Это дает более точные результаты преобразования АЦП.
Источники тактового сигнала ATmega328P
Устройство имеет следующие параметры источника тактового сигнала, которые можно выбрать с помощью битов Flash Fuse, как показано ниже. Тактовый сигнал от выбранного источника вводится в тактовый генератор AVR и направляется на соответствующие модули.
- Маломощный кварцевый генератор
- Полноповоротный кварцевый генератор
- Низкочастотный кварцевый генератор
- 7 Внутренний 128 кГц генератор 9 RC0106
- Калиброванный внутренний RC-генератор
- Внешний тактовый генератор
Устройство поставляется с внутренним RC-генератором на частоте 8,0 МГц и с запрограммированным предохранителем CKDIV8, что обеспечивает системную тактовую частоту 1,0 МГц. Время запуска установлено на максимальное значение, а период тайм-аута включен. (CKSEL = «0010», SUT = «10», CKDIV8 = «0»). Настройка по умолчанию гарантирует, что все пользователи могут установить желаемую настройку источника тактового сигнала, используя любой доступный программный интерфейс.
Маломощный кварцевый генератор
Контакты XTAL1 и XTAL2 являются соответственно входом и выходом инвертирующего усилителя, который можно настроить для использования в качестве встроенного генератора. Он поддерживает кристалл кварца или керамический резонатор.
Соединения кварцевого генератора ATmega328PЭтот кварцевый генератор представляет собой маломощный генератор с уменьшенным размахом напряжения на выходе XTAL2. Он обеспечивает наименьшее энергопотребление, но не может управлять другими тактовыми входами и может быть более восприимчив к шуму в шумной среде.
Если частота кварца превышает спецификацию устройства (зависит от VCC), можно запрограммировать предохранитель CKDIV8, чтобы разделить внутреннюю частоту на 8. Необходимо убедиться, что результирующий разделенный тактовый сигнал соответствует спецификации частоты устройства. .
Генератор малой мощности может работать в трех различных режимах, каждый из которых оптимизирован для определенного диапазона частот. Режим работы выбирается предохранителями CKSEL3…1.
Диапазон частот (МГц) | Рекомендуемое диапазон для конденсаторов C1 и C2 (PF) | CKSEL3… 1 |
---|---|---|
0,4 - 0, | ||
0,4 - 0, | ||
0,4 - 0, | ||
0,4 - 0, | ||
0,4 - 0, | ||
. | 12 – 22 | 101 |
3. 0 – 8.0 | 12 – 22 | 110 |
8.0 – 16.0 | 12 – 22 | 111 |
Full Swing Crystal Oscillator
Контакты XTAL1 и XTAL2 являются соответственно входом и выходом инвертирующего усилителя, который можно настроить для использования в качестве встроенного генератора. Он поддерживает кристалл кварца или керамический резонатор.
Этот кварцевый осциллятор представляет собой осциллятор с полным размахом, с размахом от рельса к рельсу на выходе XTAL2. Это полезно для управления другими тактовыми входами и в шумных условиях. Потребляемый ток выше, чем у «Кварцевого генератора малой мощности». Кварцевый осциллятор Full Swing будет работать только при напряжении VCC = 2,7–5,5 вольт.
Соединения кварцевого генератора ATmega328PЕсли частота кварца превышает спецификацию устройства (зависит от VCC), можно запрограммировать предохранитель CKDIV8, чтобы разделить внутреннюю частоту на 8. Необходимо убедиться, что результирующая разделенная тактовая частота соответствует частоте. спецификация устройства.
C1 и C2 всегда должны быть равны как для кристаллов, так и для резонаторов. Оптимальное значение конденсаторов зависит от используемого кристалла или резонатора, величины паразитной емкости и электромагнитного шума окружающей среды.
Frequency Range (MHz) | Recommended Range for Capacitors C1 and C2 (pF) | CKSEL3…1 |
---|---|---|
0.4 – 20.0 | 12 – 22 | 011 |
Низкочастотный кварцевый генератор
Низкочастотный кварцевый генератор оптимизирован для использования с часовым кристаллом с частотой 32,768 кГц. Соединения кварцевого генератора ATmega328P
Емкость (C = C e + C i ), необходимая для каждого вывода TOSC, может быть рассчитана следующим образом: дополнительные внешние конденсаторы = C2 = C1
Частотный диапазон | S Время пирогая от Power-Down и Power-Save | CKSEL3… 1 |
---|---|---|
32. 768KHZ | ||
32.768KHZHZ | ||
32.768KHZ | ||
32.768KHZ | ||
32.768KHZ | ||
32K CK | 0101 |
Калиброванный внутренний RC-генератор
По умолчанию внутренний RC-генератор обеспечивает тактовую частоту приблизительно 8,0 МГц. Хотя эти часы зависят от напряжения и температуры, пользователь может очень точно откалибровать их. Эти часы могут быть выбраны в качестве системных часов путем программирования фьюзов CKSEL. Устройство поставляется с выбранной опцией.
Если выбрано, будет работать без внешних компонентов. Во время сброса аппаратное обеспечение загружает предварительно запрограммированное значение калибровки в регистр OSCCAL и тем самым автоматически калибрует RC-генератор. Изменив регистр OSCCAL из SW, можно получить более высокую точность калибровки, чем при использовании заводской калибровки.
Диапазон частот (МГц) | CKSEL3…1 |
---|---|
7,9 – 8,30017 | 0010 |
Внутренний генератор 128 кГц
Внутренний генератор 128 кГц представляет собой маломощный генератор, обеспечивающий тактовую частоту 128 кГц. Номинальная частота составляет 3 В и 25 градусов Цельсия. Эти часы можно выбрать в качестве системных часов, запрограммировав предохранители CKSEL на «11». Генератор 128 кГц является источником тактового сигнала с очень низким энергопотреблением и не рассчитан на высокую точность.
Частота | CKSEL3…1 |
---|---|
128 кГц | 0011 |
Внешние часы
ATmega328P External Clock Drive ConfigurationFrequency | CKSEL3…1 |
---|---|
0 – 20MHz | 0000 |
When applying an external clock, it is required to avoid sudden changes в применяемой тактовой частоте для обеспечения стабильной работы MCU. Изменение частоты более чем на 2% от одного тактового цикла к другому может привести к непредсказуемому поведению. Если требуются изменения более чем на 2%, убедитесь, что MCU остается в состоянии сброса во время изменений.
Обратите внимание, что предварительный делитель системных часов можно использовать для реализации изменений внутренней тактовой частоты во время выполнения, при этом обеспечивая стабильную работу.
Буфер вывода часов ATmega328P
ATmega328P может выводить системные часы на контакт CLKO. Чтобы активировать выход, необходимо запрограммировать предохранитель CKOUT. Этот режим подходит, когда часы микросхемы используются для управления другими схемами в системе. Часы также будут выводиться во время сброса, а нормальная работа вывода ввода-вывода будет отменена, когда запрограммирован предохранитель. Любой источник синхронизации, включая внутренний RC-генератор, может быть выбран, когда часы выводятся на CLKO. Если используется предварительный делитель системных часов, выводятся разделенные системные часы.
Генератор таймера/счетчика ATmega328P
ATmega328P использует один и тот же кварцевый генератор для низкочастотных генераторов и генераторов таймера/счетчика. ATmega328P использует выводы генератора таймера/счетчика (TOSC1 и TOSC2) совместно с XTAL1 и XTAL2. При использовании генератора таймера/счетчика системные часы должны в четыре раза превышать частоту генератора. Из-за этого и совместного использования выводов генератор таймера/счетчика можно использовать только в том случае, если в качестве источника системных тактовых импульсов выбран калиброванный внутренний RC-генератор
. Применение внешнего источника синхронизации к TOSC1 может быть выполнено, если EXTCLK в регистре ASSR записан в логическую единицу.
Предварительный делитель системных часов ATmega328P
ATmega328P имеет предварительный делитель системных часов, и системные часы можно разделить, настроив «CLKPR — Регистр предварительного масштаба часов». Эту функцию можно использовать для снижения тактовой частоты системы и энергопотребления, когда требования к вычислительной мощности невелики. Это можно использовать со всеми параметрами источника синхронизации, и это повлияет на тактовую частоту ЦП и всех синхронных периферийных устройств. clkI/O, clkADC, clkCPU и clkFLASH делятся на коэффициент.
CLKPS3 | CLKPS2 | CLKPS1 | CLKPS0 | Clock Division Factor |
---|---|---|---|---|
0 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 1 | 2 |
0 | 017 | |||
0 | 0 | |||
0 | 017||||
0 | ||||
. |