كيفية توصيل HX711 ADC بـ NRF52832

1 المقدمة



كان على جدول الأعمال مهمة تطوير بروتوكول اتصال للمتحكم الدقيق nrf52832 مع مقياسين سلالة صينيين نصف جسر.



تبين أن المهمة ليست سهلة ، حيث واجهت نقصًا في أي معلومات واضحة. من المرجح أن يكون "جذر الشر" موجودًا في SDK نفسه من Nordic Semiconductor - هذه تحديثات إصدار ثابتة ، وبعض التكرار والارتباك في الوظائف. كان علي أن أكتب كل شيء من الصفر.



أعتقد أن هذا الموضوع وثيق الصلة تمامًا بالنظر إلى أن هذه الشريحة بها مكدس BLE ومجموعة كاملة من "الحلويات" لوضع توفير الطاقة. لكنني لن أتعمق في الجزء الفني ، حيث تم كتابة العديد من المقالات حول هذا الموضوع.



2. وصف المشروع



صورة



حديد:



  • Adafruit Feather nRF52 Bluefruit LE (ما حدث ليكون في متناول اليد)
  • ADC HX711
  • مقاييس السلالة الصينية 2 قطعة. (50 × 2 كجم)
  • مبرمج ST-LINK V2


البرمجيات:



  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • مبرمج ST-LINK V2




كل شيء موجود في مشروع واحد ، ما عليك سوى استخدام shaman 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 ميكرو ثانية عند حدوث حدث المقارنة ، وكذلك تشغيل وحدة 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 (baud rate 115200, TX — 6 , RX — 8 ) sdk_config.h



صورة





أشكركم جميعًا على اهتمامكم ، وآمل أن تكون هذه المقالة مفيدة وتوفر وقتًا ثمينًا للمطورين الباحثين عن حل. أريد أن أقول إن النهج التقني الذي تستخدمه دول الشمال في منصاتها مثير للاهتمام للغاية من حيث كفاءة الطاقة.



ملاحظة



لا يزال المشروع قيد التطوير ، لذلك إذا كان هذا الموضوع مثيرًا للاهتمام في المقالة التالية ، فسأحاول وصف الخوارزمية لمعايرة مستشعرات الوزن ، وكذلك توصيل مكدس BLE.



المواد






All Articles