• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

измерить напряжение питания ESP очень просто

nikolz

Well-known member
Добрый день,
Выкладываю решение данного вопроса.
1) для измерения напряжения питания ESP есть функция SDK
system_get_vdd33
однако, ее применение согласно документации требует изменения значения 107 байта:
-------------------------------
• system_get_vdd33 can only be called when TOUT pin is suspended.
• The 107th byte in esp_init_data_default.bin (0 ~ 127 bytes) is named as
vdd33_const. When TOUT pin is suspended, vdd33_const must be set as
0xFF, which is 255.
• The return value of system_get_vdd33 may be different in different Wi-Fi
modes, for example, in Modem-sleep mode or in normal Wi-Fi working mode.
-----------------------------------
2) есть еще одно решение - это свалка pvvx.
================-
3) есть еще оно решение, которое решает данную задачу без свалок и необходимости переписывая байта 107 в системной области параметров.
-------------------------
С помощью этого решения можно измерять напряжение питания ESP .
Для этого надо воспользоваться функцией int vdd33=readvdd33()
Эта функция есть в библиотеке libhy.a и используется в lua nodemcu.
функция возвращает значение напряжения питания.
===================
Например, у меня eSP-12 работает от батарейки через преобразователь.
Напряжение питания мультиметром =3.20 в
Напряжение измеренное данной функцией 3185..3170 мв
---------------------
Всем успехов.
===========================
Дополнение.
Для управления параметрами RFconfig я наприсал пару функций.
Вы можете использовать их например для включения режима АЦП изменяя содержимое ячейки 107 либо управлять опциями WIFI без создания нового файла
esp_init_data_default.bin
Для того чтобы изменения вступили в силу надо перезапустить ESP или войти и выйти из сна.
вот эти функции
Код:
char sectorRF[SPI_FLASH_SEC_SIZE] __attribute__((aligned(4)));
uint32 init_sector;
//---------------читает сектор RF в массив sectorRF
void get_sectorRF( ) 
{     enum flash_size_map size_map = system_get_flash_size_map();
     switch (size_map) {
            case FLASH_SIZE_4M_MAP_256_256:
                init_sector = 128 - 4;     break;
            case FLASH_SIZE_8M_MAP_512_512:
                init_sector = 256 - 4;      break;
            case FLASH_SIZE_16M_MAP_512_512:
            case FLASH_SIZE_16M_MAP_1024_1024:
                init_sector = 512 - 4;     break;
            default:
                init_sector = 1024 - 4;    break;
     }
  spi_flash_read ( init_sector * SPI_FLASH_SEC_SIZE,(uint32 *)sectorRF, sizeof(sectorRF)) ;
}
//-------------------- функция пишет сектор на свое место
void set_sectorRF(){
  spi_flash_erase_sector(init_sector);
spi_flash_write ( init_sector * SPI_FLASH_SEC_SIZE,(uint32 *)sectorRF, sizeof(sectorRF));
}
Пример применения:
// включаем режим измерения питания
get_sectorRF( ) ;
sectorRF[107]=255;
set_sectorRF();
//включаем режим АЦП
get_sectorRF( ) ;
sectorRF[107]=33;
set_sectorRF();
---------------------------
Всем успехов и процветания.
 
Последнее редактирование:

pvvx

Активный участник сообщества
есть еще одно решение - это свалка pvvx.
Угу и все решения пока от туда. Народ почему-то не хочет сам разбирать потроха SDK, а свято верит PDF липовой документации от Espressif.
Но там не всё так просто как вы считаете. Не забудьте управлять флажком переключения ADC для WiFi драйвера... :)
Я его вставил в свой код позже, по тому его нет в Lua :p
tout_dis_txpwr_track = 1; // флаг отключения процедуры подстройки питания для WiFi
 
Последнее редактирование:

nikolz

Well-known member
Угу и все решения пока от туда. Народ почему-то не хочет сам разбирать потроха SDK, а свято верит PDF липовой документации от Espressif.
Но там не всё так просто как вы считаете. Не забудьте управлять флажком переключения ADC для WiFi драйвера... :)
Я его вставил в свой код позже, по тому его нет в Lua :p
tout_dis_txpwr_track = 1; // флаг отключения процедуры подстройки питания для WiFi
Я не сталкиваюсь c этой проблемой так как использую режим 2
и читаю после установления связи перед отсылкой данных
либо до установления в самом начале user_ init
---------------------
Есть другая неприятная вещь.
Она указана в документации. Раньше я не измерял питания, поэтому не обращал на это внимание.
-------------------------
Суть ее в том, что при измерении напряжения питания внешний вход должен быть отключен.
Буквально - должен быть в воздухе.
---------------
У меня получается, что если его закоротить то напряжение питания измеряется не правильно.
--------------
В результате можно либо использовать ацп для измерения питания, либо для измерения внешнего напряжения.
Вместе эти режимы не совместимы.
 

pvvx

Активный участник сообщества
Я не сталкиваюсь c этой проблемой так как использую режим 2
и читаю после установления связи перед отсылкой данных
Думаю, что это не важно. Если во время замера ADC чего либо, произойдет подстройка WiFi, то она тоже использует ADC (значения в регистрах ADC меняются во время работы SDK, далее не уточнял, т.е. уже забыл - не пользуюсь более ESP).
И вполне возможно, что она подстраивает путем похожим на "измерение питания", т.е. с задействованием входа ADC.
Потом спечет вам пирожки :)
Читайте доку - напряжение питания надо указывать в каком-то байте конфигов и спросите себя - зачем... Типа чип сам не может измерить при каких-то условиях?
Espressif вам не опишет свои глупости, допущенные при разработке чипа и ПО, т.е. что там у них в реале и как реализовано вы сможете узнать только потрудившись сами.
В результате можно либо использовать ацп для измерения питания, либо для измерения внешнего напряжения.
Вместе эти режимы не совместимы.
Уже много раз написано - при измерении питания у ADC на входе включается внутренний "резистор"- делитель на Vcc. Если установлен внешний резистор, то надо пересчитывать с учетом того, что у вас подключено ко входу ADC.
 
Последнее редактирование:

AlexandreVN

Member
Апну тему. Результаты измерения прыгают, условно говоря в пределе 220-290. Где-то уже на форуме про это писали, но сейчас не нашел. Это можно исправить или только усреднять по выборке измерений?
 

enjoynering

Well-known member
Суть ее в том, что при измерении напряжения питания внешний вход должен быть отключен.
Буквально - должен быть в воздухе.
вот это и останавливает от использования измерения напряжения этой функцией, тк на всех wimos и им подобным A0 подключен к делителю.


Результаты измерения прыгают, условно говоря в пределе 220-290
мне помогает простейший медианный фильтр на 3 измерения.
 

Вложения

nikolz

Well-known member
давно уже не измерял, но помню, что прыгало в пределах 1%
 
Сверху Снизу