Ako pripojiť HX711 ADC k NRF52832

1. úvod

Na programe dňa bola úloha vyvinúť komunikačný protokol pre mikrokontrolér nrf52832 s dvoma polomostovými čínskymi tenzometrami.

Úloha sa ukázala ako neľahká, keďže som sa potýkal s nedostatkom akýchkoľvek zrozumiteľných informácií. Je pravdepodobnejšie, že „koreň zla“ je v samotnom SDK od Nordic Semiconductor – neustále aktualizácie verzií, určitá redundancia a mätúce funkcie. Všetko som musel písať od začiatku.

Myslím si, že táto téma je celkom relevantná na základe skutočnosti, že tento čip má zásobník BLE a celú sadu „dobrôt“ pre režim úspory energie. Nebudem však zachádzať príliš hlboko do technickej časti, pretože na túto tému bolo napísaných veľa článkov.

2. Popis projektu

Ako pripojiť HX711 ADC k NRF52832

Žehlička:

  • Adafruit Feather nRF52 Bluefruit LE (čo bolo náhodou po ruke)
  • HX711 ADC
  • Čínske tenzometre 2 ks. (50 x 2 kg)
  • Programátor ST-LINK V2

Softvér:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Programátor ST-LINK V2

Všetko je v jednom projekte, stačí len doladiť Makefile (špecifikovať umiestnenie vášho SDK).

3. Popis kódu

Modul GPIOTE využijeme na prácu s perifériami na základe viazania úloh a udalostí, ako aj modul PPI na prenos dát z jednej periférie do druhej bez účasti procesora.

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);//настраеваем на выход

Synchronizačnú linku PD_SCL na výstup nakonfigurujeme na generovanie impulzov s trvaním 10 μs.

   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);//включаем таймер
}
 

Dátovú linku DOUT nakonfigurujeme na čítanie stavu pripravenosti HX711; ak je nízka úroveň, spustí sa handler, v ktorom deaktivujeme prerušenie a spustíme časovač na generovanie hodinových impulzov na výstupe PD_SCL.

 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); 

// povoliť gpiote

Potom inicializujeme modul PPI a pripojíme náš časovač na výstup PD_SCL, aby pri výskyte porovnávacej udalosti generoval impulzy s trvaním 10 μs a tiež zapneme modul GPIOTE.


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);// срабатывает по сравнению

Inicializujeme nulový časovač a jeho obsluhu.

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

Najzaujímavejšia vec sa deje v obsluhe časovača. Perióda impulzu je 20 μs. Zaujímajú nás nepárne impulzy (pozdĺž stúpajúcej hrany) a za predpokladu, že ich počet nie je väčší ako 24 a udalostí je 48. Pre každú nepárnu udalosť sa číta DOUT

Z datasheetu vyplýva, že počet impulzov musí byť aspoň 25, čo zodpovedá zosilneniu 128 (v kóde som použil 25 impulzov), to je ekvivalent 50 udalostí časovača, čo indikuje koniec dátového rámca.

 ++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
       }
   

Potom vypneme časovač a spracujeme dáta (podľa datasheetu) a prepneme HX711 do režimu nízkej spotreby.


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);
}

Očakávame udalosti z časovača RTC s intervalom 10 s (toto je na vašom uvážení) a spustíme HX711 v handleri, čo spôsobí prerušenie na linke DOUT.

Je tu ešte jeden bod, protokoly sú na výstupe cez UART (prenosová rýchlosť 115200, TX - 6 pinov, RX - 8 pinov) všetky nastavenia sú v sdk_config.h

Ako pripojiť HX711 ADC k NRF52832

Závery

Ďakujem vám všetkým za pozornosť, dúfam, že tento článok bude užitočný a vývojárom skráti drahocenný čas na nájdenie riešenia. Chcem povedať, že technický prístup, ktorý Nordic používa vo svojich platformách, je celkom zaujímavý z pohľadu energetickej efektívnosti.

PS

Projekt je stále vo vývoji, takže ak je táto téma zaujímavá, v ďalšom článku sa pokúsim popísať algoritmus na kalibráciu snímačov hmotnosti, ako aj pripojenie BLE stacku.

Materiály

Zdroj: hab.com

Pridať komentár