Hoe de HX711 ADC op NRF52832 aan te sluiten

1. Inleiding

Op de agenda stond de ontwikkeling van een communicatieprotocol voor de nrf52832-microcontroller met twee Chinese rekstrookjes met halve brug.

De taak bleek niet eenvoudig, omdat ik te maken kreeg met een gebrek aan begrijpelijke informatie. Het is waarschijnlijker dat de ‘wortel van het kwaad’ in de SDK van Nordic Semiconductor zelf zit: constante versie-updates, enige redundantie en verwarrende functionaliteit. Ik moest alles vanaf nul schrijven.

Ik denk dat dit onderwerp behoorlijk relevant is, gebaseerd op het feit dat deze chip een BLE-stack heeft en een hele reeks "goodies" voor de energiebesparende modus. Maar ik zal niet te diep ingaan op het technische gedeelte, aangezien er veel artikelen over dit onderwerp zijn geschreven.

2. Projectbeschrijving

Hoe de HX711 ADC op NRF52832 aan te sluiten

Ijzer:

  • Adafruit Feather nRF52 Bluefruit LE (wat er toevallig voorhanden was)
  • ADC-HX711
  • Chinese rekstrookjes 2 stuks. (50x2kg)
  • Programmeur ST-LINK V2

Software:

  • IDE VSCODE
  • NRF-SDK 16
  • OCD openen
  • Programmeur ST-LINK V2

Alles bevindt zich in één project, u hoeft alleen maar de Makefile aan te passen (specificeer de locatie van uw SDK).

3. Beschrijving van de code

We zullen de GPIOTE-module gebruiken om met randapparatuur te werken op basis van de binding van taken en gebeurtenissen, evenals de PPI-module om gegevens van het ene randapparaat naar het andere over te dragen zonder de deelname van een 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);//настраеваем на выход

We configureren de PD_SCL-synchronisatielijn naar de uitgang om pulsen te genereren met een duur van 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);//включаем таймер
}
 

We configureren de DOUT-datalijn om de gereedheidsstatus van de HX711 te lezen; als er een laag niveau is, wordt een handler geactiveerd waarin we de interrupt uitschakelen en een timer starten om klokpulsen te genereren aan de PD_SCL-uitgang.

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

// schakel gpiote in

Daarna initialiseren we de PPI-module en verbinden we onze timer met de PD_SCL-uitgang om pulsen te genereren met een duur van 10 μs wanneer een vergelijkingsgebeurtenis plaatsvindt, en schakelen we ook de GPIOTE-module in.


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

We initialiseren de nultimer en zijn handler.

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

Het meest interessante gebeurt in de timer-handler. De pulsperiode bedraagt ​​20 μs. We zijn geïnteresseerd in oneven pulsen (langs de stijgende flank) en op voorwaarde dat hun aantal niet meer is dan 24, en er 48 gebeurtenissen zijn. Voor elke oneven gebeurtenis wordt DOUT gelezen

Uit de datasheet volgt dat het aantal pulsen minimaal 25 moet zijn, wat overeenkomt met een versterking van 128 (in de code gebruikte ik 25 pulsen), dit komt overeen met 50 timergebeurtenissen, wat het einde van het dataframe aangeeft.

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

Hierna zetten we de timer uit, verwerken we de gegevens (volgens de datasheet) en schakelen we de HX711 naar de modus voor laag energieverbruik.


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

We verwachten gebeurtenissen van de RTC-timer met een interval van 10 s (dit is naar eigen goeddunken) en lanceren de HX711 in de handler, waardoor een onderbreking op de DOUT-lijn ontstaat.

Er is nog een punt: de logs worden uitgevoerd via UART (baudrate 115200, TX - 6 pinnen, RX - 8 pinnen) alle instellingen staan ​​in sdk_config.h

Hoe de HX711 ADC op NRF52832 aan te sluiten

Bevindingen

Bedankt allemaal voor jullie aandacht. Ik hoop dat dit artikel nuttig zal zijn en de kostbare tijd voor ontwikkelaars om een ​​oplossing te vinden zal verminderen. Ik wil zeggen dat de technische benadering die Nordic in zijn platforms gebruikt behoorlijk interessant is vanuit het oogpunt van energie-efficiëntie.

PS

Het project is nog in ontwikkeling, dus als dit onderwerp interessant is, zal ik in het volgende artikel proberen het algoritme voor het kalibreren van gewichtssensoren te beschrijven en de BLE-stack aan te sluiten.

materialen

Bron: www.habr.com

Voeg een reactie