HX711 ADC NRF52832 වෙත සම්බන්ධ කරන්නේ කෙසේද

1. හැඳින්වීම

න්‍යාය පත්‍රයේ තිබුණේ අර්ධ පාලම් චීන වික්‍රියා මාපක දෙකක් සහිත nrf52832 ක්ෂුද්‍ර පාලකය සඳහා සන්නිවේදන ප්‍රොටෝකෝලයක් සංවර්ධනය කිරීමේ කාර්යයයි.

තේරුම් ගත හැකි තොරතුරු කිසිවක් නොමැතිකමට මා මුහුණ දුන් නිසා කාර්යය පහසු නොවීය. "නපුරේ මුල" නෝර්ඩික් අර්ධ සන්නායකයේම SDK හි තිබීමට වැඩි ඉඩක් ඇත - නිරන්තර අනුවාද යාවත්කාලීන කිරීම්, යම් අතිරික්තයක් සහ ව්‍යාකූල ක්‍රියාකාරිත්වය. මට මුල ඉඳන් හැමදේම ලියන්න වුණා.

මෙම චිපයට BLE තොගයක් සහ බලශක්ති ඉතිරිකිරීමේ මාදිලිය සඳහා "යහපත්" කට්ටලයක් තිබීම මත පදනම්ව මෙම මාතෘකාව බෙහෙවින් අදාළ වේ යැයි මම සිතමි. නමුත් මෙම මාතෘකාව පිළිබඳ බොහෝ ලිපි ලියා ඇති බැවින් මම තාක්ෂණික කොටසට ගැඹුරට නොයමි.

2. ව්යාපෘති විස්තරය

HX711 ADC NRF52832 වෙත සම්බන්ධ කරන්නේ කෙසේද

යකඩ:

  • Adafruit Feather nRF52 Bluefruit LE (අතට සිදුවූ දේ)
  • HX711 ADC
  • චීන වික්රියා මිනුම් 2 pcs. (50x2 kg)
  • ක්‍රමලේඛක 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 μs කාල සීමාවක් සහිත ස්පන්දන උත්පාදනය කිරීම සඳහා අපි 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);//включаем таймер
}
 

අපි HX711 හි සූදානම තත්ත්වය කියවීමට DOUT දත්ත රේඛාව වින්‍යාස කරමු; අඩු මට්ටමක් තිබේ නම්, අපි බාධාව අක්‍රිය කර 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); 

// gpiot සබල කරන්න

ඊට පසු, අපි PPI මොඩියුලය ආරම්භ කර අපගේ ටයිමරය PD_SCL ප්‍රතිදානයට සම්බන්ධ කර සංසන්දනාත්මක සිදුවීමක් සිදු වූ විට 10 μs කාල සීමාවක් සහිත ස්පන්දන උත්පාදනය කිරීමට සහ 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 μs වේ. අපි ඔත්තේ ස්පන්දන (ඉහළ එන දාරය දිගේ) ගැන උනන්දු වන අතර ඒවායේ සංඛ්‍යාව 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);
}

අපි තත්ත්පර 10 ක පරතරයක් සහිත RTC ටයිමරයෙන් සිදුවීම් බලාපොරොත්තු වෙමු (මෙය ඔබේ අභිමතය පරිදි වේ) සහ DOUT රේඛාවේ බාධාවක් ඇති කරමින් HX711 හසුරුවෙහි දියත් කරන්න.

තවත් එක් කරුණක් ඇත, ලොග UART හරහා ප්‍රතිදානය වේ (baud rate 115200, TX - 6 pins, RX - 8 pins) සියලු සැකසුම් sdk_config.h හි ඇත.

HX711 ADC NRF52832 වෙත සම්බන්ධ කරන්නේ කෙසේද

සොයා ගැනීම්

ඔබගේ අවධානයට ඔබ සැමට ස්තූතියි, මෙම ලිපිය ප්‍රයෝජනවත් වනු ඇති අතර සංවර්ධකයින්ට විසඳුමක් සෙවීමට වටිනා කාලය අඩු කරනු ඇතැයි මම බලාපොරොත්තු වෙමි. නෝර්ඩික් එහි වේදිකාවල භාවිතා කරන තාක්ෂණික ප්‍රවේශය බලශක්ති කාර්යක්ෂමතාවයේ දෘෂ්ටි කෝණයෙන් තරමක් සිත්ගන්නා සුළු බව මට පැවසීමට අවශ්‍යය.

ප්රාදේශීය සභා

ව්‍යාපෘතිය තවමත් සංවර්ධනය වෙමින් පවතී, එබැවින් මෙම මාතෘකාව උනන්දුවක් දක්වන්නේ නම්, ඊළඟ ලිපියෙන් මම බර සංවේදක ක්‍රමාංකනය කිරීමේ ඇල්ගොරිතම විස්තර කිරීමට මෙන්ම BLE තොගය සම්බන්ධ කිරීමට උත්සාහ කරමි.

ද්රව්ය

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න