Cách kết nối ADC HX711 với NRF52832

XUẤT KHẨU. Giới thiệu

Trong chương trình nghị sự là nhiệm vụ phát triển giao thức truyền thông cho bộ vi điều khiển nrf52832 với hai máy đo biến dạng nửa cầu của Trung Quốc.

Nhiệm vụ hóa ra không hề dễ dàng vì tôi phải đối mặt với việc thiếu bất kỳ thông tin dễ hiểu nào. Nhiều khả năng “gốc rễ của cái ác” nằm trong SDK của chính Nordic Semiconductor - các phiên bản cập nhật liên tục, một số chức năng dư thừa và khó hiểu. Tôi đã phải viết mọi thứ từ đầu.

Tôi nghĩ chủ đề này khá phù hợp dựa trên thực tế là con chip này có ngăn xếp BLE và cả bộ “quà tặng” cho chế độ tiết kiệm năng lượng. Nhưng tôi sẽ không đi quá sâu vào phần kỹ thuật vì đã có nhiều bài viết về chủ đề này.

2. Mô tả dự án

Cách kết nối ADC HX711 với NRF52832

Sắt:

  • Adaf nhung Feather nRF52 Bluefruit LE (những gì đã xảy ra trong tầm tay)
  • ADC HX711
  • Máy đo biến dạng Trung Quốc 2 chiếc. (50x2kg)
  • Lập trình viên ST-LINK V2

Phần mềm:

  • IDE VSCODE
  • SDK NRF 16
  • mởOCD
  • Lập trình viên ST-LINK V2

Mọi thứ đều có trong một dự án, bạn chỉ cần điều chỉnh Makefile (chỉ định vị trí SDK của bạn).

3. Mô tả mã

Chúng tôi sẽ sử dụng mô-đun GPIOTE để làm việc với các thiết bị ngoại vi dựa trên sự ràng buộc của các tác vụ và sự kiện, cũng như mô-đun PPI để truyền dữ liệu từ thiết bị ngoại vi này sang thiết bị ngoại vi khác mà không cần sự tham gia của bộ xử lý.

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);//настраеваем на выход

Chúng tôi định cấu hình đường đồng bộ hóa PD_SCL cho đầu ra để tạo ra các xung có thời lượng 10 μs.

   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);//включаем таймер
}
 

Chúng tôi định cấu hình dòng dữ liệu DOUT để đọc trạng thái sẵn sàng của HX711; nếu có mức thấp, một trình xử lý sẽ được kích hoạt trong đó chúng tôi vô hiệu hóa ngắt và khởi động bộ hẹn giờ để tạo xung đồng hồ ở đầu ra 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); 

// kích hoạt gpiote

Sau đó, chúng tôi khởi tạo mô-đun PPI và kết nối bộ hẹn giờ với đầu ra PD_SCL để tạo ra các xung có thời lượng 10 μs khi xảy ra sự kiện so sánh, đồng thời bật mô-đun 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);// срабатывает по сравнению

Chúng tôi khởi tạo bộ đếm thời gian bằng 0 và trình xử lý của nó.

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

Điều thú vị nhất xảy ra trong bộ xử lý hẹn giờ. Chu kỳ xung là 20 μs. Chúng tôi quan tâm đến các xung lẻ (dọc theo cạnh tăng) và với điều kiện số lượng của chúng không quá 24 và có 48 sự kiện. Đối với mỗi sự kiện lẻ, DOUT được đọc

Từ biểu dữ liệu, số xung phải ít nhất là 25, tương ứng với mức tăng 128 (trong mã tôi đã sử dụng 25 xung), điều này tương đương với 50 sự kiện hẹn giờ, cho biết sự kết thúc của khung dữ liệu.

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

Sau đó, chúng ta tắt bộ hẹn giờ và xử lý dữ liệu (theo datasheet) và chuyển HX711 sang chế độ tiêu thụ điện năng thấp.


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

Chúng tôi mong đợi các sự kiện từ bộ hẹn giờ RTC có khoảng thời gian là 10 giây (điều này tùy theo quyết định của bạn) và khởi chạy HX711 trong bộ xử lý, gây ra gián đoạn trên đường DOUT.

Còn một điểm nữa, nhật ký được xuất qua UART (tốc độ baud 115200, TX - 6 chân, RX - 8 chân) tất cả các cài đặt đều nằm trong sdk_config.h

Cách kết nối ADC HX711 với NRF52832

Những phát hiện

Cảm ơn tất cả các bạn đã quan tâm, tôi hy vọng bài viết này sẽ hữu ích và sẽ giảm bớt thời gian quý báu cho các nhà phát triển để tìm ra giải pháp. Tôi muốn nói rằng phương pháp tiếp cận kỹ thuật mà Nordic sử dụng trong các nền tảng của mình khá thú vị xét từ quan điểm tiết kiệm năng lượng.

PS

Dự án vẫn đang được phát triển, vì vậy nếu chủ đề này được quan tâm, trong bài viết tiếp theo tôi sẽ cố gắng mô tả thuật toán hiệu chỉnh cảm biến trọng lượng, cũng như kết nối ngăn xếp BLE.

vật liệu

Nguồn: www.habr.com

Thêm một lời nhận xét