Nola konektatu HX711 ADC NRF52832-ra

1. Sarrera

Agendan nrf52832 mikrokontrolagailurako komunikazio protokolo bat garatzea zegoen zubi erdiko Txinako bi tensiometroekin.

Eginkizuna ez zen erraza izan, informazio ulergarririk ezaren aurrean nengoen eta. Litekeena da "gaizkiaren erroa" Nordic Semiconductor beraren SDK-an egotea - etengabeko bertsioen eguneraketak, erredundantzia batzuk eta funtzionaltasun nahasia. Dena hutsetik idatzi behar izan nuen.

Uste dut gai hau nahiko garrantzitsua dela txip honek BLE pila bat eta energia aurrezteko modurako "goodies" multzo oso bat dituelako. Baina ez naiz zati teknikoan gehiegi sakonduko, gai honi buruz artikulu asko idatzi baitira.

2. Proiektuaren deskribapena

Nola konektatu HX711 ADC NRF52832-ra

Plantxa:

  • Adafruit Feather nRF52 Bluefruit LE (eskura zegoena)
  • ADC HX711
  • Txinako tensioneurgailuak 2 pcs. (50x2 kg)
  • ST-LINK V2 programatzailea

Softwarea:

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

Dena proiektu bakarrean dago, Makefile-a moldatu besterik ez duzu egin behar (zehaztu zure SDK-aren kokapena).

3. Kodearen deskribapena

GPIOTE modulua periferikoekin lan egiteko erabiliko dugu zereginen eta gertaeren loturan oinarrituta, baita PPI modulua periferiko batetik bestera datuak prozesadore baten parte-hartzerik gabe transferitzeko.

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);//настраСваСм Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄

PD_SCL sinkronizazio-lerroa irteeran konfiguratzen dugu 10 ΞΌs-ko iraupena duten pultsuak sortzeko.

   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);//Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
}
 

DOUT datu-lerroa konfiguratzen dugu HX711-aren prestasun-egoera irakurtzeko; maila baxua badago, kudeatzaile bat abiarazten da eta bertan etenaldia desgaitu eta tenporizadore bat abiarazten dugu PD_SCL irteeran erloju-pultsuak sortzeko.

 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 gaitu

Horren ostean, PPI modulua hasieratzen dugu eta gure tenporizadorea PD_SCL irteerara konektatzen dugu, konparazio gertaera bat gertatzen denean 10 ΞΌs-ko iraupena duten pultsuak sortzeko, eta GPIOTE modulua ere pizten dugu.


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);// срабатываСт ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ

Zero tenporizadorea eta bere kudeatzailea hasieratzen ditugu.

  if(m_counter%2 != 0 && m_counter<=48){
       buffer <<= 1;// пСрСмСнная считанных Π΄Π°Π½Ρ‹Ρ…
        c_counter++;// счСтчик ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…  ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠ²
           if(nrf_gpio_pin_read(DOUT))buffer++;//считываСм состояниС Π²Ρ…ΠΎΠ΄Π°
   }

Gauzarik interesgarriena tenporizadorearen kudeatzailean gertatzen da. Pultsuaren periodoa 20 ΞΌs-koa da. Pultsu bakoitiak interesatzen zaizkigu (goranzko ertzean) eta haien kopurua 24 baino gehiago ez bada eta 48 gertaera badaude. Gertaera bakoiti bakoitzeko, DOUT irakurtzen da.

Datu-orritik ondorioztatzen da pultsu kopurua gutxienez 25 izan behar dela, hau da, 128ko irabaziari dagokiona (25 pultsu erabili ditudan kodean), hau 50 tenporizadore-gertaeraren baliokidea da, eta horrek datu-markoaren amaiera adierazten du.

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

Horren ondoren, tenporizadorea itzali eta datuak prozesatzen ditugu (fitxategiaren arabera) eta HX711 energia kontsumo baxuko modura aldatzen dugu.


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

RTC tenporizadoretik gertaerak espero ditugu 10 s-ko tartearekin (zure erabakian dago) eta HX711 abiarazi kudeatzailean, DOUT lerroan eten bat eraginez.

Puntu bat gehiago dago, erregistroak UART bidez ateratzen dira (baud-tasa 115200, TX - 6 pin, RX - 8 pin) ezarpen guztiak sdk_config.h-n daude

Nola konektatu HX711 ADC NRF52832-ra

Findings

Eskerrik asko guztioi arretagatik, espero dut artikulu hau erabilgarria izatea eta garatzaileek irtenbide bat bilatzeko denbora baliotsua murriztea. Esan nahi dut Nordic-ek bere plataformetan erabiltzen duen ikuspegi teknikoa nahiko interesgarria dela energia-eraginkortasunaren ikuspuntutik.

PS

Proiektua oraindik garatzen ari da, beraz, gai hau interesgarria bada, hurrengo artikuluan pisu-sentsoreak kalibratzeko algoritmoa deskribatzen saiatuko naiz, baita BLE pila konektatzen ere.

Materialak

Iturria: www.habr.com

Gehitu iruzkin berria