Cumu cunnette HX711 ADC à NRF52832

1. Introduzione

À l'agenda era u compitu di sviluppà un protokollu di cumunicazione per u microcontroller nrf52832 cù dui strain gauges chinesi di mezzu ponte.

U compitu ùn era micca faciule, postu chì era affruntatu cù una mancanza di infurmazione intelligibile. Hè più prubabile chì a "radica di u male" hè in u SDK da Nordic Semiconductor stessu - aghjurnamenti di versione custanti, qualchì redundanza è funziunalità cunfusa. Aviu avutu à scrive tuttu da zero.

Pensu chì questu tema hè abbastanza pertinenti basatu annantu à u fattu chì stu chip hà una pila BLE è un inseme sanu di "buoni" per u modu di risparmiu d'energia. Ma ùn andaraghju troppu in a parte tecnica, postu chì parechji articuli sò stati scritti nantu à questu tema.

2. Descrizzione di u prugettu

Cumu cunnette HX711 ADC à NRF52832

Ferru:

  • Adafruit Feather nRF52 Bluefruit LE (ciò chì hè accadutu à a manu)
  • ADC HX711
  • Strain gauges chinesi 2 pezzi. (50 x 2 kg)
  • Programmatore ST-LINK V2

Software:

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

Tuttu hè in un prughjettu, basta à aghjustà u Makefile (specificà u locu di u vostru SDK).

3. Descrizzione di u codice

Aduprà u modulu GPIOTE per travaglià cù periferiche basate nantu à u ligame di i travaglii è l'avvenimenti, è ancu u modulu PPI per trasfiriri dati da un perifericu à l'altru senza a participazione di u processatore.

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

Configurate a linea di sincronizazione PD_SCL à l'output per generà impulsi cù una durata di 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);//включаем таймер
}
 

Configurate a linea di dati DOUT per leghje u statu di prontezza di l'HX711; se ci hè un livellu bassu, hè attivatu un gestore in quale disattivemu l'interruzzione è cuminciamu un timer per generà impulsi di clock à l'output 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); 

// attiva gpiote

Dopu à quessa, avemu inizializatu u modulu PPI è cunnette u nostru timer à l'output PD_SCL per generà impulsi cù una durata di 10 μs quandu si verifica un avvenimentu di paraguni, è ancu accende u modulu 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);// срабатывает по сравнению

Inizialemu u timer zero è u so handler.

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

A cosa più interessante succede in u gestore di timer. U periodu di l'impulsu hè di 20 μs. Semu interessate in impulsi strani (longu à u bordu crescente) è sempre chì u so numeru ùn hè micca più di 24, è ci sò avvenimenti 48. Per ogni avvenimentu stranu, DOUT hè lettu.

Da a datasheet segue chì u numeru di impulsi deve esse almenu 25, chì currisponde à un guadagnu di 128 (in u codice aghju utilizatu 25 impulsi), questu hè equivalente à 50 eventi timer, chì indica a fine di u quadru di dati.

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

Dopu questu, spegnemu u timer è prucessa i dati (sicondu a datasheet) è cambia l'HX711 à u modu di cunsumu d'energia bassu.


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

Aspittemu avvenimenti da u timer RTC cù un intervallu di 10 s (questu hè à a vostra discrezione) è lanciate u HX711 in u handler, causendu una interruzzione in a linea DOUT.

Ci hè un puntu più, i logs sò in output via UART (baud rate 115200, TX - 6 pins, RX - 8 pins) tutti i paràmetri sò in sdk_config.h

Cumu cunnette HX711 ADC à NRF52832

scuperti

Grazie à tutti per a vostra attenzione, speru chì questu articulu serà utile è riducerà u tempu preziosu per i sviluppatori per truvà una suluzione. Vogliu dì chì l'approcciu tecnicu chì Nordic usa in e so plataforme hè abbastanza interessante da u puntu di vista di l'efficienza energetica.

PS

U prugettu hè sempre in sviluppu, dunque, se stu tema hè di interessu, in u prossimu articulu pruvaraghju à descriverà l'algoritmu per calibrating sensors di pisu, è ancu di cunnette u stack BLE.

Materiali

Source: www.habr.com

Add a comment