Hvernig á að tengja HX711 ADC við NRF52832

1. Inngangur

Á dagskrá var það verkefni að þróa samskiptareglur fyrir nrf52832 örstýringuna með tveimur hálfbrúar kínverskum álagsmælum.

Verkefnið reyndist ekki auðvelt, þar sem ég stóð frammi fyrir skorti á öllum skiljanlegum upplýsingum. Það er líklegra að "rót hins illa" sé í sjálfu Nordic Semiconductor SDK - þetta eru stöðugar útgáfuuppfærslur, einhver offramboð og ranghala virkni. Ég þurfti að skrifa allt frá grunni.

Ég held að þetta efni sé alveg viðeigandi, í ljósi þess að þessi flís er með BLE stafla og fullt sett af góðgæti í orkusparnaðarhamnum. En ég mun ekki fara djúpt í tæknilega hlutann, þar sem margar greinar hafa verið skrifaðar um þetta efni.

2. Lýsing á verkefninu

Hvernig á að tengja HX711 ADC við NRF52832

Járn:

  • Adafruit Feather nRF52 Bluefruit LE (það sem varð fyrir hendi)
  • ADC HX711
  • Kínverskar hleðslufrumur 2 stk. (50x2 kg)
  • Forritari ST-LINK V2

Hugbúnaður:

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

Allt er í einu verkefni, allt sem þú þarft að gera er að hakka inn Makefile (tilgreindu staðsetningu SDK þinnar).

3. Lýsing á kóðanum

Við munum nota GPIOTE-eininguna til að vinna með jaðartæki sem byggir á bindingu verkefna og atburða, sem og PPI-eininguna til að flytja gögn frá einu jaðartæki til annars án þátttöku örgjörvans.

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

Við stillum PD_SCL samstillingarlínuna á úttakið til að búa til púls með lengd 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);//включаем таймер
}
 

Við stillum DOUT gagnalínuna til að lesa HX711 tilbúið ástand, ef það er lágt stig er meðhöndlun kveikt þar sem við slökkva á trufluninni og hefja tímamæli til að búa til klukkupúlsa við PD_SCL úttakið.

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

// virkjaðu gpiote

Eftir það frumstillum við PPI eininguna og skiptum tímamælinum okkar yfir á PD_SCL úttakið til að búa til púls með lengd 10 μs þegar samanburðaratburður á sér stað, og kveikjum einnig á GPIOTE einingunni.


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

Við frumstillum núlltímamælirinn og meðhöndlun hans.

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

Það áhugaverðasta gerist í tímamælinum. Púlstímabilið er 20 μs. Við höfum áhuga á oddapúlsum (á hækkandi brún) og að því tilskildu að fjöldi þeirra sé ekki meira en 24, og atburðum - 48. Fyrir hvern oddaviðburð er DOUT lesinn

Það leiðir af gagnablaðinu að fjöldi púlsa verður að vera að minnsta kosti 25, sem samsvarar 128 ávinningi (í kóðanum notaði ég 25 púls), þetta jafngildir 50 tímamælisviðburðum, sem gefur til kynna lok gagnarammans.

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

Eftir það slökkvum við á tímamælinum og vinnum úr gögnunum (samkvæmt gagnablaðinu) og setjum HX711 í lágstyrksstillingu.


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

Við erum að bíða eftir atburðum frá RTC tímamælinum með 10 s millibili (þessi er undir þér komið) í meðhöndluninni, við ræsum HX711, sem veldur truflun á DOUT línunni.

Það er eitt enn, annálarnir eru sendir út í gegnum UART (baud rate 115200, TX - 6 pinnar, RX - 8 pinnar) allar stillingar eru í sdk_config.h

Hvernig á að tengja HX711 ADC við NRF52832

Niðurstöður

Þakka ykkur öllum fyrir athygli ykkar, ég vona að þessi grein verði gagnleg og dragi úr dýrmætum tíma fyrir þróunaraðila til að finna lausn. Ég vil segja að tæknilega nálgunin sem Nordic notar á vettvangi sínum er nokkuð áhugaverð hvað varðar orkunýtingu.

PS

Verkefnið er enn í þróun, svo ef þetta efni er áhugavert, mun ég í næstu grein reyna að lýsa reikniritinu til að kvarða þyngdarskynjara, auk þess að tengja BLE stafla.

Efni

Heimild: www.habr.com

Bæta við athugasemd