HX711 ADC-ni NRF52832-ə necə bağlamaq olar

1. Giriş

Gündəlikdə iki yarım körpü Çin gərginlikölçənləri ilə nrf52832 mikrokontrolleri üçün rabitə protokolunun hazırlanması məsələsi var idi.

Hər hansı bir başa düşülən məlumat çatışmazlığı ilə üzləşdiyim üçün tapşırığın asan olmadığı ortaya çıxdı. "Şərin kökünün" Nordic Semiconductor-un özündən olan SDK-da olması ehtimalı daha yüksəkdir - daimi versiya yeniləmələri, bəzi ehtiyatlar və çaşdırıcı funksionallıq. Hər şeyi sıfırdan yazmalı oldum.

Düşünürəm ki, bu çipin BLE yığınına və enerjiyə qənaət rejimi üçün bütün "yaxşılıqlara" malik olmasına əsaslanaraq, bu mövzu olduqca aktualdır. Ancaq texniki hissəyə çox da girməyəcəyəm, çünki bu mövzuda çoxlu məqalələr yazılmışdır.

2. Layihənin təsviri

HX711 ADC-ni NRF52832-ə necə bağlamaq olar

Dəmir:

  • Adafruit Feather nRF52 Bluefruit LE (əldə olanlar)
  • HX711 ADC
  • Çin gərginlikölçənləri 2 ədəd. (50x2 kq)
  • Proqramçı ST-LINK V2

Proqram təminatı:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Proqramçı ST-LINK V2

Hər şey bir layihədədir, sadəcə olaraq Makefile-ni tənzimləməlisiniz (SDK-nın yerini göstərin).

3. Kodun təsviri

Biz tapşırıqların və hadisələrin bağlanmasına əsaslanan periferiya qurğuları ilə işləmək üçün GPIOTE modulundan, həmçinin prosessorun iştirakı olmadan məlumatları bir periferiyadan digərinə ötürmək üçün PPI modulundan istifadə edəcəyik.

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 sinxronizasiya xəttini çıxışa 10 μs müddətində impulslar yaratmaq üçün konfiqurasiya edirik.

   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-in hazırlıq vəziyyətini oxumaq üçün DOUT məlumat xəttini konfiqurasiya edirik; aşağı səviyyə varsa, kəsməni söndürdük və PD_SCL çıxışında saat impulsları yaratmaq üçün taymer işə saldığımız bir işləyici işə salınır.

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

// gpiotu aktivləşdirin

Bundan sonra biz PPI modulunu işə salırıq və müqayisə hadisəsi baş verdikdə 10 μs müddəti ilə impulslar yaratmaq üçün taymerimizi PD_SCL çıxışına qoşuruq, həmçinin GPIOTE modulunu işə salırıq.


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 sıfır taymerini və onun işləyicisini işə salırıq.

  if(m_counter%2 != 0 && m_counter<=48){
       buffer <<= 1;// переменная считанных даных
        c_counter++;// счетчик положительных  импульсов
           if(nrf_gpio_pin_read(DOUT))buffer++;//считываем состояние входа
   }

Ən maraqlı şey taymer idarəedicisində olur. Nəbz müddəti 20 μs-dir. Bizi tək impulslar maraqlandırır (artan kənar boyunca) və onların sayı 24-dən çox olmamaq şərti ilə və 48 hadisə var. Hər tək hadisə üçün DOUT oxunur.

Məlumat vərəqindən belə çıxır ki, impulsların sayı ən azı 25 olmalıdır ki, bu da 128 qazancına uyğundur (kodda 25 impuls istifadə etdim), bu, məlumat çərçivəsinin sonunu göstərən 50 taymer hadisəsinə bərabərdir.

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

Bundan sonra biz taymeri söndürürük və məlumatları emal edirik (məlumat vərəqinə uyğun olaraq) və HX711-i aşağı enerji istehlakı rejiminə keçirik.


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 taymerindən 10 saniyəlik intervalla hadisələr gözləyirik (bu, sizin ixtiyarınızdadır) və HX711-i idarəedicidə işə salaraq, DOUT xəttində fasiləyə səbəb olur.

Daha bir nöqtə var, loglar UART vasitəsilə çıxarılır (baud rate 115200, TX - 6 pin, RX - 8 pins) bütün parametrlər sdk_config.h daxilindədir.

HX711 ADC-ni NRF52832-ə necə bağlamaq olar

Tapıntılar

Diqqətiniz üçün hamınıza təşəkkür edirəm, ümid edirəm ki, bu məqalə faydalı olacaq və tərtibatçıların həll yolu tapmaq üçün dəyərli vaxtını azaldacaq. Demək istəyirəm ki, Nordic-in platformalarında istifadə etdiyi texniki yanaşma enerji səmərəliliyi baxımından olduqca maraqlıdır.

PS

Layihə hələ də inkişaf mərhələsindədir, buna görə də bu mövzu maraq doğurursa, növbəti məqalədə çəki sensorlarının kalibrlənməsi, həmçinin BLE yığınını birləşdirən alqoritmi təsvir etməyə çalışacağam.

Materiallar

Mənbə: www.habr.com

Добавить комментарий