Paano ikonekta ang HX711 ADC sa NRF52832

1. Panimula

Sa agenda ay ang gawain ng pagbuo ng isang protocol ng komunikasyon para sa nrf52832 microcontroller na may dalawang half-bridge Chinese strain gauge.

Ang gawain ay naging hindi madali, dahil ako ay nahaharap sa kakulangan ng anumang naiintindihan na impormasyon. Mas malamang na ang "ugat ng kasamaan" ay nasa SDK mula mismo sa Nordic Semiconductor - patuloy na pag-update ng bersyon, ilang redundancy at nakakalito na functionality. Kinailangan kong isulat ang lahat mula sa simula.

Sa tingin ko ang paksang ito ay medyo may kaugnayan batay sa katotohanan na ang chip na ito ay may BLE stack at isang buong hanay ng mga "goodies" para sa energy saving mode. Ngunit hindi ako magpapalalim sa teknikal na bahagi, dahil maraming mga artikulo ang naisulat sa paksang ito.

2. Paglalarawan ng proyekto

Paano ikonekta ang HX711 ADC sa NRF52832

bakal:

  • Adafruit Feather nRF52 Bluefruit LE (kung ano ang nangyari sa kamay)
  • HX711 ADC
  • Chinese strain gauge 2 pcs. (50x2 kg)
  • Programmer ST-LINK V2

Software:

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

Ang lahat ay nasa isang proyekto, kailangan mo lang i-tweak ang Makefile (tukuyin ang lokasyon ng iyong SDK).

3. Paglalarawan ng code

Gagamitin namin ang module ng GPIOTE upang gumana sa mga peripheral batay sa pagkakatali ng mga gawain at kaganapan, pati na rin ang module ng PPI upang maglipat ng data mula sa isang peripheral patungo sa isa pa nang walang partisipasyon ng isang processor.

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

Kino-configure namin ang linya ng pag-synchronize ng PD_SCL sa output upang makabuo ng mga pulso na may tagal na 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);//Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
}
 

Kino-configure namin ang linya ng data ng DOUT para basahin ang estado ng pagiging handa ng HX711; kung mayroong mababang antas, ma-trigger ang isang handler kung saan hindi namin pinapagana ang interrupt at magsisimula ng timer upang makabuo ng mga pulso ng orasan sa output ng 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); 

// paganahin ang gpiote

Pagkatapos nito, sinisimulan namin ang module ng PPI at ikinonekta ang aming timer sa output ng PD_SCL upang makabuo ng mga pulso na may tagal na 10 ΞΌs kapag may nangyaring paghahambing, at i-on din ang module ng 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);// срабатываСт ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ

Sinisimulan namin ang zero timer at ang handler nito.

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

Ang pinaka-kagiliw-giliw na bagay ay nangyayari sa timer handler. Ang panahon ng pulso ay 20 ΞΌs. Interesado kami sa mga kakaibang pulso (sa kahabaan ng tumataas na gilid) at sa kondisyon na ang kanilang bilang ay hindi hihigit sa 24, at mayroong 48 na kaganapan. Para sa bawat kakaibang kaganapan, binabasa ang DOUT

Mula sa datasheet ito ay sumusunod na ang bilang ng mga pulso ay dapat na hindi bababa sa 25, na tumutugma sa isang pakinabang ng 128 (sa code na ginamit ko 25 pulses), ito ay katumbas ng 50 mga kaganapan sa timer, na nagpapahiwatig ng pagtatapos ng frame ng data.

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

Pagkatapos nito, pinapatay namin ang timer at pinoproseso ang data (ayon sa datasheet) at inililipat ang HX711 sa low power consumption mode.


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

Inaasahan namin ang mga kaganapan mula sa timer ng RTC na may pagitan na 10 s (nasa iyong pagpapasya) at ilulunsad ang HX711 sa handler, na magdulot ng pagkaantala sa linya ng DOUT.

May isa pang punto, ang mga log ay output sa pamamagitan ng UART (baud rate 115200, TX - 6 pins, RX - 8 pins) lahat ng mga setting ay nasa sdk_config.h

Paano ikonekta ang HX711 ADC sa NRF52832

Natuklasan

Salamat sa iyong lahat para sa iyong pansin, umaasa ako na ang artikulong ito ay magiging kapaki-pakinabang at magbabawas ng mahalagang oras para sa mga developer na makahanap ng solusyon. Gusto kong sabihin na ang teknikal na diskarte na ginagamit ng Nordic sa mga platform nito ay medyo kawili-wili mula sa punto ng view ng kahusayan ng enerhiya.

PS

Ang proyekto ay nasa ilalim pa rin ng pag-unlad, kaya kung ang paksang ito ay interesado, sa susunod na artikulo ay susubukan kong ilarawan ang algorithm para sa pag-calibrate ng mga sensor ng timbang, pati na rin ang pagkonekta sa BLE stack.

kagamitan

Pinagmulan: www.habr.com

Magdagdag ng komento