Rfm69hcw - sleep режим

Тема в разделе "Проводная и беспроводная связь", создана пользователем Levvarrr, 17 сен 2021.

Метки:
  1. Levvarrr

    Levvarrr Нуб

    Приветствую всех!
    Хотел спросить тех кто пользовался радиомодулем RFM69.
    Делаю с ним проект и мне требуется что бы этот модуль засыпал. А на деле потребление все равно большое.
    Приведу пример.
    МК + RFM69 (Без режима сна) = потребляет 3мА
    МК + RFM69 (В режиме сна ) = потребляет 1,7мА

    1,7мА это очень много. Думал что проблема с МК, но нет. Если RFM69 отключить от питания то МК потребляет 50мкА. Так что дело точно в RFM69.

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

    Вот параметры из даташита по потреблению. Как добиться такого?
    power.PNG

    Кто ни-будь интересовался сколько потребляет модуль в режиме сна?
     
  2. b707

    b707 Гуру

    судя по вашим измерениям, у вас модуль в Standby моде - третья строчка таблицы
    Показывайте код. что вы там и как записывали в регистры
     
  3. Levvarrr

    Levvarrr Нуб

    Использую библиотек RFM69-Library-AVR. Она переписана с библиотеки LowPowerLab для Arduino.

    В коде я пишу setMode(RF69_MODE_SLEEP);

    Функция setMode:
    Код (C++):
    void setMode(uint8_t newMode)
    {
        if (newMode == mode)
        return;

        switch (newMode)
        {
            case RF69_MODE_TX:
                writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_TRANSMITTER);
                if (isRFM69HW) setHighPowerRegs(1);
                break;
            case RF69_MODE_RX:
                writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_RECEIVER);
                if (isRFM69HW) setHighPowerRegs(0);
                break;
            case RF69_MODE_SYNTH:
                writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_SYNTHESIZER);
                break;
            case RF69_MODE_STANDBY:
                writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_STANDBY);
                break;
            case RF69_MODE_SLEEP:
                writeReg(REG_OPMODE, (readReg(REG_OPMODE) & 0xE3) | RF_OPMODE_SLEEP);
                break;
            default:
            return;
        }
        // we are using packet mode, so this check is not really needed
        // but waiting for mode ready is necessary when going from sleep because the FIFO may not be immediately available from previous mode
        while (mode == RF69_MODE_SLEEP && (readReg(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00); // wait for ModeReady
        mode = newMode;
    }
    Как я писал выше. Если SLEEP не вызывать то потребление 3mA. А если вызвать то 1,7mA.
     
  4. parovoZZ

    parovoZZ Гуру

    Ну та и переведи его в режим сна IDDSL.
    50мкА для МК - это тоже много. Не выключен какой-то интерфейс или кривая разводка. Должно 1-2 мкА, если что-то внутри него тикает. Если МК полностью заснул, бытовым тестером ток не измеришь.
    Ну и ток надо измерять как можно короткими проводами.
    Ну и разводка платы также должна быть грамотной.
     
    Рокки1945 нравится это.
  5. parovoZZ

    parovoZZ Гуру

    вот эта строчка зачем
    Код (C++):
    while (mode == RF69_MODE_SLEEP && (readReg(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00); // wait for ModeReady
     
  6. Levvarrr

    Levvarrr Нуб

    Там пробуждение по watchdog. возможно из за него.
    Как это сделать? IDDSL в даташите упоминается только 1раз! В этой таблице
     
  7. Рокки1945

    Рокки1945 Гуру

    Дело говорит!
     
  8. Levvarrr

    Levvarrr Нуб

    Закомментировал строчку. Результат не изменился. 1,7mA
    Я уже думаю поставить какой ни-будь транзистор. Что бы полностью отключать радиомодуль....
     
  9. parovoZZ

    parovoZZ Гуру

    это какой вообще МК? Все вменяемые вачдоги потребляют не более 4 мкА. Можно ещё снизить, если снизить напряжение питания. У MSP430 RTC таймер кушает вообще какие-то крохи (менее 1 мкА) и при этом отмеряет любые интервалы. Хоть полчаса, хоть день.
     
  10. Levvarrr

    Levvarrr Нуб

    Использую Atmega328p. Частота 1МГц. Питание от батарейки CR2032.
    На плате ещё датчик температуры и датчик напряжения батареи. (Может они потребляют)..... (Это ответ на 50мкА)
     
  11. parovoZZ

    parovoZZ Гуру

    вот и ищи по ключевым словам sleep mode opcode этого режима. Заодно посмотри, что там с ОЗУ в этом режиме - сохраняется оно или нет.
     
  12. parovoZZ

    parovoZZ Гуру

    он-то на кой чёрт?
     
  13. Levvarrr

    Levvarrr Нуб

    Следить за разрядкой батареи... Ну это не совсем датчик... А специальный диод. Все аналитику уже делает ПК.
     
  14. parovoZZ

    parovoZZ Гуру

    В 328 уже есть всё, чтобы следить за напряжением батареи.
     
  15. Levvarrr

    Levvarrr Нуб

    Только работает плохо. Пробовал.... Разброс показателей огромный. Диод как раз и создает стабильное опорное напряжение.
     
  16. b707

    b707 Гуру

    нет там никакого разброса, не выдумывайте. Скорее всего меряете неверно.
    0.01в стабильность легко, а больше для контроля батареи и не нужно
     
    Последнее редактирование: 17 сен 2021
  17. Levvarrr

    Levvarrr Нуб

    Ладно. Вопрос то не про это. Проблема может быть во всем чем угодно при таких малых токах. Вплоть до капли флюса на плате.

    Надо разобраться с RFM69.....

    Оффтоп.
    До RFM69 пользовался nrf24l01. Там потребление всех схемы в режиме сна составляла 70-100 мкА. Этого вполне хватит что бы батарея CR2032 проработала бы как минимум год.
    Но от nrf24l01 пришлось отказаться. То ли мне все время подделки попадаются. То ли ещё что..... Но работать нормально этот передатчик не мог.
    Бывали дни что шлет данные нормально, а бывало он на приемник в 5см передать ничего не может.
     
  18. parovoZZ

    parovoZZ Гуру

    Если это просто температурный сенсор, то это очень много.
     
    b707 нравится это.
  19. b707

    b707 Гуру

    опять вранье
    Емкость CR2032 - 220мАч. При токе 100мкА это 2200 часов - то есть менее 3х месяцев.
    Причем это при условии, что ваша схеме все время спит и вообще ничего не передает.

    Вы очень вольно обращаетесь с данными, наверно поэтому у вас нифига и не работает
     
  20. b707

    b707 Гуру

    товарищ, похоже. цифр вообще не различает. Ему что 10 mкА, . что 10ма - без разницы