ื›ื™ืฆื“ ืœื—ื‘ืจ ืืช HX711 ADC ืœ-NRF52832

1. ืžื‘ื•ื

ืขืœ ืกื“ืจ ื”ื™ื•ื ืขืžื“ื” ื”ืžืฉื™ืžื” ืฉืœ ืคื™ืชื•ื— ืคืจื•ื˜ื•ืงื•ืœ ืชืงืฉื•ืจืช ืœืžื™ืงืจื•-ื‘ืงืจ nrf52832 ืขื ืฉื ื™ ืžื“ื™ ืžืชื— ืกื™ื ื™ื™ื ืขื ื—ืฆื™ ื’ืฉืจ.

ื”ืžืฉื™ืžื” ื”ืชื‘ืจืจื” ื›ืœื ืงืœื”, ืฉื›ืŸ ืขืžื“ืชื™ ื‘ืคื ื™ ื—ื•ืกืจ ื›ืœ ืžื™ื“ืข ืžื•ื‘ืŸ. ืกื‘ื™ืจ ื™ื•ืชืจ ืฉ"ืฉื•ืจืฉ ื”ืจื•ืข" ื ืžืฆื ื‘-SDK ืฉืœ Nordic Semiconductor ืขืฆืžื• - ืขื“ื›ื•ื ื™ ื’ืจืกื” ืงื‘ื•ืขื™ื, ื™ืชื™ืจื•ืช ืžืกื•ื™ืžืช ื•ืคื•ื ืงืฆื™ื•ื ืœื™ื•ืช ืžื‘ืœื‘ืœืช. ื”ื™ื™ืชื™ ืฆืจื™ืš ืœื›ืชื•ื‘ ื”ื›ืœ ืžืืคืก.

ืื ื™ ื—ื•ืฉื‘ ืฉื”ื ื•ืฉื ื”ื–ื” ื“ื™ ืจืœื•ื•ื ื˜ื™ ื‘ื”ืชื‘ืกืก ืขืœ ื”ืขื•ื‘ื“ื” ืฉืœืฉื‘ื‘ ื”ื–ื” ื™ืฉ ืžื—ืกื ื™ืช BLE ื•ืžืขืจื›ืช ืฉืœืžื” ืฉืœ "ืžื•ืฆืจื™ื ื˜ื•ื‘ื™ื" ืœืžืฆื‘ ื—ื™ืกื›ื•ืŸ ื‘ืื ืจื’ื™ื”. ืื‘ืœ ืื ื™ ืœื ืื›ื ืก ื™ื•ืชืจ ืžื“ื™ ืœื—ืœืง ื”ื˜ื›ื ื™, ืฉื›ืŸ ืžืืžืจื™ื ืจื‘ื™ื ื ื›ืชื‘ื• ื‘ื ื•ืฉื ื–ื”.

2. ืชื™ืื•ืจ ื”ืคืจื•ื™ืงื˜

ื›ื™ืฆื“ ืœื—ื‘ืจ ืืช HX711 ADC ืœ-NRF52832

ื‘ืจื–ืœ:

  • Adafruit Feather nRF52 Bluefruit LE (ืžื” ืฉื”ื™ื” ื‘ื”ื™ืฉื’ ื™ื“)
  • HX711 ADC
  • ืžื“ื™ ืžืชื— ืกื™ื ื™ื™ื 2 ื™ื—'. (50x2 ืง"ื’)
  • ืžืชื›ื ืช ST-LINK V2

Soft

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • ืžืชื›ื ืช ST-LINK V2

ื”ื›ืœ ื ืžืฆื ื‘ืคืจื•ื™ืงื˜ ืื—ื“, ืืชื” ืจืง ืฆืจื™ืš ืœืฆื‘ื•ื˜ ืืช ื”-Makefile (ืฆื™ื™ืŸ ืืช ื”ืžื™ืงื•ื ืฉืœ ื”-SDK ืฉืœืš).

3. ืชื™ืื•ืจ ื”ืงื•ื“

ื ืฉืชืžืฉ ื‘ืžื•ื“ื•ืœ GPIOTE ืœืขื‘ื•ื“ื” ืขื ืฆื™ื•ื“ ื”ื™ืงืคื™ ื”ืžื‘ื•ืกืก ืขืœ ืงืฉื™ืจื” ืฉืœ ืžืฉื™ืžื•ืช ื•ืื™ืจื•ืขื™ื, ื›ืžื• ื’ื ื‘ืžื•ื“ื•ืœ PPI ืœื”ืขื‘ืจืช ื ืชื•ื ื™ื ืžืฆื™ื•ื“ ื”ื™ืงืคื™ ืื—ื“ ืœืื—ืจ ืœืœื ื”ืฉืชืชืคื•ืช ืฉืœ ืžืขื‘ื“.

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);//ะฝะฐัั‚ั€ะฐะตะฒะฐะตะผ ะฝะฐ ะฒั‹ั…ะพะด

ืื ื• ืžื’ื“ื™ืจื™ื ืืช ืงื• ื”ืกื ื›ืจื•ืŸ PD_SCL ืœืžื•ืฆื ื›ื“ื™ ืœื™ืฆื•ืจ ืคื•ืœืกื™ื ื‘ืื•ืจืš ืฉืœ 10 ืžื™ืงืจื•ืŸ.

   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);//ะฒะบะปัŽั‡ะฐะตะผ ั‚ะฐะนะผะตั€
}
 

ืื ื• ืžื’ื“ื™ืจื™ื ืืช ืงื• ื”ื ืชื•ื ื™ื DOUT ืœืงืจื•ื ืืช ืžืฆื‘ ื”ืžื•ื›ื ื•ืช ืฉืœ ื”-HX711; ืื ื™ืฉ ืจืžื” ื ืžื•ื›ื”, ืžื•ืคืขืœ ืžื˜ืคืœ ืฉื‘ื• ืื ื• ืžืฉื‘ื™ืชื™ื ืืช ื”ื”ืคืจืขื” ื•ืžืชื—ื™ืœื™ื ื˜ื™ื™ืžืจ ืœื™ืฆื™ืจืช ืคื•ืœืกื™ ืฉืขื•ืŸ ื‘ืžื•ืฆื 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); 

// ื”ืคืขืœ ืืช gpiote

ืœืื—ืจ ืžื›ืŸ, ืื ื• ืžืืชื—ืœื™ื ืืช ืžื•ื“ื•ืœ ื”-PPI ื•ืžื—ื‘ืจื™ื ืืช ื”ื˜ื™ื™ืžืจ ืฉืœื ื• ืœืคืœื˜ PD_SCL ื›ื“ื™ ืœื™ืฆื•ืจ ืคื•ืœืกื™ื ื‘ืื•ืจืš ืฉืœ 10 ฮผs ื›ืืฉืจ ืžืชืจื—ืฉ ืื™ืจื•ืข ื”ืฉื•ื•ืื”, ื•ื’ื ืœื”ืคืขื™ืœ ืืช ืžื•ื“ื•ืœ 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);// ัั€ะฐะฑะฐั‚ั‹ะฒะฐะตั‚ ะฟะพ ัั€ะฐะฒะฝะตะฝะธัŽ

ืื ื• ืžืืชื—ืœื™ื ืืช ื˜ื™ื™ืžืจ ื”ืืคืก ื•ื”ืžื˜ืคืœ ืฉืœื•.

  if(m_counter%2 != 0 && m_counter<=48){
       buffer <<= 1;// ะฟะตั€ะตะผะตะฝะฝะฐั ัั‡ะธั‚ะฐะฝะฝั‹ั… ะดะฐะฝั‹ั…
        c_counter++;// ัั‡ะตั‚ั‡ะธะบ ะฟะพะปะพะถะธั‚ะตะปัŒะฝั‹ั…  ะธะผะฟัƒะปัŒัะพะฒ
           if(nrf_gpio_pin_read(DOUT))buffer++;//ัั‡ะธั‚ั‹ะฒะฐะตะผ ัะพัั‚ะพัะฝะธะต ะฒั…ะพะดะฐ
   }

ื”ื“ื‘ืจ ื”ืžืขื ื™ื™ืŸ ื‘ื™ื•ืชืจ ืงื•ืจื” ื‘ืžื˜ืคืœ ื”ื˜ื™ื™ืžืจ. ืชืงื•ืคืช ื”ื“ื•ืคืง ื”ื™ื 20 ืžื™ืงืจื•ืŸ. ืื ื• ืžืขื•ื ื™ื™ื ื™ื ื‘ืคื•ืœืกื™ื ืื™-ื–ื•ื’ื™ื™ื (ืœืื•ืจืš ื”ืงืฆื” ื”ืขื•ืœื”) ื•ื‘ืชื ืื™ ืฉืžืกืคืจื ืื™ื ื• ืขื•ืœื” ืขืœ 24, ื•ื™ืฉ 48 ืื™ืจื•ืขื™ื. ืœื›ืœ ืื™ืจื•ืข ืื™-ื–ื•ื’ื™, ืงื•ืจืื™ื DOUT

ืžื’ื™ืœื™ื•ืŸ ื”ื ืชื•ื ื™ื ืขื•ืœื” ืฉืžืกืคืจ ื”ืคื•ืœืกื™ื ื—ื™ื™ื‘ ืœื”ื™ื•ืช ืœืคื—ื•ืช 25, ืžื” ืฉืžืชืื™ื ืœื”ื’ื‘ืจ ืฉืœ 128 (ื‘ืงื•ื“ ื”ืฉืชืžืฉืชื™ ื‘-25 ืคื•ืœืกื™ื), ื–ื” ืฉื•ื•ื” ืขืจืš ืœ-50 ืื™ืจื•ืขื™ ื˜ื™ื™ืžืจ, ืžื” ืฉืžืฆื™ื™ืŸ ืืช ืกื•ืฃ ืžืกื’ืจืช ื”ื ืชื•ื ื™ื.

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

ืœืื—ืจ ืžื›ืŸ, ืื ื• ืžื›ื‘ื™ื ืืช ื”ื˜ื™ื™ืžืจ ื•ืžืขื‘ื“ื™ื ืืช ื”ื ืชื•ื ื™ื (ืœืคื™ ื’ื™ืœื™ื•ืŸ ื”ื ืชื•ื ื™ื) ื•ืžืขื‘ื™ืจื™ื ืืช ื”-HX711 ืœืžืฆื‘ ืฆืจื™ื›ืช ื—ืฉืžืœ ื ืžื•ื›ื”.


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

ืื ื• ืžืฆืคื™ื ืœืื™ืจื•ืขื™ื ืžื˜ื™ื™ืžืจ RTC ื‘ืžืจื•ื•ื— ืฉืœ 10 ืฉื ื™ื•ืช (ื–ื” ืœืคื™ ืฉื™ืงื•ืœ ื“ืขืชืš) ื•ืžืฉื™ืงื™ื ืืช ื”-HX711 ื‘ืžื˜ืคืœ, ืžื” ืฉื’ื•ืจื ืœื”ืคืจืขื” ื‘ืงื• DOUT.

ื™ืฉ ืขื•ื“ ื ืงื•ื“ื” ืื—ืช, ื”ื™ื•ืžื ื™ื ืžื•ืคืงื™ื ื‘ืืžืฆืขื•ืช UART (ืงืฆื‘ ืฉื™ื“ื•ืจ 115200, TX - 6 ืคื™ื ื™ื, RX - 8 ืคื™ื ื™ื) ื›ืœ ื”ื”ื’ื“ืจื•ืช ื ืžืฆืื•ืช ื‘-sdk_config.h

ื›ื™ืฆื“ ืœื—ื‘ืจ ืืช HX711 ADC ืœ-NRF52832

ืžืžืฆืื™ื

ืชื•ื“ื” ืœื›ื•ืœื ืขืœ ืชืฉื•ืžืช ื”ืœื‘, ืื ื™ ืžืงื•ื•ื” ืฉืžืืžืจ ื–ื” ื™ื”ื™ื” ืฉื™ืžื•ืฉื™ ื•ื™ืงื˜ื™ืŸ ื–ืžืŸ ื™ืงืจ ืœืžืคืชื—ื™ื ืœืžืฆื•ื ืคืชืจื•ืŸ. ืื ื™ ืจื•ืฆื” ืœื•ืžืจ ืฉื”ื’ื™ืฉื” ื”ื˜ื›ื ื™ืช ืฉื‘ื” ืžืฉืชืžืฉืช Nordic ื‘ืคืœื˜ืคื•ืจืžื•ืช ืฉืœื” ื”ื™ื ื“ื™ ืžืขื ื™ื™ื ืช ืžื ืงื•ื“ืช ืžื‘ื˜ ืฉืœ ื™ืขื™ืœื•ืช ืื ืจื’ื˜ื™ืช.

ื .ื‘.

ื”ืคืจื•ื™ืงื˜ ืขื“ื™ื™ืŸ ื‘ืคื™ืชื•ื—, ืื– ืื ื”ื ื•ืฉื ื”ื–ื” ื™ืขื ื™ื™ืŸ, ื‘ืžืืžืจ ื”ื‘ื ืื ืกื” ืœืชืืจ ืืช ื”ืืœื’ื•ืจื™ืชื ืœื›ื™ื•ืœ ื—ื™ื™ืฉื ื™ ืžืฉืงืœ, ื›ืžื• ื’ื ื—ื™ื‘ื•ืจ ืžื—ืกื ื™ืช BLE.

ื—ื•ืžืจื™ื

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”