Kā savienot HX711 ADC ar NRF52832

1. Ievads

Darba kārtībā bija uzdevums izstrādāt sakaru protokolu mikrokontrolleram nrf52832 ar diviem pustilta ķīniešu tenzometriem.

Uzdevums izrādījās ne viegls, jo saskāros ar jebkādas saprotamas informācijas trūkumu. Visticamāk, ka “ļaunuma sakne” ir pašā Nordic Semiconductor SDK — pastāvīgi versiju atjauninājumi, neliela dublēšana un mulsinoša funkcionalitāte. Man bija jāraksta viss no nulles.

Es domāju, ka šī tēma ir diezgan aktuāla, pamatojoties uz to, ka šai mikroshēmai ir BLE steks un vesels komplekts ar “labumiem” enerģijas taupīšanas režīmam. Bet es neiedziļināšos tehniskajā daļā, jo par šo tēmu ir rakstīti daudzi raksti.

2. Projekta apraksts

Kā savienot HX711 ADC ar NRF52832

Dzelzs:

  • Adafruit Feather nRF52 Bluefruit LE (kas notika pa rokai)
  • HX711 ADC
  • Ķīniešu deformācijas mērītāji 2 gab. (50x2 kg)
  • Programmētājs ST-LINK V2

Programmatūra:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Programmētājs ST-LINK V2

Viss ir vienā projektā, jums tikai jāpielāgo Makefile (norādiet sava SDK atrašanās vietu).

3. Koda apraksts

GPIOTE moduli izmantosim darbam ar perifērijas ierīcēm, kuru pamatā ir uzdevumu un notikumu saistīšana, kā arī PPI moduli datu pārsūtīšanai no vienas perifērijas uz otru bez procesora līdzdalības.

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

Mēs konfigurējam PD_SCL sinhronizācijas līniju uz izeju, lai ģenerētu impulsus ar ilgumu 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);//включаем таймер
}
 

Mēs konfigurējam DOUT datu līniju, lai nolasītu HX711 gatavības stāvokli; ja līmenis ir zems, tiek aktivizēts apdarinātājs, kurā mēs atspējojam pārtraukumu un iedarbinām taimeri, lai ģenerētu pulksteņa impulsus PD_SCL izejā.

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

// iespējot gpiote

Pēc tam mēs inicializējam PPI moduli un savienojam savu taimeri ar PD_SCL izeju, lai ģenerētu impulsus ar 10 μs ilgumu, kad notiek salīdzināšanas notikums, kā arī ieslēdzam GPIOTE moduli.


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

Mēs inicializējam nulles taimeri un tā apstrādātāju.

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

Visinteresantākā lieta notiek taimera apstrādātājā. Impulsa periods ir 20 μs. Mūs interesē nepāra impulsi (gar augošo malu) un ar nosacījumu, ka to skaits nav lielāks par 24 un notikumi ir 48. Katram nepāra notikumam tiek nolasīts DOUT

No datu lapas izriet, ka impulsu skaitam jābūt vismaz 25, kas atbilst pastiprinājumam 128 (kodā es izmantoju 25 impulsus), tas ir līdzvērtīgs 50 taimera notikumiem, kas norāda datu rāmja beigas.

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

Pēc tam mēs izslēdzam taimeri un apstrādājam datus (saskaņā ar datu lapu) un pārslēdzam HX711 uz zema enerģijas patēriņa režīmu.


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

Mēs sagaidām notikumus no RTC taimera ar 10 s intervālu (tas ir pēc jūsu ieskatiem) un palaižam HX711 apdarinātājā, izraisot DOUT līnijas pārtraukumu.

Ir vēl viens punkts, žurnāli tiek izvadīti caur UART (boda pārraides ātrums 115200, TX - 6 kontakti, RX - 8 kontakti) visi iestatījumi ir sdk_config.h

Kā savienot HX711 ADC ar NRF52832

Atzinumi

Paldies visiem par uzmanību, ceru, ka šis raksts būs noderīgs un samazinās izstrādātāju vērtīgo laiku, lai atrastu risinājumu. Gribu teikt, ka tehniskā pieeja, ko Nordic izmanto savās platformās, ir visai interesanta no energoefektivitātes viedokļa.

PS

Projekts vēl ir izstrādes stadijā, tādēļ, ja šī tēma interesē, nākamajā rakstā mēģināšu aprakstīt algoritmu svara sensoru kalibrēšanai, kā arī BLE steka pieslēgšanai.

Materiāli

Avots: www.habr.com

Pievieno komentāru