A HX711 ADC csatlakoztatása az NRF52832-hez

1. Bevezetés

Napirenden volt a két félhíd kínai nyúlásmérővel ellátott nrf52832 mikrokontroller kommunikációs protokolljának kidolgozása.

A feladat nem bizonyult könnyűnek, mivel minden érthető információ hiányával szembesültem. Valószínűbb, hogy a „gonosz gyökere” magában a Nordic Semiconductor SDK-jában van – állandó verziófrissítések, némi redundancia és zavaró funkciók. Mindent a nulláról kellett leírnom.

Szerintem ez a téma eléggé aktuális abból a tényből kiindulva, hogy ez a chip rendelkezik egy BLE stackgel és egy egész sor „finomságokkal” az energiatakarékos módhoz. De nem megyek bele túlságosan a technikai részbe, mivel sok cikk született már ebben a témában.

2. A projekt leírása

A HX711 ADC csatlakoztatása az NRF52832-hez

Vas:

  • Adafruit Feather nRF52 Bluefruit LE (ami véletlenül kéznél volt)
  • HX711 ADC
  • Kínai nyúlásmérők 2 db. (50x2 kg)
  • Programozó ST-LINK V2

Szoftver:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Programozó ST-LINK V2

Minden egy projektben van, csak módosítania kell a Makefile-t (adja meg az SDK helyét).

3. A kód leírása

A GPIOTE modult fogjuk használni a perifériákkal való munkavégzéshez a feladatok és események összerendelése alapján, valamint a PPI modult az adatok egyik perifériáról a másikra való átvitelére processzor részvétele nélkül.

ret_code_t err_code;
   err_code = nrf_drv_gpiote_out_init(PD_SCK, &config);//настраеваем на выход
   nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false);//будем передергивать пин для импульса
   err_code = nrf_drv_gpiote_out_init(PD_SCK, &config);//настраеваем на выход

A PD_SCL szinkronizációs vonalat úgy állítjuk be a kimenetre, hogy 10 μs időtartamú impulzusokat generáljon.

   nrf_drv_gpiote_in_config_t  gpiote_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(false);// переход уровня с высокого на низкий
   nrf_gpio_cfg_input(DOUT, NRF_GPIO_PIN_NOPULL);// на вход без подтяжки
   err_code = nrf_drv_gpiote_in_init(DOUT, &gpiote_config, gpiote_evt_handler); 

static void gpiote_evt_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
    nrf_drv_gpiote_in_event_disable(DOUT);//отключаем прерывание
    nrf_drv_timer_enable(&m_timer0);//включаем таймер
}
 

A DOUT adatvonalat úgy konfiguráljuk, hogy olvassa a HX711 készenléti állapotát; ha alacsony a szint, akkor egy kezelő aktiválódik, amelyben letiltjuk a megszakítást és elindítunk egy időzítőt, amely óraimpulzusokat generál a PD_SCL kimeneten.

 err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel1);
   APP_ERROR_CHECK(err_code);
   err_code = nrf_drv_ppi_channel_assign(m_ppi_channel1,                                         nrf_drv_timer_event_address_get(&m_timer0, NRF_TIMER_EVENT_COMPARE0),                                           nrf_drv_gpiote_out_task_addr_get(PD_SCK));// подключаем таймер к выходу
   APP_ERROR_CHECK(err_code);
   err_code = nrf_drv_ppi_channel_enable(m_ppi_channel1);// включаем канал
   APP_ERROR_CHECK(err_code);
   nrf_drv_gpiote_out_task_enable(PD_SCK); 

// gpiote engedélyezése

Ezt követően inicializáljuk a PPI modult, és csatlakoztatjuk az időzítőnket a PD_SCL kimenethez, hogy összehasonlító esemény esetén 10 μs időtartamú impulzusokat generáljunk, és bekapcsoljuk a GPIOTE modult is.


nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;// по умолчанию
   timer_cfg.frequency = NRF_TIMER_FREQ_1MHz;// тактируем на частоте 1Мгц
   ret_code_t err_code = nrf_drv_timer_init(&m_timer0, &timer_cfg, timer0_event_handler);
   APP_ERROR_CHECK(err_code);
   nrf_drv_timer_extended_compare(&m_timer0,
                                  NRF_TIMER_CC_CHANNEL0,
                                  nrf_drv_timer_us_to_ticks(&m_timer0,
                                                            10),
                                  NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
                                  true);// срабатывает по сравнению

Inicializáljuk a nulla időzítőt és kezelőjét.

  if(m_counter%2 != 0 && m_counter<=48){
       buffer <<= 1;// переменная считанных даных
        c_counter++;// счетчик положительных  импульсов
           if(nrf_gpio_pin_read(DOUT))buffer++;//считываем состояние входа
   }

A legérdekesebb dolog az időzítő kezelőjében történik. Az impulzus periódusa 20 μs. Érdekelnek minket a páratlan impulzusok (a felfutó él mentén), feltéve, hogy számuk nem több 24-nél, és 48 esemény van. Minden páratlan eseménynél a DOUT kiolvasásra kerül

Az adatlapból az következik, hogy az impulzusok számának legalább 25-nek kell lennie, ami 128-as erősítésnek felel meg (a kódban 25 impulzust használtam), ez 50 időzítő eseménynek felel meg, ami az adatkeret végét jelzi.

 ++m_counter;// счетчик событий
if(m_counter==50){
      nrf_drv_timer_disable(&m_timer0);// отключаем таймер
       m_simple_timer_state = SIMPLE_TIMER_STATE_STOPPED;//
       buffer = buffer ^ 0x800000;
       hx711_stop();//jотключаем hx711
       }
   

Ezt követően kikapcsoljuk az időzítőt és feldolgozzuk az adatokat (az adatlap szerint) és a HX711-et alacsony fogyasztású üzemmódba kapcsoljuk.


static void repeated_timer_handler(void * p_context)
{
   nrf_drv_gpiote_out_toggle(LED_2);
   if(m_simple_timer_state == SIMPLE_TIMER_STATE_STOPPED){
      	hx711_start();// включаем hx711
       nrf_drv_gpiote_out_toggle(LED_1);
       m_simple_timer_state = SIMPLE_TIMER_STATE_STARTED;
   }
  
}
/**@brief Create timers.
*/
static void create_timers()
{
   ret_code_t err_code;
 
   // Create timers
   err_code = app_timer_create(&m_repeated_timer_id,
                               APP_TIMER_MODE_REPEATED,
                               repeated_timer_handler);
   APP_ERROR_CHECK(err_code);
}

Az RTC időzítőtől 10 másodperces időközönként várunk eseményeket (ez az Ön belátása szerint történik), és elindítja a HX711-et a kezelőben, ami megszakítást okoz a DOUT vonalon.

Van még egy pont, a naplók UART-on keresztül kerülnek kiadásra (baud rate 115200, TX - 6 pins, RX - 8 pins) minden beállítás az sdk_config.h-ban van

A HX711 ADC csatlakoztatása az NRF52832-hez

Álláspontja

Köszönöm mindenkinek a figyelmet, remélem, ez a cikk hasznos lesz, és csökkenti a fejlesztők számára a megoldás megtalálására fordított értékes időt. Azt akarom mondani, hogy az a technikai megközelítés, amelyet a Nordic a platformjain alkalmaz, igen érdekes az energiahatékonyság szempontjából.

PS

A projekt még fejlesztés alatt áll, így ha ez a téma érdekel, a következő cikkben megpróbálom leírni a súlyérzékelők kalibrálásának algoritmusát, valamint a BLE verem csatlakoztatását.

anyagok

Forrás: will.com

Hozzászólás