Sådan tilsluttes HX711 ADC til NRF52832

1. Introduktion

På dagsordenen var opgaven med at udvikle en kommunikationsprotokol til nrf52832 mikrocontrolleren med to halvbro kinesiske strain gauges.

Opgaven viste sig ikke at være let, da jeg stod over for en mangel på forståelig information. Det er mere sandsynligt, at "root of evil" er i SDK'et fra Nordic Semiconductor selv - konstante versionsopdateringer, noget redundans og forvirrende funktionalitet. Jeg skulle skrive alt fra bunden.

Jeg tror, ​​at dette emne er ret relevant baseret på det faktum, at denne chip har en BLE-stak og et helt sæt "godbidder" til energibesparende tilstand. Men jeg vil ikke gå for dybt ind i den tekniske del, da der er skrevet mange artikler om dette emne.

2. Projektbeskrivelse

Sådan tilsluttes HX711 ADC til NRF52832

Jern:

  • Adafruit Feather nRF52 Bluefruit LE (hvad der tilfældigvis var lige ved hånden)
  • HX711 ADC
  • Kinesiske strain gauges 2 stk. (50x2 kg)
  • Programmer ST-LINK V2

Software:

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

Alt er i ét projekt, du skal bare justere Makefilen (angiv placeringen af ​​din SDK).

3. Beskrivelse af koden

Vi vil bruge GPIOTE-modulet til at arbejde med periferiudstyr baseret på binding af opgaver og hændelser, samt PPI-modulet til at overføre data fra en perifer enhed til en anden uden deltagelse af en processor.

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

Vi konfigurerer PD_SCL-synkroniseringslinjen til udgangen for at generere impulser med en varighed på 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);//включаем таймер
}
 

Vi konfigurerer DOUT-datalinjen til at læse beredskabstilstanden for HX711; hvis der er et lavt niveau, udløses en handler, hvor vi deaktiverer afbrydelsen og starter en timer til at generere clock-impulser ved PD_SCL-udgangen.

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

// aktiver gpiote

Derefter initialiserer vi PPI-modulet og forbinder vores timer til PD_SCL-udgangen for at generere impulser med en varighed på 10 μs, når der opstår en sammenligningshændelse, og tænder også for GPIOTE-modulet.


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

Vi initialiserer nultimeren og dens handler.

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

Det mest interessante sker i timer-handleren. Pulsperioden er 20 μs. Vi er interesserede i ulige impulser (langs den stigende kant) og forudsat at deres antal ikke er mere end 24, og der er 48. For hver ulige begivenhed aflæses DOUT

Af databladet følger, at antallet af pulser skal være mindst 25, hvilket svarer til en forstærkning på 128 (i koden brugte jeg 25 pulser), dette svarer til 50 timerhændelser, hvilket angiver slutningen af ​​datarammen.

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

Herefter slukker vi timeren og behandler dataene (ifølge databladet) og skifter HX711 til lavt strømforbrug.


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

Vi forventer hændelser fra RTC-timeren med et interval på 10 s (dette er efter dit skøn) og starter HX711 i handleren, hvilket forårsager en afbrydelse på DOUT-linjen.

Der er et punkt mere, logfilerne udsendes via UART (baudrate 115200, TX - 6 ben, RX - 8 ben) alle indstillinger er i sdk_config.h

Sådan tilsluttes HX711 ADC til NRF52832

Fund

Tak for jeres opmærksomhed, jeg håber, at denne artikel vil være nyttig og vil reducere værdifuld tid for udviklere til at finde en løsning. Jeg vil sige, at den tekniske tilgang, som Nordic bruger i sine platforme, er ret interessant ud fra et energieffektivitetssynspunkt.

PS

Projektet er stadig under udvikling, så hvis dette emne er af interesse, vil jeg i næste artikel forsøge at beskrive algoritmen til kalibrering af vægtsensorer, samt tilslutning af BLE-stakken.

materialer

Kilde: www.habr.com

Tilføj en kommentar