Kuinka liittää HX711 ADC NRF52832:een

1. Esittely

Esityslistalla oli tiedonsiirtoprotokollan kehittäminen mikrokontrollerille nrf52832 kahdella puolisillalla kiinalaisella venymämittarilla.

Tehtävä ei osoittautunut helpoksi, koska minulla ei ollut mitään ymmärrettävää tietoa. On todennäköisempää, että "pahan juuri" on itse Nordic Semiconductorin SDK:ssa - jatkuvat versiopäivitykset, jonkin verran redundanssia ja hämmentäviä toimintoja. Minun piti kirjoittaa kaikki tyhjästä.

Mielestäni tämä aihe on varsin relevantti sen perusteella, että tässä sirussa on BLE-pino ja koko joukko "herkkuja" energiansäästötilaan. Mutta en mene liian syvälle tekniseen osaan, koska tästä aiheesta on kirjoitettu monia artikkeleita.

2. Hankkeen kuvaus

Kuinka liittää HX711 ADC NRF52832:een

Rauta:

  • Adafruit Feather nRF52 Bluefruit LE (mikä sattui olemaan käsillä)
  • HX711 ADC
  • Kiinalaiset venymämittarit 2 kpl. (50x2 kg)
  • Ohjelmoija ST-LINK V2

Ohjelmisto:

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

Kaikki on yhdessä projektissa, sinun on vain säädettävä Makefileä (määritä SDK:n sijainti).

3. Koodin kuvaus

Käytämme GPIOTE-moduulia työskennelläksemme oheislaitteiden kanssa tehtävien ja tapahtumien sitomisen perusteella, sekä PPI-moduulia tietojen siirtämiseen oheislaitteesta toiseen ilman prosessorin osallistumista.

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

Konfiguroimme PD_SCL-synkronointilinjan lähtöön generoimaan pulsseja, joiden kesto on 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);//включаем таймер
}
 

Konfiguroimme DOUT-datalinjan lukemaan HX711:n valmiustilan; jos taso on alhainen, laukeaa käsittelijä, jossa poistamme keskeytyksen ja käynnistämme ajastimen, joka tuottaa kellopulsseja PD_SCL-lähtöön.

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

// ota gpiote käyttöön

Sen jälkeen alustamme PPI-moduulin ja kytkemme ajastimemme PD_SCL-lähtöön luodaksemme pulsseja, joiden kesto on 10 μs, kun vertailutapahtuma tapahtuu, ja käynnistämme myös GPIOTE-moduulin.


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

Alustamme nollaajastimen ja sen käsittelijän.

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

Mielenkiintoisin asia tapahtuu ajastimen käsittelijässä. Pulssijakso on 20 μs. Olemme kiinnostuneita parittomista pulsseista (nousevaa reunaa pitkin) ja edellyttäen, että niiden lukumäärä on enintään 24 ja tapahtumia on 48. Jokaisesta parittomasta tapahtumasta luetaan DOUT

Tietolomakkeesta seuraa, että pulssien lukumäärän tulee olla vähintään 25, mikä vastaa vahvistusta 128 (koodissa käytin 25 pulssia), tämä vastaa 50 ajastintapahtumaa, mikä osoittaa datakehyksen päättymisen.

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

Tämän jälkeen sammutamme ajastimen ja käsittelemme tiedot (tietolomakkeen mukaan) ja kytkemme HX711:n alhaisen virrankulutuksen tilaan.


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

Odotamme tapahtumia RTC-ajastimelta 10 sekunnin välein (tämä on sinun harkintasi) ja käynnistämme HX711:n käsittelijässä aiheuttaen keskeytyksen DOUT-linjalle.

On vielä yksi kohta, lokit lähetetään UART:n kautta (siirtonopeus 115200, TX - 6 nastaa, RX - 8 nastaa) kaikki asetukset ovat sdk_config.h

Kuinka liittää HX711 ADC NRF52832:een

Tulokset

Kiitos kaikille huomiosta. Toivon, että tästä artikkelista on hyötyä ja se vähentää kehittäjien arvokasta aikaa ratkaisun löytämiseen. Haluan sanoa, että Nordicin alustoissaan käyttämä tekninen lähestymistapa on energiatehokkuuden kannalta varsin mielenkiintoinen.

PS.

Projekti on vielä kehitteillä, joten jos tämä aihe kiinnostaa, yritän seuraavassa artikkelissa kuvata paino-anturien kalibroinnin algoritmia sekä BLE-pinon kytkemistä.

tarvikkeet

Lähde: will.com

Lisää kommentti