Kuidas ühendada HX711 ADC NRF52832-ga

1. Sissejuhatus

Päevakorras oli kahe poolsillaga Hiina tensomõõturiga mikrokontrolleri nrf52832 sideprotokolli väljatöötamine.

Ülesanne ei osutunud lihtsaks, kuna olin silmitsi igasuguse arusaadava teabe puudumisega. On tõenäolisem, et "kurjuse juur" peitub Nordic Semiconductori enda SDK-s - pidevad versiooniuuendused, mõningane liiasus ja segadusse ajav funktsionaalsus. Ma pidin kõik nullist kirjutama.

Ma arvan, et see teema on üsna asjakohane, arvestades asjaolu, et sellel kiibil on BLE-pinn ja terve komplekt energiasäästurežiimi jaoks mõeldud "maiusi". Kuid ma ei lasku tehnilisse ossa liiga sügavale, kuna sellel teemal on kirjutatud palju artikleid.

2. Projekti kirjeldus

Kuidas ühendada HX711 ADC NRF52832-ga

Raud:

  • Adafruit Feather nRF52 Bluefruit LE (mis juhtus käepärast olema)
  • HX711 ADC
  • Hiina pingeandurid 2 tk. (50x2 kg)
  • Programmeerija ST-LINK V2

Tarkvara:

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

Kõik on ühes projektis, peate lihtsalt muutma Makefile'i (täpsustage oma SDK asukoht).

3. Koodi kirjeldus

Välisseadmetega töötamiseks, mis põhinevad ülesannete ja sündmuste sidumisel, kasutame GPIOTE moodulit, samuti PPI moodulit andmete edastamiseks ühelt välisseadmelt teisele ilma protsessori osaluseta.

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

Konfigureerime PD_SCL sünkroniseerimisliini väljundisse, et genereerida impulsse kestusega 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);//включаем таймер
}
 

Konfigureerime DOUT-andmeliini lugema HX711 valmisoleku olekut; madala taseme korral käivitatakse käitleja, mille puhul keelame katkestuse ja käivitame taimeri, et genereerida PD_SCL väljundis taktimpulsse.

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

// lubage gpiote

Pärast seda initsialiseerime PPI mooduli ja ühendame oma taimeri PD_SCL väljundiga, et genereerida võrdlussündmuse korral impulsse kestusega 10 μs, ja lülitame sisse ka GPIOTE mooduli.


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

Initsialiseerime nulltaimeri ja selle käitleja.

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

Kõige huvitavam asi juhtub taimeri käitlejas. Impulsi periood on 20 μs. Oleme huvitatud paaritutest impulssidest (piki tõusvat serva) ja eeldusel, et nende arv ei ületa 24 ja sündmusi on 48. Iga paaritu sündmuse kohta loetakse DOUT

Andmelehest järeldub, et impulsside arv peab olema vähemalt 25, mis vastab võimendusele 128 (koodis kasutasin 25 impulssi), see võrdub 50 taimeri sündmusega, mis näitab andmekaadri lõppu.

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

Pärast seda lülitame taimeri välja ja töötleme andmeid (vastavalt andmelehele) ning lülitame HX711 madala energiatarbega režiimi.


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

Ootame sündmusi RTC-taimerilt intervalliga 10 s (see on teie äranägemisel) ja käivitame HX711 käitlejas, põhjustades katkestuse DOUT-liinil.

On veel üks punkt, logid väljastatakse UART-i kaudu (baud rate 115200, TX - 6 kontakti, RX - 8 kontakti) kõik seaded on sdk_config.h

Kuidas ühendada HX711 ADC NRF52832-ga

Järeldused

Tänan teid kõiki tähelepanu eest. Loodan, et see artikkel on kasulik ja vähendab arendajatel lahenduse leidmiseks kuluvat väärtuslikku aega. Tahan öelda, et tehniline lähenemine, mida Nordic oma platvormidel kasutab, on energiatõhususe seisukohalt päris huvitav.

PS

Projekt on veel väljatöötamisel, nii et kui see teema huvi pakub, proovin järgmises artiklis kirjeldada kaaluandurite kalibreerimise algoritmi, samuti BLE-virna ühendamist.

Materjalid

Allikas: www.habr.com

Lisa kommentaar