Kako povezati ADC HX711 z NRF52832

1. Uvod

Na dnevnem redu je bila naloga razvoja komunikacijskega protokola za mikrokontroler nrf52832 z dvema polmostnimi kitajskimi merilniki napetosti.

Naloga se ni izkazala za enostavno, saj sem se soočal s pomanjkanjem kakršnih koli razumljivih informacij. Bolj verjetno je, da je "koren zla" v samem SDK podjetja Nordic Semiconductor - nenehne posodobitve različic, nekaj odvečnosti in zmedena funkcionalnost. Vse sem moral napisati od začetka.

Mislim, da je ta tema zelo pomembna glede na dejstvo, da ima ta čip sklad BLE in cel niz "dobrot" za način varčevanja z energijo. A ne bom se poglabljal v tehnični del, saj je bilo na to temo napisanih veliko člankov.

2. Opis projekta

Kako povezati ADC HX711 z NRF52832

železo:

  • Adafruit Feather nRF52 Bluefruit LE (kar je bilo pri roki)
  • HX711 ADC
  • Kitajski merilniki napetosti 2 kom. (50x2 kg)
  • Programator ST-LINK V2

Programska oprema:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Programator ST-LINK V2

Vse je v enem projektu, le prilagoditi morate Makefile (določite lokacijo vašega SDK-ja).

3. Opis kode

Za delo s perifernimi napravami na podlagi vezave nalog in dogodkov bomo uporabljali modul GPIOTE ter modul PPI za prenos podatkov z ene periferije na drugo brez sodelovanja procesorja.

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

Konfiguriramo sinhronizacijsko linijo PD_SCL na izhod za generiranje impulzov s trajanjem 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);//включаем таймер
}
 

Podatkovno linijo DOUT konfiguriramo za branje stanja pripravljenosti HX711; če je raven pripravljenosti nizka, se sproži upravljalnik, v katerem onemogočimo prekinitev in zaženemo časovnik za generiranje taktnih impulzov na izhodu 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); 

// omogoči gpiote

Po tem inicializiramo modul PPI in povežemo naš časovnik z izhodom PD_SCL za generiranje impulzov s trajanjem 10 μs, ko pride do primerjalnega dogodka, in vklopimo tudi 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);// срабатывает по сравнению

Inicializiramo ničelni časovnik in njegov upravljalnik.

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

Najbolj zanimiva stvar se zgodi v upravljalniku časovnika. Perioda impulza je 20 μs. Zanimajo nas lihi impulzi (vzdolž naraščajočega roba) in pod pogojem, da njihovo število ni večje od 24, dogodkov pa je 48. Za vsak lihi dogodek se odčita DOUT

Iz podatkovnega lista izhaja, da mora biti število impulzov vsaj 25, kar ustreza ojačenju 128 (v kodi sem uporabil 25 impulzov), to je enako 50 časovnim dogodkom, kar označuje konec podatkovnega okvira.

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

Po tem izklopimo časovnik in obdelamo podatke (v skladu s podatkovnim listom) ter preklopimo HX711 v način nizke porabe energije.


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

Od časovnika RTC pričakujemo dogodke z intervalom 10 s (to je po vaši presoji) in zaženemo HX711 v upravljalniku, kar povzroči prekinitev na liniji DOUT.

Obstaja še ena točka, dnevniki so izhodni preko UART (hitrost prenosa 115200, TX - 6 pinov, RX - 8 pinov) vse nastavitve so v sdk_config.h

Kako povezati ADC HX711 z NRF52832

Ugotovitve

Hvala vsem za vašo pozornost. Upam, da bo ta članek koristen in bo razvijalcem skrajšal dragocen čas za iskanje rešitve. Želim reči, da je tehnični pristop, ki ga Nordic uporablja v svojih platformah, zelo zanimiv z vidika energetske učinkovitosti.

PS

Projekt je še v razvoju, tako da, če je ta tema zanimiva, bom v naslednjem članku poskušal opisati algoritem za kalibracijo senzorjev teže, kot tudi povezovanje sklada BLE.

Materiali

Vir: www.habr.com

Dodaj komentar