Kako spojiti HX711 ADC na NRF52832

1. uvod

Na dnevnom redu bio je zadatak razvoja komunikacijskog protokola za mikrokontroler nrf52832 s dva polumosna kineska mjerača naprezanja.

Zadatak se nije pokazao lakim jer sam se suočio s nedostatkom bilo kakvih razumljivih informacija. Vjerojatnije je da je "korijen zla" u samom SDK-u tvrtke Nordic Semiconductor - stalna ažuriranja verzija, nešto redundancije i zbunjujuće funkcionalnosti. Morao sam sve napisati ispočetka.

Mislim da je ova tema vrlo relevantna na temelju činjenice da ovaj čip ima BLE stack i čitav niz "dobroga" za način rada za uštedu energije. Ali neću ulaziti preduboko u tehnički dio, jer je na tu temu napisano mnogo članaka.

2. Opis projekta

Kako spojiti HX711 ADC na NRF52832

Željezo:

  • Adafruit Feather nRF52 Bluefruit LE (ono što se našlo pri ruci)
  • ADC HX711
  • Kineski mjerači naprezanja 2 kom. (50x2 kg)
  • Programator ST-LINK V2

Softver:

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

Sve je u jednom projektu, samo trebate podesiti Makefile (odredite lokaciju vašeg SDK-a).

3. Opis šifre

Koristit ćemo GPIOTE modul za rad s periferijama na temelju povezivanja zadataka i događaja, kao i PPI modul za prijenos podataka s jedne periferije na drugu bez sudjelovanja procesora.

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

Konfiguriramo PD_SCL sinkronizacijsku liniju na izlaz za generiranje impulsa u trajanju od 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);//включаем таймер
}
 

Konfiguriramo DOUT podatkovnu liniju za očitavanje stanja spremnosti HX711; ako postoji niska razina, pokreće se rukovatelj u kojem onemogućujemo prekid i pokrećemo mjerač vremena za generiranje taktnih impulsa na PD_SCL izlazu.

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

// omogući gpiote

Nakon toga inicijaliziramo PPI modul i povezujemo naš timer na PD_SCL izlaz za generiranje impulsa u trajanju od 10 μs kada se dogodi događaj usporedbe, te također uključujemo GPIOTE modul.


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);// срабатывает по сравнению

Inicijaliziramo nulti mjerač vremena i njegov rukovatelj.

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

Najzanimljivija stvar događa se u rukovatelju timerom. Period impulsa je 20 μs. Zanimaju nas neparni impulsi (uz rastući rub) i pod uvjetom da njihov broj nije veći od 24, a događaja ima 48. Za svaki neparni događaj očitava se DOUT

Iz podatkovne tablice proizlazi da broj impulsa mora biti najmanje 25, što odgovara dobitku od 128 (u kodu sam koristio 25 impulsa), to je ekvivalentno 50 vremenskih događaja, što označava kraj podatkovnog okvira.

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

Nakon toga isključujemo tajmer i obrađujemo podatke (prema podatkovnoj tablici) i prebacujemo HX711 u način rada niske potrošnje energije.


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

Očekujemo događaje od RTC timera s intervalom od 10 s (ovo je po vašem nahođenju) i pokrećemo HX711 u rukovatelju, uzrokujući prekid na liniji DOUT.

Postoji još jedna točka, zapisi se izlaze putem UART-a (brzina prijenosa 115200, TX - 6 pinova, RX - 8 pinova) sve postavke su u sdk_config.h

Kako spojiti HX711 ADC na NRF52832

Zaključci

Hvala svima na pažnji, nadam se da će ovaj članak biti koristan i da će programerima smanjiti dragocjeno vrijeme za pronalaženje rješenja. Želim reći da je tehnički pristup koji Nordic koristi u svojim platformama vrlo zanimljiv sa stajališta energetske učinkovitosti.

PS

Projekt je još u razvoju, pa ako ova tema bude zanimljiva, u sljedećem članku ću pokušati opisati algoritam za kalibraciju senzora težine, kao i povezivanje BLE stack-a.

Materijali

Izvor: www.habr.com

Dodajte komentar