Jinsi ya kuunganisha HX711 ADC kwa NRF52832

1. Utangulizi

Katika ajenda ilikuwa ni kazi ya kutengeneza itifaki ya mawasiliano kwa kidhibiti kidogo cha nrf52832 chenye viwango viwili vya kupima nusu-daraja vya Kichina.

Kazi hiyo haikuwa rahisi, kwani nilikabiliwa na ukosefu wa habari yoyote inayoeleweka. Kuna uwezekano zaidi kwamba "mzizi wa uovu" uko kwenye SDK kutoka kwa Nordic Semiconductor yenyewe - masasisho ya mara kwa mara ya toleo, upungufu na utendaji unaotatanisha. Ilinibidi kuandika kila kitu kutoka mwanzo.

Nadhani mada hii inafaa kabisa kulingana na ukweli kwamba chip hii ina mkusanyiko wa BLE na seti nzima ya "vizuri" kwa hali ya kuokoa nishati. Lakini sitaingia sana katika sehemu ya kiufundi, kwa kuwa makala nyingi zimeandikwa juu ya mada hii.

2. Maelezo ya mradi

Jinsi ya kuunganisha HX711 ADC kwa NRF52832

chuma:

  • Unyoya wa Adafruit nRF52 Bluefruit LE (nini kilifanyika kuwa karibu)
  • HX711 ADC
  • Vipimo vya aina ya Kichina 2 pcs. (kilo 50x2)
  • Kipanga programu ST-LINK V2

Programu:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Kipanga programu ST-LINK V2

Kila kitu kiko katika mradi mmoja, lazima tu ubadilishe Makefile (taja eneo la SDK yako).

3. Maelezo ya kanuni

Tutatumia moduli ya GPIOTE kufanya kazi na vifaa vya pembeni kulingana na ufungaji wa kazi na matukio, pamoja na moduli ya PPI kuhamisha data kutoka kwa pembeni moja hadi nyingine bila ushiriki wa kichakataji.

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

Tunasanidi laini ya ulandanishi ya PD_SCL kwenye pato ili kutoa mipigo kwa muda wa 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);//Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
}
 

Tunasanidi laini ya data ya DOUT ili kusoma hali ya utayari wa HX711; ikiwa kuna kiwango cha chini, kidhibiti kinaanzishwa ambapo tunazima ukatizaji na kuwasha kipima muda ili kutoa mipigo ya saa kwenye pato la 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); 

// wezesha gpiote

Baada ya hapo, tunaanzisha moduli ya PPI na kuunganisha kipima muda kwenye pato la PD_SCL ili kuzalisha mipigo kwa muda wa 10 ΞΌs tukio la kulinganisha linapotokea, na pia kuwasha moduli ya 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);// срабатываСт ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ

Tunaanzisha kipima saa cha sifuri na kidhibiti chake.

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

Jambo la kufurahisha zaidi hufanyika katika kidhibiti cha saa. Kipindi cha mapigo ni 20 ΞΌs. Tunavutiwa na mipigo isiyo ya kawaida (kando ya ukingo unaoinuka) na mradi idadi yao si zaidi ya 24, na kuna matukio 48. Kwa kila tukio lisilo la kawaida, DOUT inasomwa.

Kutoka kwa hifadhidata inafuata kwamba idadi ya mapigo lazima iwe angalau 25, ambayo inalingana na faida ya 128 (katika msimbo nilitumia mapigo 25), hii ni sawa na matukio 50 ya timer, ambayo inaonyesha mwisho wa sura ya 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
       }
   

Baada ya hayo, tunazima timer na kusindika data (kulingana na hifadhidata) na kubadili HX711 kwa hali ya chini ya matumizi ya nguvu.


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

Tunatarajia matukio kutoka kwa kipima muda cha RTC na muda wa 10 s (hii ni kwa hiari yako) na kuzindua HX711 katika kidhibiti, na kusababisha usumbufu kwenye laini ya DOUT.

Kuna hatua moja zaidi, magogo hutolewa kupitia UART (kiwango cha baud 115200, TX - 6 pini, RX - 8 pini) mipangilio yote iko kwenye sdk_config.h

Jinsi ya kuunganisha HX711 ADC kwa NRF52832

Matokeo

Asanteni nyote kwa mawazo yenu, natumaini makala hii itakuwa muhimu na itapunguza muda wa thamani kwa watengenezaji kupata suluhisho. Ninataka kusema kwamba mbinu ya kiufundi ambayo Nordic hutumia katika majukwaa yake ni ya kuvutia kabisa kutoka kwa mtazamo wa ufanisi wa nishati.

PS

Mradi bado unaendelezwa, hivyo ikiwa mada hii ni ya kupendeza, katika makala inayofuata nitajaribu kuelezea algorithm ya kupima sensorer za uzito, na pia kuunganisha stack ya BLE.

Vifaa

Chanzo: mapenzi.com

Kuongeza maoni