Mar a cheanglas tu HX711 ADC ri NRF52832

1. Ro-ràdh

Air a’ chlàr bha an obair a bhith a’ leasachadh protocol conaltraidh airson an microcontroller nrf52832 le dà shlat-tomhais teann Sìneach leth-drochaid.

Cha robh an obair furasta, oir bha gainnead fiosrachaidh tuigseach sam bith orm. Tha e nas coltaiche gu bheil “freumh an uilc” anns an SDK bho Nordic Semiconductor fhèin - ùrachadh dreach seasmhach, beagan call obrach agus gnìomhachd troimh-chèile. B’ fheudar dhomh a h-uile càil a sgrìobhadh bhon toiseach.

Tha mi a’ smaoineachadh gu bheil an cuspair seo gu math buntainneach stèidhichte air an fhìrinn gu bheil stac BLE aig a ’chip seo agus seata slàn de“ rudan math ”airson modh sàbhalaidh lùtha. Ach cha tèid mi ro dhomhainn a-steach don phàirt theicnigeach, oir chaidh mòran artaigilean a sgrìobhadh air a’ chuspair seo.

2. Tuairisgeul a 'phròiseict

Mar a cheanglas tu HX711 ADC ri NRF52832

Iarann:

  • Adafruit Feather nRF52 Bluefruit LE (dè thachair a bhith ri làimh)
  • HX711 ADC
  • Meudan cuideam Sìneach 2 pcs. (50x2 kg)
  • Prògramadair ST-LINK V2

Bog:

  • IDE VSCODE
  • NRF SDK 16
  • Fosgailte OCD
  • Prògramadair ST-LINK V2

Tha a h-uile dad ann an aon phròiseact, cha leig thu leas ach an Makefile a tweakadh (sònraich far a bheil an SDK agad).

3. Tuairisgeul air a 'chòd

Cleachdaidh sinn am modal GPIOTE gus obrachadh le iomaill stèidhichte air ceangal ghnìomhan is thachartasan, a bharrachd air modal PPI gus dàta a ghluasad bho aon iomall gu fear eile gun a bhith an sàs le pròiseasar.

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

Bidh sinn a’ rèiteachadh an loidhne sioncronaidh PD_SCL ris an toradh gus buillean a ghineadh le fad 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);//включаем таймер
}
 

Bidh sinn a’ rèiteachadh an loidhne dàta DOUT gus staid ullachaidh an HX711 a leughadh; ma tha ìre ìosal ann, tha inneal-làimhseachaidh air a phiobrachadh anns am bi sinn a’ cuir casg air a’ bhriseadh agus a’ tòiseachadh timer gus buillean gleoc a ghineadh aig toradh 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); 

// comas a thoirt do gpiote

Às deidh sin, bidh sinn a’ tòiseachadh am modal PPI agus a ’ceangal an timer againn ris an toradh PD_SCL gus buillean a ghineadh le fad 10 μs nuair a thachras tachartas coimeas, agus cuideachd tionndaidh air modal 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);// срабатывает по сравнению

Tòisichidh sinn an timer neoni agus an inneal-làimhseachaidh aige.

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

Tha an rud as inntinniche a’ tachairt anns an inneal-làimhseachaidh timer. Is e an ùine pulse 20 μs. Tha ùidh againn ann an buillean neònach (air an oir ag èirigh) agus fhad ‘s nach eil an àireamh aca nas motha na 24, agus gu bheil tachartasan 48 ann. Airson gach tachartas neònach, tha DOUT air a leughadh

Bhon duilleag-dàta tha e a’ leantainn gum feum an àireamh de bhuillean a bhith co-dhiù 25, a tha a rèir buannachd 128 (anns a ’chòd chleachd mi 25 buillean), tha seo co-ionann ri tachartasan timer 50, a tha a’ comharrachadh deireadh an fhrèam dàta.

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

Às deidh seo, bidh sinn a’ tionndadh an timer agus a ’giullachd an dàta (a rèir a’ bhileag-dàta) agus ag atharrachadh an HX711 gu modh caitheamh cumhachd ìosal.


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

Tha sinn an dùil tachartasan bhon timer RTC le eadar-ama de 10 s (tha seo a rèir do thoil fhèin) agus an HX711 a chuir air bhog san inneal-làimhseachaidh, ag adhbhrachadh briseadh air loidhne DOUT.

Tha aon phuing eile ann, tha na logaichean air an toirt a-mach tro UART (ìre baud 115200, TX - 6 prìneachan, RX - 8 prìneachan) tha a h-uile suidheachadh ann an sdk_config.h

Mar a cheanglas tu HX711 ADC ri NRF52832

toraidhean

Tapadh leibh uile airson ur n-aire, tha mi an dòchas gum bi an artaigil seo feumail agus gun lughdaich e ùine luachmhor dha luchd-leasachaidh fuasgladh a lorg. Tha mi airson a ràdh gu bheil an dòigh theicnigeach a bhios Nordic a’ cleachdadh anns na h-àrd-chabhsairean aige gu math inntinneach a thaobh èifeachdas lùtha.

PS

Tha am pròiseact fhathast ga leasachadh, mar sin ma tha an cuspair seo inntinneach, anns an ath artaigil feuchaidh mi ri cunntas a thoirt air an algairim airson calibration mothachairean cuideam, a bharrachd air a bhith a’ ceangal an stac BLE.

Материалы

Source: www.habr.com

Cuir beachd ann