Kiel konekti HX711 ADC al NRF52832

1. Enkonduko

En la tagordo estis la tasko ellabori komunikan protokolon por la mikroregilo nrf52832 kun du duonpontaj ĉinaj streĉmezuriloj.

La tasko montriĝis ne facila, ĉar mi alfrontis mankon de ajna komprenebla informo. Estas pli verŝajne, ke la "radiko de malbono" estas en la SDK de Nordic Semiconductor mem - konstantaj versioj ĝisdatigoj, iom da redundo kaj konfuza funkcieco. Mi devis skribi ĉion de nulo.

Mi pensas, ke ĉi tiu temo estas sufiĉe grava surbaze de la fakto, ke ĉi tiu blato havas BLE-stakon kaj tutan aron da "bonaĵoj" por energiŝpara reĝimo. Sed mi ne tro profundiĝos en la teknikan parton, ĉar multaj artikoloj estis verkitaj pri ĉi tiu temo.

2. Projekta priskribo

Kiel konekti HX711 ADC al NRF52832

Fero:

  • Adafruit Feather nRF52 Bluefruit LE (kio okazis ĉe mano)
  • ADC HX711
  • Ĉinaj streĉmezuriloj 2 pcs. (50x2 kg)
  • Programisto ST-LINK V2

Mola:

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

Ĉio estas en unu projekto, vi nur devas ĝustigi la Makefile (specifi la lokon de via SDK).

3. Priskribo de la kodo

Ni uzos la GPIOTE-modulon por labori kun ekstercentraj bazitaj sur la ligado de taskoj kaj eventoj, same kiel la PPI-modulo por transdoni datumojn de unu ekstercentra al alia sen partopreno de procesoro.

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

Ni agordas la sinkronigan linion PD_SCL al la eligo por generi pulsojn kun daŭro de 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);//включаем таймер
}
 

Ni agordas la DOUT-datumlinion por legi la pretecan staton de la HX711; se estas malalta nivelo, pritraktilo estas ekigita, en kiu ni malŝaltas la interrompon kaj ekas tempigilon por generi horloĝpulsojn ĉe la PD_SCL-produktaĵo.

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

// ebligu gpiote

Post tio, ni pravigas la PPI-modulon kaj konektas nian tempigilon al la eligo PD_SCL por generi pulsojn kun daŭro de 10 μs kiam okazas kompara evento, kaj ankaŭ ŝaltas la GPIOTE-modulon.


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

Ni pravigas la nulan tempigilon kaj ĝian prizorganton.

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

La plej interesa afero okazas en la tempigilo pritraktilo. La pulsperiodo estas 20 μs. Ni interesiĝas pri neparaj pulsoj (laŭ la altiĝanta rando) kaj kondiĉe ke ilia nombro ne estas pli ol 24, kaj estas 48 eventoj.Por ĉiu nepara evento, DOUT estas legita.

El la datenfolio sekvas, ke la nombro da pulsoj devas esti almenaŭ 25, kio respondas al gajno de 128 (en la kodo mi uzis 25 pulsojn), tio estas ekvivalenta al 50 temporizaj eventoj, kio indikas la finon de la datumkadro.

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

Post ĉi tio, ni malŝaltas la tempigilon kaj prilaboras la datumojn (laŭ la datumfolio) kaj ŝanĝas la HX711 al malalta energikonsuma reĝimo.


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

Ni atendas eventojn de la RTC-tempigilo kun intervalo de 10 s (ĉi tio estas laŭ via bontrovo) kaj lanĉas la HX711 en la prizorganto, kaŭzante interrompon sur la DOUT-linio.

Estas unu plia punkto, la protokoloj estas eligitaj per UART (baudrapideco 115200, TX - 6 pingloj, RX - 8 pingloj) ĉiuj agordoj estas en sdk_config.h

Kiel konekti HX711 ADC al NRF52832

trovoj

Dankon al vi ĉiuj pro via atento, mi esperas, ke ĉi tiu artikolo estos utila kaj reduktos valoran tempon por programistoj trovi solvon. Mi volas diri, ke la teknika aliro, kiun Nordic uzas en siaj platformoj, estas sufiĉe interesa el la vidpunkto de energia efikeco.

PS

La projekto ankoraŭ estas evoluanta, do se ĉi tiu temo interesas, en la sekva artikolo mi provos priskribi la algoritmon por kalibri pezsensilojn, kaj ankaŭ konekti la BLE-stakon.

Maŝinoj

fonto: www.habr.com

Aldoni komenton