نحوه اتصال 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
  • 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 میکرو ثانیه تولید کنند و همچنین ماژول 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

اضافه کردن نظر