Ինչպես միացնել HX711 ADC-ն NRF52832-ին

1. Ներածություն

Օրակարգում խնդիրն էր մշակել կապի արձանագրություն nrf52832 միկրոկոնտրոլերի համար երկու կիսակամուրջ չինական լարման չափիչներով:

Պարզվեց, որ առաջադրանքը հեշտ չէր, քանի որ ես բախվեցի որևէ հասկանալի տեղեկատվության պակասի։ Ավելի հավանական է, որ «չարի արմատը» գտնվում է հենց Nordic Semiconductor-ի SDK-ում՝ մշտական ​​տարբերակի թարմացումներ, որոշակի ավելորդություն և շփոթեցնող ֆունկցիոնալություն: Ես ստիպված էի ամեն ինչ գրել զրոյից։

Կարծում եմ, որ այս թեման բավականին արդիական է՝ ելնելով այն փաստից, որ այս չիպն ունի BLE ստեկ և էներգախնայողության ռեժիմի «լավատեսակների» մի ամբողջ շարք: Բայց ես շատ չեմ խորանա տեխնիկական մասի մեջ, քանի որ շատ հոդվածներ են գրվել այս թեմայով:

2. Ծրագրի նկարագրությունը

Ինչպես միացնել HX711 ADC-ն NRF52832-ին

Երկաթ

  • Adafruit Feather nRF52 Bluefruit LE (այն ինչ պատահեց ձեռքի տակ)
  • HX711 ADC
  • Չինական լարման չափիչներ 2 հատ. (50x2 կգ)
  • Ծրագրավորող ST-LINK V2

Փափուկ:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Ծրագրավորող ST-LINK V2

Ամեն ինչ մեկ նախագծում է, դուք պարզապես պետք է կսմթեք Makefile-ը (նշեք ձեր SDK-ի գտնվելու վայրը):

3. Կոդի նկարագրությունը

Մենք կօգտագործենք GPIOTE մոդուլը՝ առաջադրանքների և իրադարձությունների կապակցման վրա հիմնված ծայրամասային սարքերի հետ աշխատելու համար, ինչպես նաև PPI մոդուլը՝ առանց պրոցեսորի մասնակցության տվյալների փոխանցման մի ծայրամասային սարքից մյուսը:

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

Մենք կարգավորում ենք PD_SCL համաժամացման գիծը ելքի վրա՝ 10 մկվ տևողությամբ իմպուլսներ առաջացնելու համար:

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

Մենք կարգավորում ենք DOUT տվյալների գիծը HX711-ի պատրաստականության վիճակը կարդալու համար, եթե կա ցածր մակարդակ, գործարկվում է կարգավորիչ, որում մենք անջատում ենք ընդհատումը և սկսում ժմչփ՝ PD_SCL ելքում ժամացույցի իմպուլսներ ստեղծելու համար:

 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-ը

Դրանից հետո մենք նախաստորագրում ենք PPI մոդուլը և մեր ժմչփը միացնում ենք PD_SCL ելքին՝ 10 մկվ տևողությամբ իմպուլսներ ստեղծելու համար, երբ տեղի է ունենում համեմատական ​​իրադարձություն, ինչպես նաև միացնում ենք GPIOTE մոդուլը:


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

Մենք նախաստորագրում ենք զրոյական ժմչփը և դրա մշակիչը:

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

Ամենահետաքրքիրը տեղի է ունենում ժմչփի կարգավորիչում. Զարկերակային ժամանակահատվածը 20 մկվ է: Մեզ հետաքրքրում են կենտ իմպուլսները (բարձրացող եզրի երկայնքով) և պայմանով, որ դրանց թիվը լինի ոչ ավելի, քան 24, և կա 48 իրադարձություն: Յուրաքանչյուր տարօրինակ իրադարձության համար կարդացվում է DOUT:

Տվյալների թերթիկից հետևում է, որ իմպուլսների քանակը պետք է լինի առնվազն 25, ինչը համապատասխանում է 128-ի ավելացմանը (կոդում ես օգտագործել եմ 25 իմպուլս), դա համարժեք է 50 ժմչփի իրադարձությունների, ինչը ցույց է տալիս տվյալների շրջանակի ավարտը:

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

Դրանից հետո մենք անջատում ենք ժմչփը և մշակում տվյալները (ըստ տվյալների թերթիկի) և HX711-ը միացնում ենք ցածր էներգիայի սպառման ռեժիմի:


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

Մենք ակնկալում ենք իրադարձություններ RTC ժմչփից 10 վ ընդմիջումով (սա ձեր հայեցողությամբ) և գործարկում ենք HX711-ը կարգավորիչում՝ առաջացնելով ընդհատում DOUT գծում:

Կա ևս մեկ կետ, տեղեկամատյանները դուրս են բերվում UART-ի միջոցով (baud rate 115200, TX - 6 պին, RX - 8 փին) բոլոր կարգավորումները գտնվում են sdk_config.h-ում:

Ինչպես միացնել HX711 ADC-ն NRF52832-ին

Արդյունքները

Շնորհակալություն բոլորիդ ուշադրության համար, հուսով եմ, որ այս հոդվածը օգտակար կլինի և կնվազեցնի ծրագրավորողների համար լուծում գտնելու արժեքավոր ժամանակը: Ուզում եմ ասել, որ այն տեխնիկական մոտեցումը, որն օգտագործում է Nordic-ը իր հարթակներում, բավականին հետաքրքիր է էներգաարդյունավետության տեսանկյունից։

PS

Նախագիծը դեռ մշակման փուլում է, ուստի, եթե այս թեման հետաքրքրություն է ներկայացնում, հաջորդ հոդվածում ես կփորձեմ նկարագրել քաշի սենսորների չափաբերման ալգորիթմը, ինչպես նաև BLE կույտը միացնելու համար:

Նյութեր

Source: www.habr.com

Добавить комментарий