Meriv çawa HX711 ADC bi NRF52832 ve girêdide

1. Destpêk

Di rojevê de peywira pêşxistina protokola ragihandinê ya ji bo mîkrokontroller nrf52832 bi du gaugên çînî yên nîv-pira bû.

Ev kar ne hêsan bû, ji ber ku ez bi kêmasiya agahdariya têgihîştî re rû bi rû bûm. Zêdetir e ku "koka xirabiyê" di SDK-ê de ji Nordic Semiconductor bixwe ye - nûvekirina guhertoya domdar, hin zêdebûn û fonksiyonên tevlihev. Diviya bû ku ez her tiştî ji sifirê binivîsim.

Ez difikirim ku ev mijar pir têkildar e li ser bingeha vê rastiyê ku ev çîp ji bo moda hilanîna enerjiyê stûnek BLE û komek tevahî "baş" heye. Lê ez ê zêde kûr neçim beşa teknîkî, ji ber ku gelek gotar li ser vê mijarê hatine nivîsandin.

2. Danasîna projeyê

Meriv çawa HX711 ADC bi NRF52832 ve girêdide

Hesin:

  • Adafruit Feather nRF52 Bluefruit LE (çi di dest de bû)
  • HX711 ADC
  • Pîvana tîrêjê ya çînî 2 pcs. (50x2 kg)
  • Bernameçêker ST-LINK V2

Nermalav:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Bernameçêker ST-LINK V2

Her tişt di yek projeyekê de ye, hûn tenê hewce ne ku Makefile-ê bişkînin (cihê SDK-ya xwe diyar bikin).

3. Danasîna kodê

Em ê modula GPIOTE bikar bînin da ku bi periferîkan re li ser bingeha girêdana peywir û bûyeran bixebitin, û her weha modula PPI-yê ji bo veguheztina daneyan ji yek dorhêlê bo ya din bêyî beşdarbûna pêvajoyek bikar bînin.

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

Em xeta hevdemkirinê ya PD_SCL li ser derketinê mîheng dikin da ku pêlên bi dirêjahiya 10 μs biafirînin.

   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);//включаем таймер
}
 

Em rêzika daneya DOUT mîheng dikin da ku rewşa amadebûna HX711 bixwîne; heke astek nizm hebe, rêvekerek tê kişandin ku tê de em qutbûnê neçalak dikin û demjimêrek dest pê dikin da ku pêlên demjimêrê li derana PD_SCL çêbikin.

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

// gpiote çalak bike

Piştî wê, em modula PPI-ê dest pê dikin û demjimêra xwe bi derana PD_SCL ve girêdidin da ku dema bûyerek berhevdanê çêbibe pêlên bi dirêjahiya 10 μs çêbike, û modula GPIOTE jî veke.


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

Em demjimêra sifir û hilgirê wê dest pê dikin.

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

Tişta herî balkêş di navberkarê demjimêrê de diqewime. Demjimêra pulsê 20 μs ye. Em bala xwe didin pêlên cewherî (li kêleka bilindbûnê) û bi şertê ku hejmara wan ji 24an zêdetir nebe û 48 bûyer hebin.

Ji pelê daneyê derdikeve holê ku divê hejmara pêl bi kêmî ve 25 be, ku bi destkeftiyek 128 re têkildar e (di koda ku min 25 pêl bi kar aniye), ev yek bi 50 bûyerên demjimêrker re ye, ku dawiya çarçoveya daneyê destnîşan dike.

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

Piştî vê yekê, em demjimêrê vedigirin û daneyê pêvajo dikin (li gorî datasheet) û HX711 veguherînin moda xerckirina hêza kêm.


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

Em ji demjimêra RTC-ê bi navberek 10 seqeyan li benda bûyeran in (ev li gorî we ye) û HX711 di destikê de dest pê dike, ku dibe sedema qutbûnek li ser xeta DOUT.

Xalek din jî heye, têketin bi UART ve têne derxistin (rêjeya baud 115200, TX - 6 pin, RX - 8 pin) hemî mîheng di sdk_config.h de ne

Meriv çawa HX711 ADC bi NRF52832 ve girêdide

vebiguherin

Spas ji we hemiyan re ji bo baldariya we, ez hêvî dikim ku ev gotar dê bikêr be û ji bo pêşdebiran dema xwe ya hêja kêm bike ku çareseriyek bibînin. Ez dixwazim bibêjim ku nêzîkatiya teknîkî ya ku Nordic di platformên xwe de bikar tîne ji hêla karbidestiya enerjiyê ve pir balkêş e.

PS

Proje hîn jî di bin pêşkeftinê de ye, ji ber vê yekê heke ev mijar balkêş be, di gotara din de ez ê hewl bidim ku algorîtmaya pîvandina senzorên giraniyê, û her weha girêdana stûna BLE vebêjim.

Materyal

Source: www.habr.com

Add a comment