Kumaha nyambungkeun HX711 ADC mun NRF52832

1. Pambuka

Dina agenda éta tugas ngamekarkeun protokol komunikasi pikeun mikrokontroler nrf52832 kalawan dua satengah sasak gauges galur Cina.

Tugasna tétéla henteu gampang, sabab kuring disanghareupan ku kakurangan inpormasi anu kaharti. Éta langkung dipikaresep yén "akar jahat" aya dina SDK ti Nordic Semiconductor sorangan - apdet versi konstan, sababaraha redundancy sareng fungsionalitas ngabingungkeun. Kuring kungsi nulis sagalana ti scratch.

Jigana topik ieu rada relevan dumasar kana kanyataan yén chip ieu boga tumpukan BLE sarta sakabeh susunan "goodies" pikeun mode hemat energi. Tapi kuring moal lebet teuing kana bagian téknis, sabab seueur tulisan anu ditulis dina topik ieu.

2. Pedaran proyék

Kumaha nyambungkeun HX711 ADC mun NRF52832

Beusi:

  • Adafruit Feather nRF52 Bluefruit LE (naon anu aya di leungeun)
  • HX711 ADC
  • Cina galur gauges 2 PCS. (50 x 2 kg)
  • Programmer ST-link V2

Parangkat lunak:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Programmer ST-link V2

Sagalana aya dina hiji proyék, anjeun ngan kudu tweak Makefile (nangtukeun lokasi SDK anjeun).

3. Pedaran kode

Urang bakal ngagunakeun modul GPIOTE pikeun gawé bareng périferal dumasar kana beungkeutan tugas jeung acara, kitu ogé modul PPI pikeun mindahkeun data tina hiji periferal ka sejen tanpa partisipasi processor a.

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

Urang ngonpigurasikeun garis sinkronisasi PD_SCL kana kaluaran pikeun ngahasilkeun pulsa kalayan durasi 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);//включаем таймер
}
 

Kami ngonpigurasikeun garis data DOUT pikeun maca kaayaan kesiapan HX711; upami aya tingkat anu handap, panangan dipicu dimana urang nganonaktipkeun interupsi sareng ngamimitian timer pikeun ngahasilkeun pulsa jam dina kaluaran 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); 

// ngaktipkeun gpiote

Saatos éta, urang ngamimitian modul PPI sareng sambungkeun timer ka kaluaran PD_SCL pikeun ngahasilkeun pulsa kalayan durasi 10 μs nalika aya kajadian ngabandingkeun, sareng ogé hurungkeun modul 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);// срабатывает по сравнению

Urang initialize timer enol jeung handler na.

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

Hal anu paling pikaresepeun lumangsung dina panangan timer. Periode pulsa nyaéta 20 μs. Urang museurkeun pulsa ganjil (sapanjang ujung rising) jeung disadiakeun yén jumlah maranéhanana henteu leuwih ti 24, tur aya kajadian 48. Pikeun unggal acara ganjil, DOUT dibaca.

Ti lembar data ieu kieu yén jumlah pulsa sahenteuna kudu 25, nu pakait jeung gain 128 (dina kode I dipaké 25 pulsa), ieu sarua jeung 50 acara timer, nu nunjukkeun tungtung pigura 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
       }
   

Saatos ieu, urang mareuman timer sareng ngolah data (nurutkeun lembar data) sareng ngalihkeun HX711 ka modeu konsumsi kakuatan rendah.


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

Kami ngarepkeun acara ti timer RTC kalayan interval 10 s (ieu dina kawijaksanaan anjeun) sareng ngaluncurkeun HX711 dina panangan, nyababkeun gangguan dina garis DOUT.

Aya hiji deui titik, log kaluaran via UART (laju baud 115200, TX - 6 pin, RX - 8 pin) sadaya setelan aya di sdk_config.h

Kumaha nyambungkeun HX711 ADC mun NRF52832

papanggihan

Hatur nuhun sadayana pikeun perhatian anjeun, abdi miharep artikel ieu bakal mangpaat tur bakal ngurangan waktu berharga pikeun pamekar pikeun manggihan solusi. Abdi hoyong nyebatkeun yén pendekatan téknis anu dianggo ku Nordic dina platformna cukup pikaresepeun tina sudut pandang efisiensi énergi.

PS

Proyék ieu masih dina ngembangkeun, jadi lamun topik ieu dipikaresep, dina artikel salajengna kuring bakal coba ngajelaskeun algoritma pikeun calibrating sensor beurat, kitu ogé nyambungkeun tumpukan BLE.

bahan

sumber: www.habr.com

Tambahkeun komentar