Si të lidhni HX711 ADC me NRF52832

1. Hyrje

Në rendin e ditës ishte detyra e zhvillimit të një protokolli komunikimi për mikrokontrolluesin nrf52832 me dy matës sforcimi kinez me gjysmë urë.

Detyra doli të mos ishte e lehtë, pasi u përballa me mungesë informacioni të kuptueshëm. Ka më shumë të ngjarë që "rrënja e së keqes" të jetë në SDK nga vetë gjysmëpërçuesi Nordic - përditësime të vazhdueshme të versionit, disa teprica dhe funksione konfuze. Më duhej të shkruaja gjithçka nga e para.

Unë mendoj se kjo temë është mjaft e rëndësishme bazuar në faktin se ky çip ka një pirg BLE dhe një grup të tërë "të mirash" për modalitetin e kursimit të energjisë. Por nuk do të hyj shumë në pjesën teknike, pasi janë shkruar shumë artikuj për këtë temë.

2. Përshkrimi i projektit

Si të lidhni HX711 ADC me NRF52832

Hekuri:

  • Adafruit Feather nRF52 Bluefruit LE (çfarë ndodhi të ishte pranë)
  • ADC HX711
  • Matës sforcimi kinez 2 copë. (50x2 kg)
  • Programues ST-LINK V2

Program kompjuterik:

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

Gjithçka është në një projekt, thjesht duhet të rregulloni Makefile (specifikoni vendndodhjen e SDK-së tuaj).

3. Përshkrimi i kodit

Ne do të përdorim modulin GPIOTE për të punuar me pajisje periferike bazuar në lidhjen e detyrave dhe ngjarjeve, si dhe modulin PPI për të transferuar të dhëna nga një periferik në tjetrin pa pjesëmarrjen e një procesori.

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

Ne konfigurojmë linjën e sinkronizimit PD_SCL në dalje për të gjeneruar impulse me një kohëzgjatje prej 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);//включаем таймер
}
 

Ne konfigurojmë linjën e të dhënave DOUT për të lexuar gjendjen e gatishmërisë së HX711; nëse ka një nivel të ulët, aktivizohet një mbajtës në të cilin çaktivizojmë ndërprerjen dhe nisim një kohëmatës për të gjeneruar impulse të orës në daljen 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); 

// aktivizoni gpiote

Pas kësaj, ne inicializojmë modulin PPI dhe lidhim kohëmatësin tonë me daljen PD_SCL për të gjeneruar impulse me një kohëzgjatje prej 10 μs kur ndodh një ngjarje krahasimi, dhe gjithashtu aktivizojmë modulin 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);// срабатывает по сравнению

Ne inicializojmë kohëmatësin zero dhe mbajtësin e tij.

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

Gjëja më interesante ndodh në mbajtësin e kohëmatësit. Periudha e pulsit është 20 μs. Ne jemi të interesuar për pulset tek (përgjatë skajit në rritje) dhe me kusht që numri i tyre të mos jetë më shumë se 24 dhe të ketë 48 ngjarje. Për çdo ngjarje tek, lexohet DOUT

Nga fleta e të dhënave rezulton se numri i pulseve duhet të jetë së paku 25, që korrespondon me një fitim prej 128 (në kodin që kam përdorur 25 pulse), kjo është e barabartë me 50 ngjarje kohëmatës, që tregon fundin e kornizës së të dhënave.

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

Pas kësaj, ne fikim kohëmatësin dhe përpunojmë të dhënat (sipas fletës së të dhënave) dhe kalojmë HX711 në modalitetin e konsumit të ulët të energjisë.


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

Ne presim ngjarje nga kohëmatësi RTC me një interval prej 10 s (kjo është në diskrecionin tuaj) dhe lëshojmë HX711 në mbajtës, duke shkaktuar një ndërprerje në linjën DOUT.

Ka edhe një pikë tjetër, regjistrat nxirren përmes UART (baud rate 115200, TX - 6 pins, RX - 8 pins) të gjitha cilësimet janë në sdk_config.h

Si të lidhni HX711 ADC me NRF52832

Gjetjet

Faleminderit të gjithëve për vëmendjen tuaj, shpresoj se ky artikull do të jetë i dobishëm dhe do të zvogëlojë kohën e vlefshme për zhvilluesit për të gjetur një zgjidhje. Dua të them se qasja teknike që përdor Nordic në platformat e saj është mjaft interesante nga pikëpamja e efiçencës së energjisë.

PS

Projekti është ende në zhvillim, kështu që nëse kjo temë është me interes, në artikullin tjetër do të përpiqem të përshkruaj algoritmin për kalibrimin e sensorëve të peshës, si dhe lidhjen e pirgut BLE.

Materiale

Burimi: www.habr.com

Shto një koment