Имеем Arduino ProMini 16MHz ATmega328P. Наша задача - запустить плату под напряжением 3.3в. Производитель гарантирует работу при таком напряжении с частотой не более 8MHz. Практика показывает что несмотря на это контроллер работает при 3.3в. По крайней мере при комнатной температуре. Чтобы не выходить за предельные параметры лучше все же понизить тактовую частоту.
Открываем в блокноте файл C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt
Добавляем в него текст
Code:
## Arduino Pro or Pro Mini (3.3V, 16/8 MHz) w/ ATmega328P
## --------------------------------------------------
pro.menu.cpu.168MHzatmega328=ATmega328P (3.3V, 16/8 MHz)
pro.menu.cpu.168MHzatmega328.upload.maximum_size=30720
pro.menu.cpu.168MHzatmega328.upload.maximum_data_size=2048
pro.menu.cpu.168MHzatmega328.upload.speed=57600
pro.menu.cpu.168MHzatmega328.bootloader.low_fuses=0xFF
pro.menu.cpu.168MHzatmega328.bootloader.high_fuses=0xDA
pro.menu.cpu.168MHzatmega328.bootloader.extended_fuses=0xFD
pro.menu.cpu.168MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex
pro.menu.cpu.168MHzatmega328.build.mcu=atmega328p
pro.menu.cpu.168MHzatmega328.build.f_cpu=8000000L
Для другой частоты надо изменить значение f_cpu ну и как-то отобразить частоту в названии чтобы не путаться при выборе платы.
Обращаю внимание на имя пункта меню - pro.menu.cpu.168MHzatmega328. Оно должно быть уникальным для каждого варианта платы/частоты. Если надо добавить несколько вариантов для разных частот то это имя у них должно различаться.
Запускаем Arduino IDE. Выбираем плату "Arduino Pro or Pro Mini". Добавленные процессоры должны появиться в выпадающем меню "Инструменты"->"Процессор"
В скетче в самом начале добавляем
Code:
#include <avr/power.h>
В функции setup() первой строчкой устанавливаем требуемую частоту т.к. плата запускается на 16MHz
Code:
8MHz clock_prescale_set(clock_div_2);
4MHz clock_prescale_set(clock_div_4);
2MHz clock_prescale_set(clock_div_8);
1MHz clock_prescale_set(clock_div_16);
500kHz clock_prescale_set(clock_div_32);
250kHz clock_prescale_set(clock_div_64);
125kHz clock_prescale_set(clock_div_128);
После этих манипуляций процессор работает с пониженной частотой, USB работает корректно, тайминги (delay,millis,micros и т.п.) работают так же корректно. В коде всегда можно узнать текущую частоту процессора с помощью макроса F_CPU и прескалер для тактовой частоты clock_prescale_get()
Даташитное потребление ATmega329P при разном питании тактовой частоте

На плате кроме смого процессора есть еще светодиоды, которые тоже "кушают". При необходимости их можно демонтировать феном. Со светодиодами потребление платы при 3,3в и разной тактовой частоте
Code:
16MHz 10mA
8MHz 7.7mA
4MHz 6.4mA
2MHz 5.5mA
1MHz 5mA
500kHz 4.75mA
Так что если цель - микропотребление то светодиоды надо демонтировать и кроме это во время простоя вводить процессор в power down mode.
Reference
1.
Is there a simple way to reduce clock speed on an UNO?2.
Arduino’s ATMega328 Power Consumption3.
What is the best way to estimate the power consumption of an Atmega328p microcontroller?