Запускаем Arduino при пониженном питании
Posted: 31 Mar 2018, 13:05
Имеем Arduino ProMini 16MHz ATmega328P. Наша задача - запустить плату под напряжением 3.3в. Производитель гарантирует работу при таком напряжении с частотой не более 8MHz. Практика показывает что несмотря на это контроллер работает при 3.3в. По крайней мере при комнатной температуре. Чтобы не выходить за предельные параметры лучше все же понизить тактовую частоту.
Открываем в блокноте файл C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt
Добавляем в него текст
Для другой частоты надо изменить значение f_cpu ну и как-то отобразить частоту в названии чтобы не путаться при выборе платы.
Обращаю внимание на имя пункта меню - pro.menu.cpu.168MHzatmega328. Оно должно быть уникальным для каждого варианта платы/частоты. Если надо добавить несколько вариантов для разных частот то это имя у них должно различаться.
Запускаем Arduino IDE. Выбираем плату "Arduino Pro or Pro Mini". Добавленные процессоры должны появиться в выпадающем меню "Инструменты"->"Процессор"
В скетче в самом начале добавляем
В функции setup() первой строчкой устанавливаем требуемую частоту т.к. плата запускается на 16MHz
После этих манипуляций процессор работает с пониженной частотой, USB работает корректно, тайминги (delay,millis,micros и т.п.) работают так же корректно. В коде всегда можно узнать текущую частоту процессора с помощью макроса F_CPU и прескалер для тактовой частоты clock_prescale_get()
Даташитное потребление ATmega329P при разном питании тактовой частоте

На плате кроме смого процессора есть еще светодиоды, которые тоже "кушают". При необходимости их можно демонтировать феном. Со светодиодами потребление платы при 3,3в и разной тактовой частоте
Так что если цель - микропотребление то светодиоды надо демонтировать и кроме это во время простоя вводить процессор в power down mode.
Reference
1. Is there a simple way to reduce clock speed on an UNO?
2. Arduino’s ATMega328 Power Consumption
3. What is the best way to estimate the power consumption of an Atmega328p microcontroller?
Открываем в блокноте файл C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt
Добавляем в него текст
Code: Select all
## 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
Обращаю внимание на имя пункта меню - pro.menu.cpu.168MHzatmega328. Оно должно быть уникальным для каждого варианта платы/частоты. Если надо добавить несколько вариантов для разных частот то это имя у них должно различаться.
Запускаем Arduino IDE. Выбираем плату "Arduino Pro or Pro Mini". Добавленные процессоры должны появиться в выпадающем меню "Инструменты"->"Процессор"
В скетче в самом начале добавляем
Code: Select all
#include <avr/power.h>
Code: Select all
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);
Даташитное потребление ATmega329P при разном питании тактовой частоте

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