Hur man ansluter HX711 ADC till NRF52832

1. Introduktion

På agendan stod uppdraget att ta fram ett kommunikationsprotokoll för mikrokontrollern nrf52832 med två halvbrygga kinesiska töjningsmätare.

Uppgiften visade sig inte vara lätt, eftersom jag ställdes inför en brist på begriplig information. Det är mer troligt att "root of evil" finns i SDK från Nordic Semiconductor själv - ständiga versionsuppdateringar, viss redundans och förvirrande funktionalitet. Jag var tvungen att skriva allt från grunden.

Jag tror att det här ämnet är ganska relevant baserat på det faktum att detta chip har en BLE-stack och en hel uppsättning "godsaker" för energisparläge. Men jag ska inte gå för djupt in på den tekniska delen, eftersom många artiklar har skrivits om detta ämne.

2. Projektbeskrivning

Hur man ansluter HX711 ADC till NRF52832

Järn:

  • Adafruit Feather nRF52 Bluefruit LE (vad som råkade vara till hands)
  • HX711 ADC
  • Kinesiska töjningsmätare 2 st. (50x2 kg)
  • Programmerare ST-LINK V2

Programvara:

  • IDE VSCODE
  • NRF SDK 16
  • Öppna OCD
  • Programmerare ST-LINK V2

Allt är i ett projekt, du behöver bara justera Makefilen (ange platsen för din SDK).

3. Beskrivning av koden

Vi kommer att använda GPIOTE-modulen för att arbeta med kringutrustning baserat på bindning av uppgifter och händelser, samt PPI-modulen för att överföra data från en kringutrustning till en annan utan deltagande av 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 konfigurerar PD_SCL-synkroniseringslinjen till utgången för att generera pulser med en varaktighet 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 konfigurerar DOUT-datalinjen för att läsa beredskapstillståndet för HX711; om det finns en låg nivå triggas en hanterare där vi inaktiverar avbrottet och startar en timer för att generera klockpulser vid PD_SCL-utgången.

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

// aktivera gpiote

Efter det initierar vi PPI-modulen och ansluter vår timer till PD_SCL-utgången för att generera pulser med en varaktighet på 10 μs när en jämförelsehändelse inträffar, och även slå 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 initierar nolltimern och dess hanterare.

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

Det mest intressanta händer i timerhanteraren. Pulsperioden är 20 μs. Vi är intresserade av udda pulser (längs den stigande kanten) och förutsatt att deras antal inte är mer än 24, och det finns 48 händelser. För varje udda händelse läses DOUT

Av databladet följer att antalet pulser måste vara minst 25, vilket motsvarar en förstärkning på 128 (i koden använde jag 25 pulser), detta motsvarar 50 timerhändelser, vilket indikerar slutet på dataramen.

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

Efter detta stänger vi av timern och bearbetar data (enligt databladet) och växlar HX711 till låg strömförbrukningsläge.


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 förväntar oss händelser från RTC-timern med ett intervall på 10 s (detta är efter eget gottfinnande) och startar HX711 i hanteraren, vilket orsakar ett avbrott på DOUT-linjen.

Det finns en punkt till, loggarna matas ut via UART (överföringshastighet 115200, TX - 6 stift, RX - 8 stift) alla inställningar är i sdk_config.h

Hur man ansluter HX711 ADC till NRF52832

Resultat

Tack alla för er uppmärksamhet, jag hoppas att den här artikeln kommer att vara användbar och kommer att minska värdefull tid för utvecklare att hitta en lösning. Jag vill säga att det tekniska tillvägagångssättet som Nordic använder i sina plattformar är ganska intressant ur energieffektivitetssynpunkt.

PS

Projektet är fortfarande under utveckling, så om det här ämnet är av intresse kommer jag i nästa artikel att försöka beskriva algoritmen för att kalibrera viktsensorer, samt ansluta BLE-stacken.

material

Källa: will.com

Lägg en kommentar