HX711 ADC ಅನ್ನು NRF52832 ಗೆ ಸಂಪರ್ಕಿಸುವುದು ಹೇಗೆ

1. ಪರಿಚಯ

ಎರಡು ಅರ್ಧ-ಸೇತುವೆ ಚೈನೀಸ್ ಸ್ಟ್ರೈನ್ ಗೇಜ್‌ಗಳೊಂದಿಗೆ nrf52832 ಮೈಕ್ರೋಕಂಟ್ರೋಲರ್‌ಗಾಗಿ ಸಂವಹನ ಪ್ರೋಟೋಕಾಲ್ ಅನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸುವ ಕಾರ್ಯವು ಕಾರ್ಯಸೂಚಿಯಲ್ಲಿತ್ತು.

ನಾನು ಯಾವುದೇ ಗ್ರಹಿಸಬಹುದಾದ ಮಾಹಿತಿಯ ಕೊರತೆಯನ್ನು ಎದುರಿಸಿದ್ದರಿಂದ ಕಾರ್ಯವು ಸುಲಭವಲ್ಲ ಎಂದು ಬದಲಾಯಿತು. ನಾರ್ಡಿಕ್ ಸೆಮಿಕಂಡಕ್ಟರ್‌ನಿಂದಲೇ SDK ಯಲ್ಲಿ “ದುಷ್ಟದ ಮೂಲ” ಇರುವ ಸಾಧ್ಯತೆಯಿದೆ - ನಿರಂತರ ಆವೃತ್ತಿಯ ನವೀಕರಣಗಳು, ಕೆಲವು ಪುನರಾವರ್ತನೆ ಮತ್ತು ಗೊಂದಲಮಯ ಕಾರ್ಯ. ನಾನು ಮೊದಲಿನಿಂದ ಎಲ್ಲವನ್ನೂ ಬರೆಯಬೇಕಾಗಿತ್ತು.

ಈ ಚಿಪ್ BLE ಸ್ಟಾಕ್ ಮತ್ತು ಶಕ್ತಿಯ ಉಳಿತಾಯ ಮೋಡ್ಗಾಗಿ "ಗುಡೀಸ್" ನ ಸಂಪೂರ್ಣ ಸೆಟ್ ಅನ್ನು ಹೊಂದಿದೆ ಎಂಬ ಅಂಶದ ಆಧಾರದ ಮೇಲೆ ಈ ವಿಷಯವು ಸಾಕಷ್ಟು ಪ್ರಸ್ತುತವಾಗಿದೆ ಎಂದು ನಾನು ಭಾವಿಸುತ್ತೇನೆ. ಆದರೆ ನಾನು ತಾಂತ್ರಿಕ ಭಾಗಕ್ಕೆ ಹೆಚ್ಚು ಆಳವಾಗಿ ಹೋಗುವುದಿಲ್ಲ, ಏಕೆಂದರೆ ಈ ವಿಷಯದ ಬಗ್ಗೆ ಅನೇಕ ಲೇಖನಗಳನ್ನು ಬರೆಯಲಾಗಿದೆ.

2. ಪ್ರಾಜೆಕ್ಟ್ ವಿವರಣೆ

HX711 ADC ಅನ್ನು NRF52832 ಗೆ ಸಂಪರ್ಕಿಸುವುದು ಹೇಗೆ

ಕಬ್ಬಿಣ:

  • ಅಡಾಫ್ರೂಟ್ ಫೆದರ್ nRF52 ಬ್ಲೂಫ್ರೂಟ್ LE (ಕೈಯಲ್ಲಿ ಏನಾಯಿತು)
  • HX711 ADC
  • ಚೈನೀಸ್ ಸ್ಟ್ರೈನ್ ಗೇಜ್ಗಳು 2 ಪಿಸಿಗಳು. (50x2 ಕೆಜಿ)
  • ಪ್ರೋಗ್ರಾಮರ್ ST-LINK V2

ಸಾಫ್ಟ್ವೇರ್:

  • IDE VSCODE
  • NRF SDK 16
  • ಓಪನ್ ಒಸಿಡಿ
  • ಪ್ರೋಗ್ರಾಮರ್ ST-LINK V2

ಎಲ್ಲವೂ ಒಂದೇ ಯೋಜನೆಯಲ್ಲಿದೆ, ನೀವು ಮೇಕ್‌ಫೈಲ್ ಅನ್ನು ತಿರುಚಬೇಕು (ನಿಮ್ಮ 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);//настраеваем на выход

10 μs ಅವಧಿಯೊಂದಿಗೆ ದ್ವಿದಳ ಧಾನ್ಯಗಳನ್ನು ಉತ್ಪಾದಿಸಲು ನಾವು PD_SCL ಸಿಂಕ್ರೊನೈಸೇಶನ್ ಲೈನ್ ಅನ್ನು ಔಟ್‌ಪುಟ್‌ಗೆ ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತೇವೆ.

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

HX711 ನ ಸನ್ನದ್ಧ ಸ್ಥಿತಿಯನ್ನು ಓದಲು ನಾವು DOUT ಡೇಟಾ ಲೈನ್ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುತ್ತೇವೆ; ಕಡಿಮೆ ಮಟ್ಟದಿದ್ದರೆ, ಹ್ಯಾಂಡ್ಲರ್ ಅನ್ನು ಪ್ರಚೋದಿಸಲಾಗುತ್ತದೆ, ಇದರಲ್ಲಿ ನಾವು ಅಡಚಣೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತೇವೆ ಮತ್ತು 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 ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸುತ್ತೇವೆ ಮತ್ತು ಹೋಲಿಕೆ ಈವೆಂಟ್ ಸಂಭವಿಸಿದಾಗ 10 μs ಅವಧಿಯೊಂದಿಗೆ ದ್ವಿದಳ ಧಾನ್ಯಗಳನ್ನು ಉತ್ಪಾದಿಸಲು PD_SCL ಔಟ್‌ಪುಟ್‌ಗೆ ನಮ್ಮ ಟೈಮರ್ ಅನ್ನು ಸಂಪರ್ಕಿಸುತ್ತೇವೆ ಮತ್ತು 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 μs ಆಗಿದೆ. ನಾವು ಬೆಸ ದ್ವಿದಳ ಧಾನ್ಯಗಳಲ್ಲಿ (ಏರುತ್ತಿರುವ ಅಂಚಿನ ಉದ್ದಕ್ಕೂ) ಆಸಕ್ತಿ ಹೊಂದಿದ್ದೇವೆ ಮತ್ತು ಅವುಗಳ ಸಂಖ್ಯೆ 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 ಗೆ ಸಂಪರ್ಕಿಸುವುದು ಹೇಗೆ

ಸಂಶೋಧನೆಗಳು

ನಿಮ್ಮ ಗಮನಕ್ಕೆ ಎಲ್ಲರಿಗೂ ಧನ್ಯವಾದಗಳು, ಈ ಲೇಖನವು ಉಪಯುಕ್ತವಾಗಿದೆ ಮತ್ತು ಡೆವಲಪರ್‌ಗಳಿಗೆ ಪರಿಹಾರವನ್ನು ಕಂಡುಹಿಡಿಯಲು ಅಮೂಲ್ಯ ಸಮಯವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ ಎಂದು ನಾನು ಭಾವಿಸುತ್ತೇನೆ. ನಾರ್ಡಿಕ್ ತನ್ನ ಪ್ಲಾಟ್‌ಫಾರ್ಮ್‌ಗಳಲ್ಲಿ ಬಳಸುವ ತಾಂತ್ರಿಕ ವಿಧಾನವು ಶಕ್ತಿಯ ದಕ್ಷತೆಯ ದೃಷ್ಟಿಕೋನದಿಂದ ಸಾಕಷ್ಟು ಆಸಕ್ತಿದಾಯಕವಾಗಿದೆ ಎಂದು ನಾನು ಹೇಳಲು ಬಯಸುತ್ತೇನೆ.

ಪಿಎಸ್

ಯೋಜನೆಯು ಇನ್ನೂ ಅಭಿವೃದ್ಧಿಯಲ್ಲಿದೆ, ಆದ್ದರಿಂದ ಈ ವಿಷಯವು ಆಸಕ್ತಿಯಿದ್ದರೆ, ಮುಂದಿನ ಲೇಖನದಲ್ಲಿ ನಾನು ತೂಕ ಸಂವೇದಕಗಳನ್ನು ಮಾಪನಾಂಕ ನಿರ್ಣಯಿಸಲು ಅಲ್ಗಾರಿದಮ್ ಅನ್ನು ವಿವರಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತೇನೆ, ಜೊತೆಗೆ BLE ಸ್ಟಾಕ್ ಅನ್ನು ಸಂಪರ್ಕಿಸುತ್ತೇನೆ.

ವಸ್ತುಗಳು

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ