Hoe om HX711 ADC aan NRF52832 te koppel

1. inleiding

Op die agenda was die taak om 'n kommunikasieprotokol vir die nrf52832 mikrobeheerder met twee halfbrug Chinese rekmeters te ontwikkel.

Die taak blyk nie maklik te wees nie, aangesien ek gekonfronteer is met 'n gebrek aan enige verstaanbare inligting. Dit is meer waarskynlik dat die "wortel van kwaad" in die SDK van Nordic Semiconductor self is - konstante weergawe-opdaterings, 'n mate van oortolligheid en verwarrende funksionaliteit. Ek moes alles van voor af skryf.

Ek dink hierdie onderwerp is redelik relevant, gebaseer op die feit dat hierdie skyfie 'n BLE-stapel en 'n hele stel "goedere" het vir energiebesparingsmodus. Maar ek gaan nie te diep in die tegniese deel nie, aangesien baie artikels oor hierdie onderwerp geskryf is.

2. Projekbeskrywing

Hoe om HX711 ADC aan NRF52832 te koppel

Yster:

  • Adafruit Feather nRF52 Bluefruit LE (wat toevallig byderhand was)
  • HX711 ADC
  • Chinese rekmeters 2 stuks. (50x2 kg)
  • Programmeerder ST-LINK V2

Sagteware:

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

Alles is in een projek, jy hoef net die Makefile aan te pas (spesifiseer die ligging van jou SDK).

3. Beskrywing van die kode

Ons sal die GPIOTE-module gebruik om met randapparatuur te werk gebaseer op die binding van take en gebeure, sowel as die PPI-module om data van een randapparaat na 'n ander oor te dra sonder die deelname van 'n verwerker.

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

Ons konfigureer die PD_SCL-sinchronisasielyn na die uitset om pulse te genereer met 'n duur van 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);//Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
}
 

Ons konfigureer die DOUT-datalyn om die gereedheidstoestand van die HX711 te lees; as daar 'n lae vlak is, word 'n hanteerder geaktiveer waarin ons die onderbreking deaktiveer en 'n timer begin om klokpulse by die PD_SCL-uitset te genereer.

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

// aktiveer gpiote

Daarna inisialiseer ons die PPI-module en koppel ons timer aan die PD_SCL-uitset om pulse met 'n duur van 10 ΞΌs te genereer wanneer 'n vergelykingsgebeurtenis plaasvind, en skakel ook die GPIOTE-module aan.


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

Ons inisialiseer die nul-timer en sy hanteerder.

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

Die interessantste ding gebeur in die timer hanteerder. Die polsperiode is 20 ΞΌs. Ons stel belang in onewe pulse (langs die stygende rand) en mits hul getal nie meer as 24 is nie, en daar 48 gebeurtenisse is. Vir elke onewe gebeurtenis word DOUT gelees

Uit die datablad volg dit dat die aantal pulse ten minste 25 moet wees, wat ooreenstem met 'n wins van 128 (in die kode het ek 25 pulse gebruik), dit is gelykstaande aan 50 timergebeure, wat die einde van die dataraam aandui.

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

Hierna skakel ons die timer af en verwerk die data (volgens die datablad) en skakel die HX711 oor na lae kragverbruikmodus.


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

Ons verwag gebeure van die RTC-tydteller met 'n interval van 10 s (dit is na u goeddunke) en begin die HX711 in die hanteerder, wat 'n onderbreking op die DOUT-lyn veroorsaak.

Daar is nog een punt, die logs word uitgevoer via UART (baudrate 115200, TX - 6 penne, RX - 8 penne) alle instellings is in sdk_config.h

Hoe om HX711 ADC aan NRF52832 te koppel

Bevindinge

Dankie almal vir u aandag, ek hoop dat hierdie artikel nuttig sal wees en waardevolle tyd sal verminder vir ontwikkelaars om 'n oplossing te vind. Ek wil sΓͺ dat die tegniese benadering wat Nordic in sy platforms gebruik, nogal interessant is uit die oogpunt van energiedoeltreffendheid.

PS

Die projek is nog in ontwikkeling, so as hierdie onderwerp van belang is, sal ek in die volgende artikel probeer om die algoritme vir die kalibrering van gewigsensors te beskryf, asook om die BLE-stapel te verbind.

Materiale

Bron: will.com

Voeg 'n opmerking