HX711 ADC NRF52832-ге қалай қосылуға болады

1. Кіріспе

Күн тәртібінде nrf52832 микроконтроллерінің екі жартылай көпірлі қытай тензометрі бар байланыс хаттамасын әзірлеу міндеті тұрды.

Тапсырма оңай емес болып шықты, өйткені мен түсінікті ақпараттың жетіспеушілігіне тап болдым. «Зұлымдықтың тамыры» Nordic Semiconductor-тің SDK-да болуы ықтимал - тұрақты нұсқа жаңартулары, кейбір артықшылықтар және шатастыратын функционалдылық. Мен бәрін нөлден жазуға тура келді.

Менің ойымша, бұл тақырып бұл чипте BLE стекіне және энергияны үнемдеу режиміне арналған «жақсылықтардың» тұтас жиынтығына негізделген. Бірақ мен техникалық бөлікке тереңірек бармаймын, өйткені бұл тақырып бойынша көптеген мақалалар жазылған.

2. Жобаның сипаттамасы

HX711 ADC NRF52832-ге қалай қосылуға болады

Темір:

  • Adafruit Feather nRF52 Bluefruit LE (қолда болған оқиға)
  • HX711 ADC
  • Қытай тензометрі 2 дана. (50х2 кг)
  • Бағдарламалаушы 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);//настраеваем на выход

10 мкс ұзақтығы бар импульстарды генерациялау үшін шығысқа PD_SCL синхрондау сызығын конфигурациялаймыз.

   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 модулін инициализациялаймыз және салыстыру оқиғасы орын алған кезде ұзақтығы 10 мкс импульстарды генерациялау үшін таймерді PD_SCL шығысына қосамыз, сонымен қатар 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 арқылы шығарылады (беру жылдамдығы 115200, TX - 6 түйреуіш, RX - 8 түйреуіш) барлық параметрлер sdk_config.h ішінде.

HX711 ADC NRF52832-ге қалай қосылуға болады

қорытындылар

Назарларыңызға рахмет, бұл мақала пайдалы болады және әзірлеушілерге шешім табу үшін құнды уақытты қысқартады деп үміттенемін. Nordic платформаларында қолданатын техникалық тәсіл энергия тиімділігі тұрғысынан өте қызықты екенін айтқым келеді.

PS

Жоба әлі де әзірленуде, сондықтан егер бұл тақырып қызығушылық тудыратын болса, келесі мақалада мен салмақ сенсорларын калибрлеу алгоритмін, сондай-ақ BLE стекін қосуды сипаттауға тырысамын.

Материалдар

Ақпарат көзі: www.habr.com

пікір қалдыру