Giunsa ang pagkonektar sa HX711 ADC sa NRF52832

1. Pasiuna

Sa agenda mao ang tahas sa pagpalambo sa usa ka protocol sa komunikasyon alang sa nrf52832 microcontroller nga adunay duha ka tunga nga tulay nga Chinese strain gauges.

Ang buluhaton nahimo nga dili sayon, tungod kay ako nag-atubang sa kakulang sa bisan unsa nga masabtan nga impormasyon. Lagmit nga ang "gamut sa daotan" naa sa SDK gikan sa Nordic Semiconductor mismo - kanunay nga pag-update sa bersyon, pipila nga pag-usab ug makalibog nga gamit. Kinahanglan nakong isulat ang tanan gikan sa sinugdan.

Sa akong hunahuna kini nga hilisgutan labi ka may kalabutan base sa kamatuoran nga kini nga chip adunay usa ka BLE stack ug usa ka tibuuk nga hugpong sa mga "goodies" alang sa mode sa pagtipig sa enerhiya. Apan dili ako moadto kaayo sa teknikal nga bahin, tungod kay daghang mga artikulo ang gisulat bahin niini nga hilisgutan.

2. Deskripsyon sa proyekto

Giunsa ang pagkonektar sa HX711 ADC sa NRF52832

puthaw:

  • Adafruit Feather nRF52 Bluefruit LE (unsay naa sa kamot)
  • ADC HX711
  • Intsik nga strain gauge 2 pcs. (50x2 kg)
  • Programmer nga ST-LINK V2

Software:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Programmer nga ST-LINK V2

Ang tanan naa sa usa ka proyekto, kinahanglan nimo nga i-tweak ang Makefile (ipiho ang lokasyon sa imong SDK).

3. Deskripsyon sa kodigo

Atong gamiton ang GPIOTE module sa pagtrabaho uban sa mga peripheral base sa pagbugkos sa mga buluhaton ug mga panghitabo, ingon man ang PPI module sa pagbalhin sa data gikan sa usa ka peripheral ngadto sa lain nga walay pag-apil sa usa ka processor.

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

Gi-configure namon ang linya sa pag-synchronize sa PD_SCL sa output aron makamugna ang mga pulso nga adunay gidugayon nga 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);//Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
}
 

Gi-configure namo ang linya sa datos sa DOUT aron mabasa ang kahimtang sa pagkaandam sa HX711; kung adunay ubos nga lebel, usa ka handler ang ma-trigger diin among gi-disable ang interrupt ug magsugod og timer aron makamugna og mga pulso sa orasan sa output sa 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); 

// makahimo sa gpiote

Human niana, atong sugdan ang PPI module ug ikonektar ang atong timer sa PD_SCL output aron makamugna og mga pulso nga adunay gidugayon nga 10 ΞΌs kung mahitabo ang usa ka pagtandi nga panghitabo, ug i-on usab ang GPIOTE module.


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

Gisugdan namon ang zero timer ug ang tigdumala niini.

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

Ang labing makapaikag nga butang mahitabo sa timer handler. Ang panahon sa pulso mao ang 20 ΞΌs. Interesado kami sa mga katingad-an nga pulso (uban sa pagtaas sa ngilit) ug kung ang ilang gidaghanon dili molapas sa 24, ug adunay mga panghitabo nga 48. Alang sa matag katingad-an nga panghitabo, ang DOUT gibasa

Gikan sa datasheet kini nagsunod nga ang gidaghanon sa mga pulso kinahanglan nga labing menos 25, nga katumbas sa usa ka ganansya sa 128 (sa code nga akong gigamit nga 25 ka pulso), kini katumbas sa 50 ka timer nga mga panghitabo, nga nagpakita sa katapusan sa data frame.

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

Pagkahuman niini, gipalong namon ang timer ug giproseso ang datos (sumala sa datasheet) ug gibalhin ang HX711 sa mode nga mubu nga konsumo sa kuryente.


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

Gipaabot namo ang mga panghitabo gikan sa timer sa RTC nga adunay interval nga 10 s (naa ra sa imong pagbuot) ug ilunsad ang HX711 sa handler, hinungdan sa pagkabalda sa linya sa DOUT.

Adunay usa pa ka punto, ang mga troso gi-output pinaagi sa UART (baud rate 115200, TX - 6 pins, RX - 8 pins) ang tanan nga mga setting naa sa sdk_config.h

Giunsa ang pagkonektar sa HX711 ADC sa NRF52832

kaplag

Salamat sa tanan sa imong pagtagad, nanghinaut ko nga kini nga artikulo mahimong mapuslanon ug makapakunhod sa bililhong panahon alang sa mga developers sa pagpangita og solusyon. Gusto nakong isulti nga ang teknikal nga pamaagi nga gigamit sa Nordic sa mga plataporma niini medyo makapaikag gikan sa punto sa panglantaw sa kahusayan sa enerhiya.

PS

Ang proyekto ubos pa sa pag-uswag, mao nga kung kini nga hilisgutan interesado, sa sunod nga artikulo sulayan nako nga ihulagway ang algorithm alang sa pag-calibrate sa mga sensor sa timbang, ingon man ang pagkonektar sa BLE stack.

Mga Materyal

Source: www.habr.com

Idugang sa usa ka comment