Как изменить тактовую частоту arduino

При написании публикации про ATtiny85 я обратил внимание на то, как реализовано изменение частоты микроконтроллера: достаточно выбрать нужное значение тактовой частоты в меню IDE Ардуино и затем выполнить команду "Записать загрузчик". А почему бы не сделать так же для Ардуино? Чтобы можно было простыми действиями настроить ее на тактирование либо от внешнего резонатора на 16МГц, либо от внутреннего RC-генератора на 8МГц. Кстати при тактировании от внутреннего генератора микроконтроллер можно извлечь из Ардуино, тем самым значительно снизить энергопотребление. В общем, тема весьма интересная, подробности под катом.

Arduino ATmega328P тактирование от внутреннего RC-генератора

При написании публикации про ATtiny85 я обратил внимание на то, как реализовано изменение частоты микроконтроллера: достаточно выбрать нужное значение тактовой частоты в меню IDE Ардуино и затем выполнить команду «Записать загрузчик». А почему бы не сделать так же для Ардуино? Чтобы можно было простыми действиями настроить ее на тактирование либо от внешнего резонатора на 16МГц, либо от внутреннего RC-генератора на 8МГц. Кстати при тактировании от внутреннего генератора микроконтроллер можно извлечь из Ардуино, тем самым значительно снизить энергопотребление. В общем, тема весьма интересная, подробности под катом.

Содержание

Что нужно знать о тактировании AVR микроконтроллеров

AVR микроконтроллеры способны работать с различными источниками тактового сигнала. Это может быть внешний резонатор, RC-цепочка (внутренняя или внешняя), а так же внешний сигнал синхронизации. Источник тактирования выбирается исходя из требований к устройству. Так для построения точных микроконтроллерных систем следует использовать внешние кварцевые или керамические резонаторы, так как они обладают высокой стабильностью и не чувствительны к изменениям температуры. В этом плане им уступают генераторы на основе времязадающей RC-цепочки: они менее стабильны и чувствительны к изменениям температуры и напряжения. С другой стороны внутренний RC-генератор присутствует практически во всех AVR микроконтроллерах и его использование будет наиболее простым и экономичным решением в системах, не предъявляющих высоких требований к стабильности тактового сигнала.

Настройка микроконтроллера на работу с тем или иным источником тактового сигнала осуществляется установкой конфигурационных битов (фьюзов) при помощи программатора. Применительно к нашей ситуации установка фьюзов происходит при выполнении команды «Записать загрузчик» из меню IDE Ардуино, значения фьюзов берутся из файла boards.txt. Он же отвечает за добавление новых пунктов в меню Инструменты. Поэтому доработка IDE Ардуино для добавления в нее меню выбора частоты начинается с редактирования файла boards.txt

Редактирование файла boards.txt

Перейдите в каталог Arduino_dirhardwarearduinoavr, где Arduino_dir — это каталог, в который установлена среда разработки Ардуино. У меня этот путь выглядит так: d:Arduinoarduino-1.6.12hardwarearduinoavr. Перед внесением изменений в файл boards.txt я рекомендую сделать его резервную копию. Теперь открываем файл boards.txt в текстовом редакторе (подойдет notepad++ или другой, поддерживающий кодировку UTF-8, чтобы не было проблем с отображением русских букв в IDE Ардуино)  и добавляем в него строку menu.clock=Тактирование

Редактирование boards.txt Ардуино

Затем находим секцию для Ардуино Уно (я опишу порядок действий применительно к Ардуино Уно, но таким же образом можно скорректировать секции других плат с поправкой на микроконтроллер):

Редактирование boards.txt Ардуино

Здесь нужно добавить наше подменю для выбора источника тактирования и частоты. Для этого сперва удалим строки, определяющие:

  1. скорость загрузки — uno.upload.speed;
  2. значения фьюзов — uno.bootloader.low_fuses, .high_fuses, .extended_fuses;
  3. имя файла загрузчика — uno.bootloader.file;
  4. частоту микроконтроллера — uno.build.f_cpu.

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

uno.menu.clock.external16=Внешний резонатор 16МГц
uno.menu.clock.external16.upload.speed=115200
uno.menu.clock.external16.bootloader.low_fuses=0xFF
uno.menu.clock.external16.bootloader.high_fuses=0xDE
uno.menu.clock.external16.bootloader.extended_fuses=0xFF
uno.menu.clock.external16.bootloader.file=optiboot/optiboot_atmega328.hex
uno.menu.clock.external16.build.f_cpu=16000000L


uno.menu.clock.internal8=Внутренний RC-генератор 8МГц
uno.menu.clock.internal8.upload.speed=57600
uno.menu.clock.internal8.bootloader.low_fuses=0xE2
uno.menu.clock.internal8.bootloader.high_fuses=0xDE
uno.menu.clock.internal8.bootloader.extended_fuses=0xFF
uno.menu.clock.internal8.bootloader.file=optiboot/optiboot_atmega328_8.hex
uno.menu.clock.internal8.build.f_cpu=8000000L


uno.menu.clock.internal1=Внутренний RC-генератор 1МГц
uno.menu.clock.internal1.upload.speed=4800
uno.menu.clock.internal1.bootloader.low_fuses=0x62
uno.menu.clock.internal1.bootloader.high_fuses=0xDE
uno.menu.clock.internal1.bootloader.extended_fuses=0xFF
uno.menu.clock.internal1.bootloader.file=optiboot/optiboot_atmega328_1.hex
uno.menu.clock.internal1.build.f_cpu=1000000L

Для наглядности я приведу скриншот моего файла boards.txt, каким он был и каким стал после выполнения описанных изменений:

Редактирование boards.txt Ардуино

Таким образом мы описали меню из трех пунктов, для каждого из них указали скорость загрузки скетчей, значения фьюзов, имя файла загрузчика (об этом чуть позже) и частоту микроконтроллера. При помощи онлайн калькулятора вы можете расшифровать приведенные значения фьюзов и увидеть, как происходит выбор источника тактирования. И что для получения тактовой частоты 1МГц при работе от внутреннего RC-генератора используется деление частоты на 8 (фьюз CKDIV8).

Сохраните файл в кодировке UTF-8 без BOM и запустите IDE. Если все сделано правильно, то при выборе платы Arduino Uno вам станет доступно меню Инструменты->Тактирование. Но этих изменений пока еще мало. Если сейчас выбрать в меню, например, Внутренний RC-генератор 8МГц и выполнить запись загрузчика, то новые значения фьюзов, конечно, запишутся в микроконтроллер и он начнет работать с внутренним RC-генератором. Но мы потеряем возможность загружать в Ардуино новые скетчи, потому что записанный в нее загрузчик рассчитан на частоту 16МГц. Выход — скомпилировать загрузчик для работы на частотах 8МГц и 1МГц. Если у вас нет желания заморачиваться с компиляцией загрузчика, то можете скачать уже скомпилированные файлы отсюда, поместить их в каталог Arduino_dirhardwarearduinoavrbootloadersoptiboot и перейти к пункту Изменение частоты и источника тактирования Ардуино. А кому интересно могут скомпилировать их самостоятельно. О том как это сделать описано далее.

Что такое Optiboot

Optiboot — это загрузчик для AVR микроконтроллеров, созданный Питером Найтом (Peter Knight). В его основу легли труды нескольких разработчиков и групп (Jason P. Kyle, Arduino group, Spiff , AVR-Libc group, Ladyada), впоследствии он значительно развился. Загрузчик получился настолько удачным, что компания-разработчик Ардуино стала использовать его в своей плате Ардуино Уно. С недавнего времени Optiboot является официальным загрузчиком и для других плат на базе ATmega328p (Нано, Мини). По сравнению с использовавшимся в них старым загрузчиком Optiboot обладает рядом преимуществ:

  • занимает всего 512 байт, освобождая 1,5кб для программ пользователя;
  • значительно быстрее выполняет загрузку скетчей;
  • поддерживает альтернативные серийные порты, скорости загрузки и частоты микроконтроллера.

С 2011 года поддержкой Optiboot занимается  Билл Вестфилд (Bill Westfield). Это самостоятельный проект, не финансируемый какими-либо организациями.

Компиляция Optiboot для работы на частотах 8МГц и 1МГц

Исходные файлы Optiboot входят в состав IDE Ардуино и находятся в каталоге Arduino_dirhardwarearduinoavrbootloadersoptiboot. Там же расположен батник omake.bat для сборки загрузчика. Вот только для его сборки в составе IDE Ардуино (начиная с версий 1.5.x) не хватает утилиты make.exe. Наиболее простое решение — это скопировать ее из старой версии. Для этого:

  1. скачайте IDE версии 1.0.6;
  2. распакуйте архив и перейдите каталог arduino-1.0.6hardware;
  3. скопируйте или переместите каталог tools в Arduino_dirhardwarearduino вашей рабочей IDE;
  4. IDE 1.0.6 больше не нужна, ее можно удалить.

Перейдите в каталог optiboot и откройте файл Makefile в Блокноте. В нем нужно найти секцию для atmega328:

Компиляция optiboot для Ардуино

Между ней и началом следующей секции для Sanguino вставляем код:

atmega328_8: TARGET = atmega328

atmega328_8: MCU_TARGET = atmega328p

atmega328_8: CFLAGS += ‘-DLED_START_FLASHES=3’ ‘-DBAUD_RATE=57600’

atmega328_8: AVR_FREQ = 8000000L

atmega328_8: LDSECTIONS  = -Wl,—section-start=.text=0x7e00 -Wl,—section-start=.version=0x7ffe

atmega328_8: $(PROGRAM)_atmega328_8.hex

atmega328_8: $(PROGRAM)_atmega328_8.lst

atmega328_1: TARGET = atmega328

atmega328_1: MCU_TARGET = atmega328p

atmega328_1: CFLAGS += ‘-DLED_START_FLASHES=3’ ‘-DBAUD_RATE=4800’

atmega328_1: AVR_FREQ = 1000000L

atmega328_1: LDSECTIONS  = -Wl,—section-start=.text=0x7e00 -Wl,—section-start=.version=0x7ffe

atmega328_1: $(PROGRAM)_atmega328_1.hex

atmega328_1: $(PROGRAM)_atmega328_1.lst

Это копии секции atmega328. От исходной они отличаются частотой микроконтроллера и скоростью загрузки скетчей. Эти значения соответствуют указанным нами ранее в файле boards.txt. Думаю, можно указать и большую скорость загрузки, но я не экспериментировал с этим. Однозначно, при слишком высокой скорости ошибки будут неизбежны, поэтому с уменьшением частоты микроконтроллера я уменьшаю и скорость загрузки.

Теперь нужно скомпилировать загрузчик для работы на пониженной частоте. Для этого, находясь в каталоге Arduino_dirhardwarearduinoavrbootloadersoptiboot, запустите командную строку, введите и выполните по очереди команды:
omake.bat atmega328_8
omake.bat atmega328_1

Компиляция optiboot для Ардуино

Загрузчики для работы на частоте 8МГц и 1МГц готовы! Теперь нужно удалить папку tools, которую мы позаимствовали из IDE Ардуино 1.0.6. Если этого не сделать, то среда не запустится. Связано это с тем, что содержимое Arduino_dirhardwarearduino должно иметь определенную структуру и папке tools здесь не место.

Изменение частоты и источника тактирования Ардуино

Для изменения частоты и источника тактирования необходимо записать в Ардуино новый загрузчик. Для выполнения этой процедуры нужен программатор. Если у вас его нет, то можете использовать в качестве программатора другую плату Ардуино, в статье Arduino as ISP — программатор из Ардуино эта тема подробно расписана. Я для записи загрузчика воспользуюсь программатором USBasp.

Итак, запускаем среду разработки Ардуино, выбираем в списке плат Arduino/Genuino Uno, в меню Инструменты->Тактирование выбираем значение Внутренний RC-генератор 8МГц. Подключаем программатор к компьютеру, выставляем соответствующее значение в меню Инструменты->Программатор. Записываем загрузчик. После этого отключаем программатор, подключаем Ардуино напрямую к компьютеру и в меню Инструменты->Программатор выставляем стандартное значение — AVRISP mkII. Теперь можете проверить работу платы, загрузив в нее скетч Blink из стандартных примеров. Когда решите снова изменить частоту, нужно будет повторно выполнить запись загрузчика, выбрав соответствующее значение в меню Тактирование.

Если при записи загрузчика на 1МГц через USBasp у вас возникнет следующая ошибка:

USBasp ошибка при записи загрузчика

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

Теперь было бы интересно вынуть ATmega328P из Ардуино и измерить его энергопотребление при работе на 8МГц / 1МГц, а также в режиме PowerDown. Но это я оставлю для будущей публикации — Энергопотребление ATmega328P при тактировании от внутреннего RC-генератора

Введение Для многих из нас мы начали программировать на настольных компьютерах и серверах, которые, казалось, обладали бесконечной памятью и вычислительной мощностью (ну, я полагаю, в зависимости от того, когда вы начали программировать). Не было особых причин для оптимизации вашего кода, поскольку в любом случае вы вряд ли превысите ограничения системы. А потом, когда вы занялись встраиваемыми системами, было грубое пробуждение. Переход от такой мощной системы к гораздо меньшей и менее способной, такой как Arduino [/ arduino-separated /], был

Вступление

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

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

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

В этой статье я сосредоточусь на Arduino Uno, поскольку это, кажется,
самая распространенная плата, хотя большая часть этой статьи также
должна относиться и к другим платам.

Почему Arduinos медленные

Тактовая частота

Прежде всего, вы работаете так же быстро, как ваши часы (без учета
многоядерных процессоров), которые Arduino Uno
по умолчанию использует
кристалл с частотой 16 МГц. Это означает, что микроконтроллер ATmega
может выполнять до 16 миллионов инструкций в секунду. 16 миллионов
инструкций в секунду могут показаться большим количеством (и так оно и
есть), но если учесть, что все, что нужно Arduino для выполнения даже
простых операций, на самом деле не так уж и много. Для многих проектов
тактовые циклы распределяются между такими вещами, как вычисления, связь
I2C, чтение и запись на контакты и регистры, а также многие другие
операции.

Даже тогда, казалось бы, простые команды могут занять довольно много
тактов, например, установка цифрового вывода на высокий уровень. Это
одна из простейших операций ввода-вывода, которые вы можете выполнить на
Arduino, но на самом деле она занимает очень много времени (более 50
тактов!) Из-за количества кода, используемого в digitalWrite() ,
который я рассмотрю в следующий раздел. Таким образом, более быстрые
часы позволят вам выполнять инструкции в более быстром темпе.

Проверки безопасности и валидация

Так почему же Arduinos медленные, если не считать тактовой частоты? Что
ж, в основном это связано с некоторыми стандартными вызовами методов и
объектами, которые мы используем в нашем коде. Вот лишь несколько
основных виновников:

  • digitalWrite()
  • digitalRead()
  • pinMode()

Многие из этих методов страдают теми же недостатками, поэтому давайте
взглянем на код одного из наиболее часто используемых методов,
digitalWrite() :

 void digitalWrite(uint8_t pin, uint8_t val) 
 { 
 uint8_t timer = digitalPinToTimer(pin); 
 uint8_t bit = digitalPinToBitMask(pin); 
 uint8_t port = digitalPinToPort(pin); 
 volatile uint8_t *out; 
 
 if (port == NOT_A_PIN) return; 
 
 // If the pin that support PWM output, we need to turn it off 
 // before doing a digital write. 
 if (timer != NOT_ON_TIMER) turnOffPWM(timer); 
 
 out = portOutputRegister(port); 
 
 uint8_t oldSREG = SREG; 
 cli(); 
 
 if (val == LOW) { 
 *out &= ~bit; 
 } else { 
 *out |= bit; 
 } 
 
 SREG = oldSREG; 
 } 

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

Первые несколько строк используют pin чтобы найти соответствующий
timer , bit и port для данного вывода. На port — это просто
регистр с отображением памяти, который управляет несколькими выводами.
Чтобы включить или выключить только тот вывод, который нам нужен, нам
нужно определить, какому биту регистра соответствует наш вывод, что и
делает функция digitalPinToBitMask()

Найдя timer , bit и port , мы проверяем, действительно ли это
правильный контакт. Эта строка не требуется для функции digitalWrite()
для выполнения своей работы, но она действует как подстраховка для более
неопытных программистов (и даже для опытных). Мы бы очень не хотели,
чтобы запись в неправильный адрес памяти приводила к повреждению
программы.

if (timer != NOT_ON_TIMER) ... предназначена для того, чтобы
убедиться, что мы завершили любое предыдущее использование вывода ШИМ
перед записью «постоянного» высокого или низкого уровня. Многие выводы
на Arduinos также могут использоваться для вывода ШИМ, для чего
требуется таймер для работы, отсчитывая рабочие циклы. При необходимости
эта строка отключит ШИМ. И снова, чтобы убедиться, что мы не видим
странного поведения, это проверка безопасности, призванная помочь
пользователю.

И, наконец, в последних нескольких строках мы фактически устанавливаем
заданное значение для данного порта.

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

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

Вы также должны знать, что вызовы методов не всегда медленные из-за
количества выполняемого кода, но способствующий фактор может быть из-за
физических ограничений устройства. Например, analogRead() занимает
около 100 микросекунд на вызов из-за предоставляемого разрешения и
тактовой частоты. Более низкое разрешение АЦП уменьшит время каждого
вызова. Однако даже тогда, хотя аппаратное обеспечение в конечном итоге
является здесь ограничивающим фактором, код Arduino консервативно
устанавливает максимальную частоту дискретизации АЦП только на 9600 Гц
(в то время как поддерживает около 77 кГц). Итак, хотя Arduinos намного
медленнее, чем они должны быть, это не всегда из-за выбора дизайна и
компромиссов. Существует хорошее обсуждение об этом
здесь , и
документация здесь .

Как ускорить Arduino

Чтобы было ясно, мы на самом деле не делаем Arduino быстрее , скорее,
мы делаем код более эффективным . Я указываю на это различие, потому
что использование этих уловок не даст нам более быстрых часов (хотя мы
можем ускорить их, о чем я коснусь позже), они просто будут выполнять
меньше кода. Это важное различие, потому что более быстрые часы дают нам
другие преимущества, такие как наличие более точных таймеров, более
быстрое общение и т. Д.

Также имейте в виду, что, используя приведенный ниже код, вы делаете
некоторые компромиссы. Программисты, разработавшие Arduino, были не
просто паршивыми кодировщиками, которые не могли писать быстрый код, они
сознательно приняли решение добавить проверки и проверки безопасности к
таким методам, как digitalWrite() поскольку это приносит пользу их
целевым клиентам. Просто убедитесь, что вы понимаете, что может (и
будет ) пойти не так, как надо.

Во всяком случае, перейдем к коду.

Цифровая запись

Сейчас я не собираюсь показывать вам, как ускорить каждый метод, но
многие из тех же концепций, pinMode() . Минимальный объем кода,
который вам нужно записать на пин, составляет:

 #define CLR(x,y) (x&=(~(1<<y))) 
 #define SET(x,y) (x|=(1<<y)) 

Ага, вот и все.

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

 SET(PORTB, 0); 

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

Макрос дает нам значительный импульс, используя
примерно
2 цикла (частота 8 МГц), тогда как digitalWrite() использует
колоссальные 56 циклов (частота 285 кГц).

Серийный

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

Последовательная связь обычно используется для отправки отладочной
информации или информации о состоянии в настольную среду IDE, что
означает, что у вас, вероятно, есть Serial.println() во всем вашем
коде. Об этих операторах легко забыть после разработки, поэтому, если вы
ищете повышения скорости и больше не нуждаетесь в отладке, попробуйте
удалить все println() и полностью удалить Serial из кода. Просто
инициализировав его (и даже не используя Serial.println() ), вы
тратите много циклов на прерывания TX и RX. В одном
случае , это было
измерено , что только с Serial включенным замедлились в
digitalWrite() š примерно на 18%. Это много потраченных впустую циклов
из-за мертвого кода.

Тактовая частота

Хотя я в основном сосредоточился на улучшениях программного обеспечения,
которые вы можете внести, не забывайте, что всегда есть «простое»
улучшение — ускорение часов. Я говорю это так, потому что на самом деле
это не простое улучшение plug-and-play. Чтобы ускорить часы на Arduino,
вам необходимо вставить новый кристалл в плату, что может оказаться
сложным, а может и нет, в зависимости от ваших навыков пайки.

После того, как вы установили новый кварцевый генератор, вам все равно
нужно обновить загрузчик, чтобы отразить изменения, иначе он не сможет
получать код через последовательный порт. И, наконец, вам нужно изменить
F_CPU на правильную тактовую частоту. Например, если вы увеличили
частоту до 20 МГц (самые быстрые часы, на которые рассчитана ATmega),
вам необходимо изменить несколько файлов в среде Arduino IDE:

  • В preferences.txt измените
    • из: build.f_cpu=16000000L
    • кому: build.f_cpu=20000000L
  • В makefile файле измените
    • из: F_CPU = 16000000
    • к: F_CPU = 20000000

Согласно этой
публикации
, ATmega328 можно разогнать до 30 МГц, но я не рекомендую это делать =)

Заключение

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

Есть ли какие-нибудь собственные оптимизации, которыми вы хотели бы
поделиться? Дайте нам знать об этом в комментариях!

Не забудьте подписаться на нашу рассылку, чтобы получать наши лучшие
статьи прямо в свой почтовый ящик!

Узнаем как повысить эффективность наших проектов Arduino за счет снижения энергопотребления разными способами.

Содержание

  • Вступление
  • Библиотеки Arduino для низкого энергопотребления
  • Режим глубокого сна
  • Замедление тактовой частоты Arduino
  • Замена или пренебрежение энергопотреблением компонентов
  • Снижение напряжения питания Arduino
  • Делаем собственную Arduino
  • Заключение

Вступление

Arduino Uno и Pro Mini не работают эффективно в ситуациях, когда с ними приходится работать с использованием батареек. В таких ситуациях каждый миллиампер тока имеет значение. Arduino Uno потребляет минимум 15 мА тока, что звучит не так плохо, но в определенных ситуациях эта цифра быстро возрастает.

Arduino Uno — это плата, построенная с несколькими различными схемами, включая USB-последовательный преобразователь, регуляторы, индикаторы, процессоры, цепь защиты от короткого замыкания, цепи управления повреждением и т.д. Она потребляет больше энергии, чем необходимо.

Далее мы рассмотрим различные способы снижения энергопотребления Arduino путем изменения аппаратного обеспечения или использования программного кода.

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

Давайте посмотрим на две таких библиотеки:

  1. External Wake-Up (внешнее пробуждение): с помощью этой библиотеки ваша Arduino выйдет из спящего режима при нажатии внешней кнопки. Вы можете использовать такой код, чтобы разбудить Arduino с помощью датчика.
  2. Timed Wake-up (запланированное пробуждение): пробуждает Arduino после заданного количества времени в режиме сна.

Вышеуказанные режимы ожидания снижают энергопотребление Arduino Uno в режиме ожидания. Однако они почти бесполезны, потому что все, кроме MCU на плате, все еще активно и продолжает потреблять энергию. Мы протестировали этот метод и не ушли ниже 50 мА, минимального числа, которое можно получить в этом режиме.

Режим глубокого сна

Режим глубокого сна (Deep Sleep Mode) помогает Arduino потреблять гораздо меньше энергии, чем режим сна. Он переводит MCU в глубокий спящий режим и все, кроме периферийного RTC, останавливается. ЦП можно пробудить с помощью RTC или любого прерывания в коде.

Ток, потребляемый Pro Mini в глубоком сне, может падать от 25mA до 0.57mA.

Замедление тактовой частоты Arduino

Тактовая частота платы Arduino определяет, сколько операций она может выполнять в секунду. Большинство плат Arduino работают с тактовой частотой 16 МГц. Уменьшение этого значения до 8 МГц может снизить необходимый ток с 12 мА до 8,5 мА. В долгосрочной перспективе метод может отключить большую часть энергопотребления и продлить срок службы батареи.

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

Важно! Изменение тактовой частоты может привести к проблемам с загрузчиком и повреждению Arduino.

Пример кода замедления частоты

#include <avr/power.h>

void setup() {
  if(F_CPU == 8000000) clock_prescale_set(clock_div_2);
  if(F_CPU == 4000000) clock_prescale_set(clock_div_4);
  if(F_CPU == 2000000) clock_prescale_set(clock_div_8);
  if(F_CPU == 1000000) clock_prescale_set(clock_div_16);
}

Замена или пренебрежение энергопотреблением компонентов

Встроенный регулятор напряжения ограничивает входное напряжение входного разъема постоянного тока. Регулятор не очень эффективен и около 58% входной энергии теряется в виде тепла или используется для внутреннего питания. Лучше заменить этот компонент более эффективными понижающими преобразователями постоянного тока DC-DC. Некоторые ступенчатые преобразователи постоянного тока или понижающие преобразователи могут достигать 92%.

Arduino Uno использует небольшой линейный регулятор напряжения в TO223 SMD пакете. Чипсет Traco TSRN1 — отличный вариант для пакета, доступного на Arduino Uno.

Питание 5V регулируемого напряжения через 7805 IC извне является гораздо более эффективным способом. Это лучший вариант для удаления встроенного регулятора для снижения энергопотребления. Без регулятора напряжения сбрасывается ток около 2,7 мА.

Индикатор питания (светодиод) постоянно горит, что указывает на то, что плата получает достаточное количество питания. Снятие светодиода питания может снизить ток в 2,85 мА в нормальном режиме. В спящем режиме без светодиода энергопотребление Arduino UNO составляет всего 30,8 мкА.

Снижение напряжения питания Arduino

Один из очень простых способов снизить энергопотребление платы Arduino — снизить напряжение питания. Arduino может работать при низком напряжении 3,3 В и при падении напряжения питания с 5 В до 3,3 В потребляемый ток падает с 4 мА до менее 1 мА.

При напряжении 3,3 В рекомендуемая максимальная частота составляет около 13 МГц в соответствии с таблицей ATmega 328. Таким образом, слишком сильное снижение напряжения без снижения тактовой частоты приводит к странному поведению микроконтроллера. Тактовая частота 8 МГц — оптимальный вариант.

Делаем собственную Arduino

Если внесение этих изменений в ваш Arduino или работа с компонентами SMD вас не устраивает или вы боитесь повредить плату, тогда лучшим решением может стать создание собственной платы Arduino. Отсутствие энергозатратных компонентов и только Микроконтроллер (MCU) для выполнения задачи — наша главная цель.

Схема построена вокруг микросхемы ATmega. Для этого вы можете использовать ATmega 8 или ATmega328 или любой пустой программируемый микроконтроллер, а также кристалл и кнопку сброса. Для удобства можно добавить регулятор напряжения 7805.

Как мы используем эту схему:

  1. Подготовьте схему на универсальной плате или макете, но используйте 40-контактный разъем IC.
  2. Загрузите необходимый код на плату Arduino.
  3. Выньте микросхему из Arduino и подключите ее к вашей схеме. Все готово!

Этот способ прост, и для загрузки задач не требуется никакого внешнего загрузчика.

Заключение

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

  • Использование режима сна и режима глубокого сна;
  • Уменьшение тактовой частоты;
  • Замена или удаление ненужных компонентов;
  • Понижение напряжения питания на плате;
  • Создание собственной Arduino.

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

25 ноября 2019 в 13:41
| Обновлено 7 ноября 2020 в 01:20 (редакция)
Опубликовано:

Статьи, Arduino

Здесь приведен кусок большого вывода лога компиляции скетча CardKeyBoard.ino. Опцию -DF_CPU=16000000L необходимо поменять на -DF_CPU=8000000L, иначе в библиотеке Adafruit NeoPixel не работает управление трехцветным светодиодом по последовательному протоколу [3].

C:arduino-1.8.13arduino-builder -dump-prefs -logger=machine -hardware
   C:arduino-1.8.13hardware -hardware C:UsersuserAppDataLocalArduino15
   packages -tools C:arduino-1.8.13tools-builder -tools C:arduino-1.8.13
   hardwaretoolsavr -tools C:UsersuserAppDataLocalArduino15packages
   -built-in-libraries C:arduino-1.8.13libraries -libraries C:Usersuser
   OneDriveДокументыArduinolibraries -fqbn=arduino:avr:nano:cpu=atmega328old
   -ide-version=10813 -build-path C:UsersuserAppDataLocalTemparduino_build_461155
   -warnings=none -build-cache C:UsersuserAppDataLocalTemparduino_cache_496329
   -prefs=build.warn_data_percentage=75 
   -prefs=runtime.tools.arduinoOTA.path=C:arduino-1.8.13hardwaretoolsavr 
   -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:arduino-1.8.13hardwaretoolsavr 
   -prefs=runtime.tools.avrdude.path=C:arduino-1.8.13hardwaretoolsavr 
   -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:arduino-1.8.13hardwaretoolsavr 
   -prefs=runtime.tools.avr-gcc.path=C:arduino-1.8.13hardwaretoolsavr 
   -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:arduino-1.8.13
   hardwaretoolsavr -verbose C:asmCardKeyBoardCardKeyBoard.ino
C:arduino-1.8.13arduino-builder -compile -logger=machine -hardware C:arduino-1.8.13
   hardware -hardware C:UsersuserAppDataLocalArduino15packages -tools
   C:arduino-1.8.13tools-builder -tools C:arduino-1.8.13hardwaretoolsavr
   -tools C:UsersuserAppDataLocalArduino15packages -built-in-libraries
   C:arduino-1.8.13libraries -libraries C:UsersuserOneDriveДокументыArduino
   libraries -fqbn=arduino:avr:nano:cpu=atmega328old -ide-version=10813 -build-path
   C:UsersuserAppDataLocalTemparduino_build_461155 -warnings=none -build-cache 
   C:UsersuserAppDataLocalTemparduino_cache_496329 -prefs=build.warn_data_percentage=75 
   -prefs=runtime.tools.arduinoOTA.path=C:arduino-1.8.13hardwaretoolsavr 
   -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:arduino-1.8.13hardwaretoolsavr 
   -prefs=runtime.tools.avrdude.path=C:arduino-1.8.13hardwaretoolsavr 
   -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:arduino-1.8.13hardwaretoolsavr 
   -prefs=runtime.tools.avr-gcc.path=C:arduino-1.8.13hardwaretoolsavr 
   -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:arduino-1.8.13hardware
   toolsavr -verbose C:asmCardKeyBoardCardKeyBoard.ino
Using board 'nano' from platform in folder: C:arduino-1.8.13hardwarearduinoavr
Using core 'arduino' from platform in folder: C:arduino-1.8.13hardwarearduinoavr
Detecting libraries used...
"C:\arduino-1.8.13\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11
   -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics
    -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L
    -DARDUINO=10813 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\arduino-1.8.13\hardware\
    arduino\avr\cores\arduino" "-IC:\arduino-1.8.13\hardware\arduino\avr\variants\
    eightanaloginputs" "C:\Users\user\AppData\Local\Temp\arduino_build_461155\
    sketch\CardKeyBoard.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
Alternatives for Adafruit_NeoPixel.h: [Adafruit_NeoPixel@1.10.0]
ResolveLibrary(Adafruit_NeoPixel.h)
  -> candidates: [Adafruit_NeoPixel@1.10.0]
"C:\arduino-1.8.13\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11
   -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics
   -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L
   -DARDUINO=10813 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-IC:\arduino-1.8.13\hardware\
   arduino\avr\cores\arduino" "-IC:\arduino-1.8.13\hardware\arduino\avr\variants\
   eightanaloginputs" "-IC:\Users\user\OneDrive\Документы\Arduino\libraries\
   Adafruit_NeoPixel" "C:\Users\user\AppData\Local\Temp\arduino_build_461155\
   sketch\CardKeyBoard.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
Alternatives for Wire.h: [Wire@1.0]
ResolveLibrary(Wire.h)
  -> candidates: [Wire@1.0]
...
"C:\arduino-1.8.13\hardware\tools\avr/bin/avr-size" -A
   "C:\Users\user\AppData\Local\Temp\arduino_build_461155/CardKeyBoard.ino.elf"
Скетч использует 6758 байт (21%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 259 байт (12%) динамической памяти, оставляя 1789 байт
   для локальных переменных. Максимум: 2048 байт.

Месяца 3 назад, как и многие горе-электроники, купил себе на мой тогдашний взгляд самую навороченную микропроцессорную плату из семейства Arduino, а именно Seeeduino Mega, на базе процессора Atmega1280. Побаловавшись всласть вращающимся сервоприводом и моргающим светодиодом, встал вопрос: «зачем же я её купил?».

Я работаю одним из ведущих конструкторов на одном крупном военном Зеленоградском заводе, и в данный момент веду проект по разработке метрологического средства измерения. В данной задаче существует бесконечное множество проблем, которые требуют индивидуального решения. Одной из таких задач является управление шаговым двигателем без шумов и с шагом не 1.8 градуса, как сказано в документации шагового двигателя, а до 0.0001 градуса. Казалось бы, задача сложна и нерешабельна, но, повозившись немного со схемами управления, пришёл к выводу, что всё реально и возможно. Требуется только генерация двух сигналов специфичной формы и со сдвигом фаз и частотой изменения напряжения до 1 МГц. (Подробное исследование шагового мотора и раскрытие всех тайн управления напишу в следующей статье) Сразу же в голове стали появляться проблески надежды, что я не зря потратил 1500 рублей на свою красненькую Seeeduino, и я, набравшись энтузиазма, начал разбираться.

Первоначальный ужас:

Подключив микропроцессорную плату к осцилографу, и написав цикл digitalWrite(HIGH), и ниже digitalWrite(LOW), на осцилографе обнаружил довольно унылый меандр с частотой 50Гц. Это кошмар. Это крах, подумал я, на фоне требуемых 1Мгц.
Далее, через осцилограф, я изучил еще несколько скоростей выполнения:
AnalogRead() — скорость выполнения 110 мкс.
AnalogWrite() — 2000 мкс
SerialPrintLn() — при скорости 9600 около 250мкс, а при максимальной скорости около 3мкс.
DigitalWrite() — 1800мкс
DigitalRead() — 1900мкс

На этом я, всплакнув, чуть не выкинул свою Seeeduino. Но не тут-то было!

Глаза боятся, руки делают!

Не буду рассказывать свои душевные муки и описывать три долгих дня изучения, лучше сразу скажу всё как есть!
Подняв всю возможную документацию на Arduino и на процессор Atmega1280, исследовав опыт зарубежных коллег, хочу предложить несколько советов, как заменять чтение/запись:

Улучшаем AnalogRead()

#define FASTADC 1

// defines for setting and clearing register bits
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &=

_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() int start ;
int i ;

#if FASTADC
// set prescale to 16
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
#endif

Serial.begin(9600) ;
Serial.print(«ADCTEST: «) ;
start = millis() ;
for (i = 0 ; i < 30000 ; i++)
analogRead(0) ;
Serial.print(millis() — start) ;
Serial.println(» msec (30000 calls)») ;
>

Результат: скорость 18,2 мкс против бывших 110 мкс.
Кстати, максимальная скорость АЦП Атмеги как раз 16мкс. Как вариант — использовать другую микросхему, заточенную именно под АЦП, которая позволит уменьшить скорость до 0,2мкс (читать ниже, почему)

Улучшаем digitalWrite()

Каждая Arduino/Seeeduino/Feduino/Orduino/прочаяduino имеет порты. Каждый порт — 8 бит, которые сначала надо настроить на запись. Например, на моей Seeeduino PORTA — c 22 по 30 ножку. Теперь всё просто. Управляем с 22 по 30 ножки с помощью функций
PORTA=B00001010 (битовая, ножки 23 и 25 — HIGH)
или
PORTA=10 (десятичная, всё так же)
Результат = 0,2мкс против 1800мкс, которые достигаются обычным digitalWrite()

Улучшаем digitalRead()

Практически то же самое, что и в улучшении с digitalWrite(), но теперь настраиваем ножки на INPUT, и используем, например:
if (PINA==B00000010) <.>(если на ножке 23 присутствует HIGH, а на 22 и 24-30 присутствует LOW)
Результат выполнения этого if() — 0.2мкс против 1900мкс, которые достигаются обычным digitalRead()

Улучшаем ШИМ модулятор, или analogWrite()

Итак, есть данные, что digitalRead() исполняется 0,2мкс, и ШИМ модулятор имеет дискретность 8 разрядов, минимальное время переключения ШИМ 51,2мкс против 2000 мкс.
Используем следующий код:
int PWM_time=32; //Число, которое мы как бы хотим записать в analogWrite(PIN, 32)
for (int k=0;k<PWM_time) PORTA=B00000001;
for (int k=0;k<256-PWM_time) PORTA=B00000000;

Вот и получили ШИМ с частотой 19кГц против 50Гц.

Как менять в arduino ide частоту процессора

Определить тип платы Arduino

C:Appsarduino-1.0-windowsarduino-1.0hardwaretoolsavrbinavr-g++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata -sections -mmcu = atmega328p -DF_CPU = 16000000L -DARDUINO = 100 -IC:Appsarduino-1.0-windowsarduino-1.0hardwarearduinocoresarduino -IC:Appsarduino-1.0-windowsarduino -1.0hardwarearduinovariantsstandard C:UsersJimAppDataLocalTempbuild4664216036291565363.tmpBlink.cpp -oC:UsersJimAppDataLocalTempbuild4664216036291565363.tmpBlink. cpp.o

-IC:Appsarduino-1.0-windowsarduino-1.0hardwarearduinovariantantsstandard

Arduino.ru

Добрый вечер! Прошу помощи у знатоков. Знаю, что можно изменить частоту процессора в ардуино, редактируя файл boards. А есть ли такая возможность задать частоту для компилятора в тексте скетча?

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

Знаю, что можно изменить частоту процессора в ардуино, редактируя файл boards.

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

почему бы тебе не задать этот вопрос на каком-то другом форуме?

Или ты хочешь опять устроить тупизм на 50 сообщений, чтобы в конце обосрать всех кто помогал ?

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

ЕвгенийП аватар

А физически на железе как менять собрались? Или только в файла, а железо «само подтянется»?

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

wdrakula аватар

А физически на железе как менять собрались? Или только в файла, а железо «само подтянется»?

Дык 21-ый век на дворе! Канешна.

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

А физически на железе как менять собрались? Или только в файла, а железо «само подтянется»?

меняем погоду, редактируя прогноз

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

Rumata аватар

Тут уже кнопку «установить нерабочие дни» донажимались на прошлой неделе студенты.

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

А физически на железе как менять собрались?

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

Знаю, что можно изменить частоту процессора в ардуино, редактируя файл boards.

Извиняюсь, сказал неточно: не «знаю» а «читал об этом» и сам не пробовал.

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

А физически на железе как менять собрались? Или только в файла, а железо «само подтянется»?

Железа пока не имею. Только начинаю и присматриваюсь. Моделирую в Proteus Надо изменить в файле для компилятора, т.к. Proteus не тянет больше 8мгц, а arduino nano ,которая мне приглянулась по умолчанию в ide 16мгц. Приходится всё время пересчитывать.

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

negavoid2 аватар

На самом деле можно, для некоторых ардуин, программно разогнаться аж в два раза по команде, с 80 до 160 МГц, и потом если надо, вернуть обратно, тоже командой из кода.

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

На самом деле можно, для некоторых ардуин, программно разогнаться аж в два раза по команде, с 80 до 160 МГц, и потом если надо, вернуть обратно, тоже командой из кода.

Мне надо уменьшить вдвое перед началом один раз .arduino nano

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

ЕвгенийП аватар

Димыч, это «хлеб безопасного кабеля» (по английски «брэд сэив кэйбыл»)

Скажите протеусу вот так и не трахайте мозг ни себе ни другим:

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

Димыч, это «хлеб безопасного кабеля» (по английски «брэд сэив кэйбыл»)

Скажите протеусу вот так и не трахайте мозг ни себе ни другим:

Вашими б устами. Но увы эмулятор частоту повысить не позволяет. Понизить можно

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

ЕвгенийП аватар

Вашими б устами. Но увы эмулятор частоту повысить не позволяет. Понизить можно

Это уже даже не «хлеб безопасного кабеля», а просто «бред сивой кобылы».

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

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

Железа пока не имею. Только начинаю и присматриваюсь. Моделирую в Proteus

Пришла мне в голову мысль, подарить вам Arduino Nano. ни одной не нашел — все попрятались, боятся.

Давно на форуме так народ не веселился.

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

Странно что такой простой вопрос «трахает» кому-то мозги. Сочувствую.

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

Так ты не ардуино симулируешь, а просто камень без обвязки, гений.

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

Так ты не ардуино симулируешь, а просто камень без обвязки, гений.

Я знаю это. И что? В IDE Нельзя понизить частоту из-за этого?

P.S.Кристал не помогает

Готов ответить ещё на сотню наводящих вопросов, чтобы услышать ответ на свой простой вопрос

И где тут обвязка? USB что-ли или кварц?

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

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

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

Готов ответить ещё на сотню наводящих вопросов, чтобы услышать ответ на свой простой вопрос

это на этот чтоле?

В скетче ардуино? в общем случае ответ — нет

Эта проблема решается по другому. И в этой ветке озвучено уже два возможных решения. Но ты же всегда хочешь идти своим путем. Ищи сам.

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

А Гугл и прочие поисковики тебя уже нахер послали ?

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

Rumata аватар

Дим-мычъ , ЛабЦентр не пора в тему звать? А то опять потом будете переживать, что они все веселье пропустили))

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

с таким способностями? 🙂

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

Rumata аватар

с таким способностями? 🙂

Сейчас вдруг аж сердце екнуло, а как он капчу то проходит? Сложно, наверное, со светофорами и велосипедами

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

Сейчас вдруг аж сердце екнуло, а как он капчу то проходит? Сложно, наверное, со светофорами и велосипедами

светофоры фигня, мне как-то капча на арифметику попалась, что-то вроде «Решите пример 9 + 5 =»? ввожу 14 — «Ответ неверный» 🙁

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

Rumata аватар

светофоры фигня, мне как-то капча на арифметику попалась, что-то вроде «Решите пример 9 + 5 =»? ввожу 14 — «Ответ неверный» 🙁

Гугл знает толк в троллинге))

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

ЕвгенийП аватар

Странно что такой простой вопрос «трахает» кому-то мозги. Сочувствую.

Простите, Вы идиот или просто дурачок? Сочувствую.

Вы прочитали, что Вам пишут красными буквами ?

Там написано, что Вы выбрали внешние часы, но НЕ ЗАДАЛИ их частоту.

А теперь посмотрите на мою картинку и сделайте так, как я Вам говорил. И всё нормально заработает

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

Странно что такой простой вопрос «трахает» кому-то мозги. Сочувствую.

Простите, Вы идиот или просто дурачок? Сочувствую.

Вы прочитали, что Вам пишут красными буквами ?

Там написано, что Вы выбрали внешние часы, но НЕ ЗАДАЛИ их частоту.

А теперь посмотрите на мою картинку и сделайте так, как я Вам говорил. И всё нормально заработает

Где-то недавно слышал: кто как обзывается, тот так сам и называетя)))

То есть Вы никогда в жизни не ошибаетесь?

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

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

mykaida аватар

Не знаю — возможно модель херовая. У меня нанА в протеусе нормально отрабатывает.

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

ЕвгенийП аватар

Где-то недавно слышал: кто как обзывается, тот так сам и называетя)))

То есть Вы никогда в жизни не ошибаетесь?

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

Вы уже научились не обижаться? Можно говорить? Или заткнуться пока? 🙂

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

Там написано что не работает в реальном времени, потому что цпу не тянет. Но в не реальном должно работать — растягивать временные интервалы на реальных морганиях. На диаграммах тики должны соответствовать времени выполнения реального устройства. Так что работать должно. Или учите английский.

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

На самом деле можно, для некоторых ардуин, программно разогнаться аж в два раза по команде, с 80 до 160 МГц, и потом если надо, вернуть обратно, тоже командой из кода.

а код есть глянуть ?

что то такого не встречал нигде

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

negavoid2 аватар

На самом деле можно, для некоторых ардуин, программно разогнаться аж в два раза по команде, с 80 до 160 МГц, и потом если надо, вернуть обратно, тоже командой из кода.

а код есть глянуть ?

что то такого не встречал нигде

g esp8266 system_update_cpu_freq()

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

На самом деле можно, для некоторых ардуин, программно разогнаться аж в два раза по команде, с 80 до 160 МГц, и потом если надо, вернуть обратно, тоже командой из кода.

а код есть глянуть ?

что то такого не встречал нигде

g esp8266 system_update_cpu_freq()

Выходит можно частоту в 160mhz допустим сгенерировать на пине?

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

Выходит можно частоту в 160mhz допустим сгенерировать на пине?

при 160 МГц тактовой? :)))) а подумать?

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

Сколько точек синусоиды моделироваить?
Даже из предварительно подготовленного массива вывод точек занимаемает несколько тактов. Соответственно частота синусоиды будет меньше тактовой на количество точек одного перода синусоиды умножить на количество тактов выводо точки. Если взять количество точек 32 и тактов около 12 то максимальная частота синусоиды будет гдето около 250 кГц.

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

negavoid2 аватар

да ладно вам, там вон на другом пине аж 2460 МГц синусоида генерируется, чо уж 🙂

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

да ладно вам, там вон на другом пине аж 2460 МГц синусоида генерируется, чо уж 🙂

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

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

negavoid2 аватар

Ну да, можно обычную, накаливания, ватт хотя бы на 10-20, а то без лампочки, в полной темноте — не видно. ))

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

светофоры фигня, мне как-то капча на арифметику попалась, что-то вроде «Решите пример 9 + 5 =»? ввожу 14 — «Ответ неверный» 🙁

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

negavoid2 аватар

Это была javascript-капча, правильный ответ «95» 🙂

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

Где-то недавно слышал: кто как обзывается, тот так сам и называетя)))

То есть Вы никогда в жизни не ошибаетесь?

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

Вы уже научились не обижаться? Можно говорить? Или заткнуться пока? 🙂

На обиженных воду возят.)))

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

Несмотря на нездоровый скептицизм, проблема изменения частоты решается на Atmega328p ещё даже проще чем на знакомых мне ранее МК PIC. Правда в Протеусе всё немного сложнее. Никакие поисковики меня «нахер не посылали» и пример по ссылке в посте #22

уже находил и пробовал ранее ,но он в Протеусе не работает, по крайней мере у меня . Решение для Протеуса нашёл, но оно не помогает))

Дело в том, что , например, понижая частоту в файле скетча в 2раза мы тем самым понижаем частоту работы МК в Протеусе тоже в два раза!

Так что проще тайминги пересчитать ( всего то на два поделить) когда надо , тем более не так часто приходится))

Спасибо всем, кто пытался помочь!

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

Понятно — несмотря на весь флейм — задачу ты так и не решил.

Мозгов так и не хватило запустить атмегу на 16 МГц в Протеусе, как написано в #13 ?? Это «не работает»? :))) А ты в курсе, что к Протеусу даже есть готовая модель Ардуино Нано — естесственно с частотой 16 МГц? Так что не обманывай себя — все работает, у кого-то просто руки не из того места.

Это один вариант, если ты хочешь менять частоту «железа». Если же надо поменять настройки частоты при компиляции скетча — это делается редактированием нескольких строчек в файле boards.txt

Так что диагноз, что гугль тебя посылает — явно правильный. Вместо того чтоб давно найти ответ поиском -ты продожаешь, как дурак, пересчитывать задержки :))) Ну и в чем был смысл всех обсирать?

А вариант из сообщения #22 тебе ожидаемо не поможет, этот метод не в силах поднять частоту камня до 16 МГц, если все настройки, фьюзы и обвязка рассчитаны на 8

Про Ардуино и не только

Arduino ATmega328P тактирование от внутреннего RC-генератора

Что нужно знать о тактировании AVR микроконтроллеров

AVR микроконтроллеры способны работать с различными источниками тактового сигнала. Это может быть внешний резонатор, RC-цепочка (внутренняя или внешняя), а так же внешний сигнал синхронизации. Источник тактирования выбирается исходя из требований к устройству. Так для построения точных микроконтроллерных систем следует использовать внешние кварцевые или керамические резонаторы, так как они обладают высокой стабильностью и не чувствительны к изменениям температуры. В этом плане им уступают генераторы на основе времязадающей RC-цепочки: они менее стабильны и чувствительны к изменениям температуры и напряжения. С другой стороны внутренний RC-генератор присутствует практически во всех AVR микроконтроллерах и его использование будет наиболее простым и экономичным решением в системах, не предъявляющих высоких требований к стабильности тактового сигнала.

Настройка микроконтроллера на работу с тем или иным источником тактового сигнала осуществляется установкой конфигурационных битов (фьюзов) при помощи программатора. Применительно к нашей ситуации установка фьюзов происходит при выполнении команды «Записать загрузчик» из меню IDE Ардуино, значения фьюзов берутся из файла boards.txt. Он же отвечает за добавление новых пунктов в меню Инструменты. Поэтому доработка IDE Ардуино для добавления в нее меню выбора частоты начинается с редактирования файла boards.txt

Редактирование файла boards.txt

Перейдите в каталог Arduino_dirhardwarearduinoavr, где Arduino_dir — это каталог, в который установлена среда разработки Ардуино. У меня этот путь выглядит так: d:Arduinoarduino-1.6.12hardwarearduinoavr. Перед внесением изменений в файл boards.txt я рекомендую сделать его резервную копию. Теперь открываем файл boards.txt в текстовом редакторе (подойдет notepad++ или другой, поддерживающий кодировку UTF-8, чтобы не было проблем с отображением русских букв в IDE Ардуино) и добавляем в него строку menu.clock=Тактирование

Редактирование boards.txt Ардуино

Затем находим секцию для Ардуино Уно (я опишу порядок действий применительно к Ардуино Уно, но таким же образом можно скорректировать секции других плат с поправкой на микроконтроллер):

Редактирование boards.txt Ардуино

  1. скорость загрузки — uno.upload.speed;
  2. значения фьюзов — uno.bootloader.low_fuses, .high_fuses, .extended_fuses;
  3. имя файла загрузчика — uno.bootloader.file;
  4. частоту микроконтроллера — uno.build.f_cpu.

uno.menu.clock.external16=Внешний резонатор 16МГц
uno.menu.clock.external16.upload.speed=115200
uno.menu.clock.external16.bootloader.low_fuses=0xFF
uno.menu.clock.external16.bootloader.high_fuses=0xDE
uno.menu.clock.external16.bootloader.extended_fuses=0xFF
uno.menu.clock.external16.bootloader.file=optiboot/optiboot_atmega328.hex
uno.menu.clock.external16.build.f_cpu=16000000L

uno.menu.clock.internal8=Внутренний RC-генератор 8МГц
uno.menu.clock.internal8.upload.speed=57600
uno.menu.clock.internal8.bootloader.low_fuses=0xE2
uno.menu.clock.internal8.bootloader.high_fuses=0xDE
uno.menu.clock.internal8.bootloader.extended_fuses=0xFF
uno.menu.clock.internal8.bootloader.file=optiboot/optiboot_atmega328_8.hex
uno.menu.clock.internal8.build.f_cpu=8000000L

uno.menu.clock.internal1=Внутренний RC-генератор 1МГц
uno.menu.clock.internal1.upload.speed=4800
uno.menu.clock.internal1.bootloader.low_fuses=0x62
uno.menu.clock.internal1.bootloader.high_fuses=0xDE
uno.menu.clock.internal1.bootloader.extended_fuses=0xFF
uno.menu.clock.internal1.bootloader.file=optiboot/optiboot_atmega328_1.hex
uno.menu.clock.internal1.build.f_cpu=1000000L

Для наглядности я приведу скриншот моего файла boards.txt, каким он был и каким стал после выполнения описанных изменений:

Редактирование boards.txt Ардуино

Таким образом мы описали меню из трех пунктов, для каждого из них указали скорость загрузки скетчей, значения фьюзов, имя файла загрузчика (об этом чуть позже) и частоту микроконтроллера. При помощи онлайн калькулятора вы можете расшифровать приведенные значения фьюзов и увидеть, как происходит выбор источника тактирования. И что для получения тактовой частоты 1МГц при работе от внутреннего RC-генератора используется деление частоты на 8 (фьюз CKDIV8).

Сохраните файл в кодировке UTF-8 без BOM и запустите IDE. Если все сделано правильно, то при выборе платы Arduino Uno вам станет доступно меню Инструменты->Тактирование. Но этих изменений пока еще мало. Если сейчас выбрать в меню, например, Внутренний RC-генератор 8МГц и выполнить запись загрузчика, то новые значения фьюзов, конечно, запишутся в микроконтроллер и он начнет работать с внутренним RC-генератором. Но мы потеряем возможность загружать в Ардуино новые скетчи, потому что записанный в нее загрузчик рассчитан на частоту 16МГц. Выход — скомпилировать загрузчик для работы на частотах 8МГц и 1МГц. Если у вас нет желания заморачиваться с компиляцией загрузчика, то можете скачать уже скомпилированные файлы отсюда, поместить их в каталог Arduino_dirhardwarearduinoavrbootloadersoptiboot и перейти к пункту Изменение частоты и источника тактирования Ардуино. А кому интересно могут скомпилировать их самостоятельно. О том как это сделать описано далее.

Что такое Optiboot

Optiboot — это загрузчик для AVR микроконтроллеров, созданный Питером Найтом (Peter Knight). В его основу легли труды нескольких разработчиков и групп (Jason P. Kyle, Arduino group, Spiff , AVR-Libc group, Ladyada), впоследствии он значительно развился. Загрузчик получился настолько удачным, что компания-разработчик Ардуино стала использовать его в своей плате Ардуино Уно. С недавнего времени Optiboot является официальным загрузчиком и для других плат на базе ATmega328p (Нано, Мини). По сравнению с использовавшимся в них старым загрузчиком Optiboot обладает рядом преимуществ:

  1. как изменить тактовую частоту atmega328? (то, что есть в программе ардуины мало)

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

  3. на тиньке в самой программе можно было забить и 1 мгц и 128 кгц, а для меги нет такого

  4. Для мигалок пищалок пойдёт даже для термометра.А для Serial нет будет выдавать ошибки.Сама плата Ардуино в плане потребления не Гут.Если надо низкое потребление то лучше голый AVR и то не Мегу 328 а Тини 2313 или вообще Тини 45. что делать то собираетесь?

  5. На Меге по дефолту 8 мГц + делитель на 8. Можно вообще 4 Мгц + делитель на 8. Главное фьюзы поставить. У меня Мега вообще работает от кварца 1Мгц. Калькулятор Вам в помощь!

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

  7. был бы рад,ю если бы пояснили поподробнее, почему в более менее сложных проектах внутренник кварц не катит и что за делитель на 8?

  8. в принципе я почитал, просто частота будет гулять, насокльок сильно, я узнаю экспериментально, в любом случае, добавить кварц это несложно

  9. нельзя ли как-то программо задать частоту?

  10. Частота плавает в зависимости от температуры.Если что то будете предавать по USART I2C или другим линиям будет приходить мусор.Делитель на 8?Это делитель частоты кварца на 8 что тут непонятного?

    Поверьте на USART будет заметно по крокозяблам вместо текста.Опять же во многих вещах внутреннего Гены-за глаза хватает.

    Как программно?Что мешает подключить кварц на нужную частоту?Можно внешним Геном на 555 или К155ЛА3.Можно даже часовой.Вы делаете конкретное устройство или ваш вопрос-просто риторика?

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

  12. Проблема решаема, но необходимо ознакомиться с разделом «9.11 System Clock Prescaler» из документации на микроконтроллер ATmega328.

  13. http://www.farnell.com/datasheets/2047852.pdf
    вот даташит, такого нет пункта, подскажите, какая страница
    CLKPR
    как понимаю вот про это регистр вы?

  14. спасибо то, что нужно, все нашел

Понравилась статья? Поделить с друзьями:
  • Как изменить тактику поведения
  • Как изменить таймлапс на обычное
  • Как изменить тайминги оперативной памяти через программу
  • Как изменить тайминги оперативной памяти ddr3
  • Как изменить таймер сна windows 10