Hvordan koble HX711 ADC til NRF52832

1. Introduksjon

På agendaen sto oppgaven med å utvikle en kommunikasjonsprotokoll for nrf52832 mikrokontrolleren med to halvbro kinesiske strain gauges.

Oppgaven viste seg ikke å være lett, da jeg ble møtt med mangel på forståelig informasjon. Det er mer sannsynlig at "root of evil" er i SDK fra Nordic Semiconductor selv - konstante versjonsoppdateringer, noe redundans og forvirrende funksjonalitet. Jeg måtte skrive alt fra bunnen av.

Jeg tror dette emnet er ganske relevant basert på det faktum at denne brikken har en BLE-stabel og et helt sett med "godbiter" for energisparingsmodus. Men jeg vil ikke gå for dypt inn i den tekniske delen, siden det er skrevet mange artikler om dette emnet.

2. Beskrivelse av prosjektet

Hvordan koble HX711 ADC til NRF52832

Jern:

  • Adafruit Feather nRF52 Bluefruit LE (det som tilfeldigvis var for hånden)
  • ADC HX711
  • Kinesiske strekkmålere 2 stk. (50x2 kg)
  • Programmerer ST-LINK V2

Programvare:

  • IDE VSCODE
  • NRF SDK 16
  • Åpne OCD
  • Programmerer ST-LINK V2

Alt er i ett prosjekt, du må bare justere Makefilen (spesifiser plasseringen av SDK-en din).

3. Beskrivelse av koden

Vi vil bruke GPIOTE-modulen til å jobbe med periferiutstyr basert på binding av oppgaver og hendelser, samt PPI-modulen for å overføre data fra en perifer enhet til en annen uten deltakelse av en prosessor.

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 utgangen for å generere pulser med en varighet 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 å lese beredskapstilstanden til HX711; hvis det er et lavt nivå, utløses en behandler der vi deaktiverer avbruddet og starter en timer for å generere klokkepulser ved PD_SCL-utgangen.

 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

Etter det initialiserer vi PPI-modulen og kobler timeren vår til PD_SCL-utgangen for å generere pulser med en varighet på 10 μs når en sammenligningshendelse oppstår, og slår også på GPIOTE-modulen.


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 nulltimeren og dens behandler.

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

Det mest interessante skjer i tidtakeren. Pulsperioden er 20 μs. Vi er interessert i oddepulser (langs den stigende kanten) og forutsatt at antallet ikke er mer enn 24, og det er 48 hendelser. For hver oddetall leses DOUT

Fra dataarket følger det at antall pulser må være minst 25, som tilsvarer en forsterkning på 128 (i koden brukte jeg 25 pulser), dette tilsvarer 50 timer-hendelser, som indikerer slutten av 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
       }
   

Etter dette slår vi av timeren og behandler dataene (i henhold til dataarket) og bytter HX711 til lavt strømforbruk.


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 hendelser fra RTC-timeren med et intervall på 10 s (dette er etter ditt skjønn) og starter HX711 i handleren, og forårsaker et avbrudd på DOUT-linjen.

Det er ett poeng til, loggene sendes ut via UART (overføringshastighet 115200, TX - 6 pinner, RX - 8 pinner) alle innstillinger er i sdk_config.h

Hvordan koble HX711 ADC til NRF52832

Funn

Takk alle for oppmerksomheten, jeg håper denne artikkelen vil være nyttig og vil redusere verdifull tid for utviklere å finne en løsning. Jeg vil si at den tekniske tilnærmingen som Nordic bruker i sine plattformer er ganske interessant fra et energieffektivitetssynspunkt.

PS

Prosjektet er fortsatt under utvikling, så hvis dette emnet er av interesse, vil jeg i neste artikkel prøve å beskrive algoritmen for kalibrering av vektsensorer, samt tilkobling av BLE-stakken.

materialer

Kilde: www.habr.com

Legg til en kommentar