Wéi Verbindung HX711 ADC zu NRF52832

1. Aféierung

Um Ordre du jour war d'Aufgab fir e Kommunikatiounsprotokoll fir den nrf52832 Mikrokontroller mat zwee hallefbrécke chinesesche Spannungsmoossnamen z'entwéckelen.

D'Aufgab huet sech als net einfach erausgestallt, well ech mat engem Mangel u verständlecher Informatioun konfrontéiert war. Et ass méi wahrscheinlech datt de "Wurzel vum Béisen" am SDK vum Nordic Semiconductor selwer ass - konstant Versiounsupdates, e puer Redundanz a konfus Funktionalitéit. Ech hu missen alles vun Null schreiwen.

Ech mengen dëst Thema ass ganz relevant baséiert op der Tatsaach, datt dësen Chip e BLE Stack an eng ganz Rei vu "Goodies" fir Energiespuermodus huet. Awer ech ginn net ze déif an den techneschen Deel, well vill Artikelen iwwer dëst Thema geschriwwe goufen.

2. Projet Beschreiwung

Wéi Verbindung HX711 ADC zu NRF52832

Eisen:

  • Adafruit Feather nRF52 Bluefruit LE (wat geschitt ass bei der Hand)
  • ADC HX711
  • Chinese strain gauges 2 Stk. (50 x 2 kg)
  • Programmer ST-LINK V2

Software:

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

Alles ass an engem Projet, Dir musst just de Makefile tweaken (spezifizéieren de Standuert vun Ärem SDK).

3. Beschreiwung vum Code

Mir wäerten de GPIOTE Modul benotze fir mat Peripheriegeräter ze schaffen baséiert op der Bindung vun Aufgaben an Eventer, wéi och de PPI Modul fir Daten vun enger Peripherie an en aneren ze transferéieren ouni d'Participatioun vun engem Prozessor.

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

Mir konfiguréieren d'PD_SCL Synchroniséierungslinn op d'Ausgab fir Impulser mat enger Dauer vun 10 μs ze generéieren.

   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);//включаем таймер
}
 

Mir konfiguréieren d'DOUT Datenlinn fir de Bereetschaftszoustand vum HX711 ze liesen; wann et e nidderegen Niveau ass, gëtt en Handler ausgeléist, an deem mir den Ënnerbriechung deaktivéieren an en Timer starten fir Auerimpulsen um PD_SCL Output ze generéieren.

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

// gpiote aktivéieren

Duerno initialiséieren mir de PPI-Modul a verbannen eisen Timer mam PD_SCL-Output fir Impulser mat enger Dauer vun 10 μs ze generéieren wann e Vergläichsevenement geschitt, an och de GPIOTE-Modul ausschalten.


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

Mir initialiséieren den Null Timer a seng Handler.

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

Déi interessantst Saach geschitt am Timer Handler. D'Pulszäit ass 20 μs. Mir interesséieren eis fir ongewéinlech Impulser (laanscht dem Risingrand) a virausgesat datt hir Zuel net méi wéi 24 ass, an et sinn 48 Eventer. Fir all komeschen Event gëtt DOUT gelies

Vum Dateblat folgt datt d'Zuel vun den Impulser op d'mannst 25 muss sinn, wat zu engem Gewënn vun 128 entsprécht (am Code hunn ech 25 Impulser benotzt), dat entsprécht 50 Timerevenementer, wat d'Enn vum Dateframe uginn.

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

Duerno schalten mir den Timer aus a veraarbechten d'Donnéeën (geméiss dem Dateblatt) a schalten den HX711 op de Low Power Consumer Modus.


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

Mir erwaarden Eventer vum RTC Timer mat engem Intervall vun 10 s (dëst ass op Är Diskretioun) a starten den HX711 am Handler, verursaacht en Ënnerbriechung op der DOUT Linn.

Et gëtt nach ee Punkt, d'Logbicher ginn iwwer UART erausginn (Baudrate 115200, TX - 6 Pins, RX - 8 Pins) all Astellunge sinn an sdk_config.h

Wéi Verbindung HX711 ADC zu NRF52832

Conclusiounen

Merci all fir Är Opmierksamkeet, ech hoffen dësen Artikel wäert nëtzlech sinn a wäertvoll Zäit fir Entwéckler reduzéieren fir eng Léisung ze fannen. Ech wëll soen datt d'technesch Approche déi Nordic a senge Plattformen benotzt ganz interessant ass aus der Siicht vun der Energieeffizienz.

PS

De Projet ass nach ëmmer an der Entwécklung, also wann dëst Thema interessant ass, wäert ech am nächsten Artikel probéieren den Algorithmus fir d'Kalibrierung vu Gewiichtsensoren ze beschreiwen, wéi och de BLE-Stack ze verbannen.

Material

Source: will.com

Setzt e Commentaire