HX711 ADC ni NRF52832 ga qanday ulash mumkin

1. Kirish

Kun tartibida nrf52832 mikrokontrolleri uchun ikkita yarim ko'prikli xitoy deformatsiya o'lchagichlari bilan aloqa protokolini ishlab chiqish vazifasi bor edi.

Vazifa oson bo'lmadi, chunki men tushunarli ma'lumotlarning etishmasligiga duch keldim. "Yovuzlikning ildizi" Nordic Semiconductor-ning SDK-da bo'lishi ehtimoldan yiroq - doimiy versiya yangilanishlari, ba'zi ortiqcha va chalkash funksiyalar. Men hamma narsani boshidan yozishim kerak edi.

O'ylaymanki, bu mavzu ushbu chipda BLE stekiga va energiya tejash rejimi uchun "yaxshi narsalar" to'plamiga ega ekanligiga asoslanib, juda dolzarb. Ammo men texnik qismga chuqur kirmayman, chunki bu mavzu bo'yicha ko'plab maqolalar yozilgan.

2. Loyihaning tavsifi

HX711 ADC ni NRF52832 ga qanday ulash mumkin

Temir:

  • Adafruit Feather nRF52 Bluefruit LE (qo'lda bo'lgan voqea)
  • HX711 ADC
  • Xitoy taymerlari 2 dona. (50x2 kg)
  • Dasturchi ST-LINK V2

Dasturiy ta'minot:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Dasturchi ST-LINK V2

Hammasi bitta loyihada, siz shunchaki Makefile faylini o'zgartirishingiz kerak (SDK joylashuvini belgilang).

3. Kodning tavsifi

Biz GPIOTE modulidan vazifalar va hodisalarni bog'lash asosida tashqi qurilmalar bilan ishlash uchun, shuningdek, protsessor ishtirokisiz ma'lumotlarni bir periferiyadan ikkinchisiga o'tkazish uchun PPI modulidan foydalanamiz.

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);//настраСваСм Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄

Biz PD_SCL sinxronlash liniyasini 10 mks davomiylikdagi impulslarni hosil qilish uchun chiqishga sozlaymiz.

   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);//Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
}
 

Biz DOUT ma'lumotlar liniyasini HX711 ning tayyorlik holatini o'qish uchun sozlaymiz; agar past daraja bo'lsa, ishlov beruvchi ishga tushiriladi, unda biz uzilishni o'chirib qo'yamiz va PD_SCL chiqishida soat impulslarini yaratish uchun taymerni ishga tushiramiz.

 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); 

// gpiot-ni yoqing

Shundan so'ng, biz PPI modulini ishga tushiramiz va taqqoslash hodisasi sodir bo'lganda 10 mks davomiylikdagi impulslarni hosil qilish uchun taymerimizni PD_SCL chiqishiga ulaymiz, shuningdek, GPIOTE modulini yoqamiz.


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);// срабатываСт ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ

Biz nol taymerini va uning ishlov beruvchisini ishga tushiramiz.

  if(m_counter%2 != 0 && m_counter<=48){
       buffer <<= 1;// пСрСмСнная считанных Π΄Π°Π½Ρ‹Ρ…
        c_counter++;// счСтчик ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…  ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠ²
           if(nrf_gpio_pin_read(DOUT))buffer++;//считываСм состояниС Π²Ρ…ΠΎΠ΄Π°
   }

Eng qiziqarli narsa taymer ishlov beruvchisida sodir bo'ladi. Puls davri 20 mks. Bizni toq impulslar qiziqtiradi (ko'tarilgan chekka bo'ylab) va agar ularning soni 24 tadan ko'p bo'lmasa va 48 ta hodisa mavjud bo'lsa. Har bir toq hodisa uchun DOUT o'qiladi.

Ma'lumotlar varag'idan impulslar soni kamida 25 bo'lishi kerak, bu 128 ta daromadga to'g'ri keladi (kodda men 25 ta impuls ishlatganman), bu ma'lumotlar ramkasining tugashini ko'rsatadigan 50 ta taymer hodisasiga teng.

 ++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
       }
   

Shundan so'ng biz taymerni o'chirib, ma'lumotlarni qayta ishlaymiz (ma'lumotlar varag'iga ko'ra) va HX711 ni kam quvvat iste'moli rejimiga o'tkazamiz.


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);
}

Biz RTC taymeridan 10 soniyalik interval bilan voqealarni kutamiz (bu sizning ixtiyoringizda) va HX711-ni ishlov beruvchida ishga tushirib, DOUT liniyasida uzilishga olib keladi.

Yana bir nuqta bor, jurnallar UART orqali chiqariladi (bod tezligi 115200, TX - 6 pin, RX - 8 pin) barcha sozlamalar sdk_config.h da.

HX711 ADC ni NRF52832 ga qanday ulash mumkin

topilmalar

E'tiboringiz uchun barchangizga rahmat, umid qilamanki, ushbu maqola foydali bo'ladi va ishlab chiquvchilarga yechim topish uchun qimmatli vaqtni qisqartiradi. Aytmoqchimanki, Nordic o'z platformalarida foydalanadigan texnik yondashuv energiya samaradorligi nuqtai nazaridan juda qiziq.

PS

Loyiha hali ham ishlab chiqilmoqda, shuning uchun agar ushbu mavzu qiziq bo'lsa, keyingi maqolada men og'irlik sensorlarini kalibrlash algoritmini, shuningdek, BLE stekini ulashni tasvirlashga harakat qilaman.

materiallari

Manba: www.habr.com

a Izoh qo'shish