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

1. .ведение

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

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

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

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

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

الحديد:

  • Adafruit Feather nRF52 Bluefruit LE (ما حدث في متناول اليد)
  • ADC HX711
  • خلايا الحمل الصينية 2 جهاز كمبيوتر شخصى. (50 × 2 كجم)
  • مبرمج ST-LINK V2

لينة:

  • بيئة تطوير متكاملة 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

النتائج

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

PS

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

المواد

المصدر: www.habr.com

إضافة تعليق