HX711 ADC-г NRF52832 руу хэрхэн холбох вэ

1. Оршил

Хэлэлцэх асуудлын жагсаалтад хоёр хагас гүүртэй хятад странсометр бүхий nrf52832 микроконтроллерийн холбооны протокол боловсруулах асуудал байв.

Ойлгомжтой мэдээлэл дутмаг байсан тул даалгавар тийм ч амар биш болсон. "Муугийн үндэс" нь Nordic Semiconductor-ийн SDK-д байдаг байх магадлалтай - хувилбарын байнгын шинэчлэлтүүд, зарим илүүдэл, төөрөгдүүлсэн функцууд. Би бүх зүйлийг эхнээс нь бичих хэрэгтэй болсон.

Энэ чип нь BLE стек, эрчим хүч хэмнэх горимд зориулсан бүхэл бүтэн багц "сайн"-тай байдаг тул энэ сэдэв нэлээд хамааралтай гэж би бодож байна. Гэхдээ энэ сэдвээр олон нийтлэл бичсэн тул би техникийн хэсэгт гүнзгий орохгүй.

2. Төслийн тодорхойлолт

HX711 ADC-г NRF52832 руу хэрхэн холбох вэ

Төмөр:

  • Adafruit Feather nRF52 Bluefruit LE (гарт байсан зүйл)
  • HX711 ADC
  • Хятад омог хэмжигч 2ш. (50х2 кг)
  • Програмист 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

сэтгэгдэл нэмэх