Тестовый скетч контроля пониженного энергопотребления в режиме сна с прерываниями для nRF52

Ответить
Berkseo
Сообщения: 56
Зарегистрирован: Вт янв 24, 2017 12:30 am
Благодарил (а): 6 раз
Поблагодарили: 22 раза

Тестовый скетч контроля пониженного энергопотребления в режиме сна с прерываниями для nRF52

Сообщение Berkseo » Пн фев 25, 2019 10:10 pm

https://youtu.be/vcou4tGG4dE

7мА в режиме передачи для модулей на схеме DC-DC
16мА в режиме передачи для модулей на схеме LDO

2мкА во сне

Код: Выделить всё

/**
ТЕСТОВЫЙ СКЕТЧ КОНТРОЛЯ ПОНИЖЕННОГО ЭНЕРГОПОТРЕБЛЕНИЯ В РЕЖИМЕ СНА С ПРЕРЫВАНИЯМИ

После загрузки скетча рекомендуется сбросить питание с модуля.
*/

#define MY_RADIO_NRF5_ESB
#define MY_PASSIVE_NODE
#define MY_NODE_ID 100
#define MY_LED 27
#define MY_BUTTON_ADC_PIN 1 // номер пина АЦП смотреть в MyBoardNRF5.cpp
#include <MySensors.h>
bool detection;

void preHwInit() {
pinMode(MY_LED, OUTPUT);  
}

void before()
{
NRF_POWER->DCDCEN = 1; // закоментировать если E73
NRF_UART0->ENABLE = 0;  
}

void setup() {
  analogReference(AR_INTERNAL);
  lpComp();
  led(2,1);
  detection = false;
  wait(5000);
}

void loop() {
  sleep(10000);
  if (detection) {
    s_lpComp();
    led(10,3);
    detection=false;
    NRF_LPCOMP->EVENTS_UP=0;
    r_lpComp();
  } else {
    led(1,1);
  }
}


void led(uint8_t flash, uint8_t iteration) {
  for (int x = 0; x < iteration; x++) {
    for (int i=0; i < flash; i++) {
      digitalWrite(MY_LED, HIGH);
      wait(30);
      digitalWrite(MY_LED, LOW);
      wait(70);
    }    
      wait(500);
  }
}

void lpComp() {
  NRF_LPCOMP->PSEL=MY_BUTTON_ADC_PIN;
  NRF_LPCOMP->ANADETECT=1; // детектирование EVENTS_UP.
  NRF_LPCOMP->INTENSET=B0100; // активация прерывания для EVENTS_UP
  NRF_LPCOMP->ENABLE=1;
  NRF_LPCOMP->TASKS_START=1;
  NVIC_SetPriority(LPCOMP_IRQn, 15);
  NVIC_ClearPendingIRQ(LPCOMP_IRQn);
  NVIC_EnableIRQ(LPCOMP_IRQn);
}

void s_lpComp() {
  if ((NRF_LPCOMP->ENABLE) && (NRF_LPCOMP->EVENTS_READY)) {
    NRF_LPCOMP->INTENCLR=B0100; //деактивация прерывания для LPCOMP
  }
}

void r_lpComp() {
  NRF_LPCOMP->INTENSET=B0100;
}

#if __CORTEX_M == 0x04
#define NRF5_RESET_EVENT(event)                                                 \
        event = 0;                                                                   \
        (void)event
#else
#define NRF5_RESET_EVENT(event) event = 0
#endif

//В одну строку..
extern "C" { void LPCOMP_IRQHandler(void) {detection=true; NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_UP); NRF_LPCOMP->EVENTS_UP=0; MY_HW_RTC->CC[0]=(MY_HW_RTC->COUNTER+2);}}
ДОБАВЛЯЕМСЯ В ТЕЛЕГРАМ, ТАМ ВЕСЕЛО(СЕЙЧАС ДЕЛАЕМ НАРОДНЫЙ ДИМЕР) - https://t.me/mysensors_rus
За это сообщение автора Berkseo поблагодарил:
lanket (Пт мар 01, 2019 7:12 am)
Рейтинг: 1.16%
Ответить