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

سافٽ ويئر

  • 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 ماڊل کي شروع ڪريون ٿا ۽ اسان جي ٽائمر کي 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 μ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);
}

اسان 10 سيڪنڊن جي وقفي سان RTC ٽائمر کان واقعن جي توقع ڪريون ٿا (اهو توهان جي صوابديد تي آهي) ۽ هينڊلر ۾ HX711 لانچ ڪيو، DOUT لائن تي رڪاوٽ جو سبب بڻجندي.

ھڪڙو وڌيڪ نقطو آھي، لاگز UART ذريعي ٻاھر آھن (baud شرح 115200، TX - 6 پن، RX - 8 پن) سڀ سيٽنگون sdk_config.h ۾ آھن.

HX711 ADC کي NRF52832 سان ڪيئن ڳنڍجي

پهچڻ

توھان جي توجه لاءِ توھان سڀني جي مھرباني، مون کي اميد آھي ته ھي مضمون ڪارآمد ثابت ٿيندو ۽ ڊولپرز لاءِ حل ڳولڻ لاءِ قيمتي وقت گھٽائيندو. مان اهو چوڻ چاهيان ٿو ته نورڊڪ پنهنجي پليٽ فارمن ۾ استعمال ٿيندڙ ٽيڪنيڪل طريقي سان توانائي جي ڪارڪردگي جي نقطي نظر کان ڪافي دلچسپ آهي.

پي ايس

پروجيڪٽ اڃا ترقي هيٺ آهي، تنهن ڪري جيڪڏهن هي موضوع دلچسپيءَ جو آهي، ته ايندڙ مضمون ۾ آئون ڪوشش ڪندس ته وزن سينسر جي حساب سان الورورٿم کي بيان ڪرڻ سان گڏ BLE اسٽيڪ سان ڳنڍڻ.

مواد

جو ذريعو: www.habr.com

تبصرو شامل ڪريو