HX711 ADC کو NRF52832 سے کیسے جوڑیں۔

1. تعارف

ایجنڈے میں nrf52832 مائیکرو کنٹرولر کے لیے دو آدھے پل چینی سٹرین گیجز کے ساتھ ایک کمیونیکیشن پروٹوکول تیار کرنا تھا۔

یہ کام آسان نہیں تھا، کیونکہ مجھے کسی قابل فہم معلومات کی کمی کا سامنا تھا۔ اس بات کا زیادہ امکان ہے کہ "برائی کی جڑ" خود نورڈک سیمی کنڈکٹر سے SDK میں ہے - مستقل ورژن اپ ڈیٹس، کچھ فالتو پن اور مبہم فعالیت۔ مجھے شروع سے سب کچھ لکھنا پڑا۔

میرے خیال میں یہ موضوع اس حقیقت کی بنیاد پر کافی متعلقہ ہے کہ اس چپ میں ایک BLE اسٹیک ہے اور توانائی کی بچت کے موڈ کے لیے "سامان" کا پورا سیٹ ہے۔ لیکن میں تکنیکی حصے میں زیادہ گہرائی میں نہیں جاؤں گا، کیونکہ اس موضوع پر بہت سے مضامین لکھے جا چکے ہیں۔

2. پروجیکٹ کی تفصیل

HX711 ADC کو NRF52832 سے کیسے جوڑیں۔

آئرن:

  • Adafruit Feather nRF52 Bluefruit LE (ہاتھ میں کیا ہوا)
  • ADC HX711
  • چینی سٹرین گیجز 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);
}

ہم RTC ٹائمر سے 10 سیکنڈ کے وقفے کے ساتھ واقعات کی توقع کرتے ہیں (یہ آپ کی صوابدید پر ہے) اور HX711 کو ہینڈلر میں لانچ کریں گے، جس سے DOUT لائن میں رکاوٹ پیدا ہوگی۔

ایک اور نکتہ ہے، لاگز UART کے ذریعے آؤٹ پٹ ہوتے ہیں (باؤڈ ریٹ 115200، TX - 6 پن، RX - 8 پن) تمام ترتیبات sdk_config.h میں ہیں۔

HX711 ADC کو NRF52832 سے کیسے جوڑیں۔

نتائج

آپ کی توجہ کے لیے آپ سب کا شکریہ، مجھے امید ہے کہ یہ مضمون کارآمد ثابت ہوگا اور ڈویلپرز کے لیے حل تلاش کرنے کے لیے قیمتی وقت کو کم کرے گا۔ میں یہ کہنا چاہتا ہوں کہ نورڈک اپنے پلیٹ فارمز میں جو تکنیکی نقطہ نظر استعمال کرتا ہے وہ توانائی کی کارکردگی کے نقطہ نظر سے کافی دلچسپ ہے۔

PS

پراجیکٹ اب بھی ترقی کے تحت ہے، لہذا اگر یہ موضوع دلچسپی کا حامل ہے، تو میں اگلے مضمون میں وزن کے سینسر کیلیبریٹ کرنے کے ساتھ ساتھ BLE اسٹیک کو جوڑنے کے الگورتھم کو بیان کرنے کی کوشش کروں گا۔

مواد

ماخذ: www.habr.com

نیا تبصرہ شامل کریں