HX711 ADC ከ NRF52832 ጋር እንዴት እንደሚገናኝ

1. መግቢያ

በአጀንዳው ላይ ለ nrf52832 ማይክሮ መቆጣጠሪያ የመገናኛ ፕሮቶኮል የማዘጋጀት ተግባር በሁለት ግማሽ ድልድይ የቻይናውያን የጭረት መለኪያዎች ነበር.

ምንም አይነት ለመረዳት የሚያስችል መረጃ እጥረት ስላጋጠመኝ ስራው ቀላል አልነበረም። ከኖርዲክ ሴሚኮንዳክተር ራሱ “የክፉው ሥር” በኤስዲኬ ውስጥ የመሆኑ ዕድሉ ከፍተኛ ነው - የማያቋርጥ ስሪት ዝመናዎች ፣ አንዳንድ ድግግሞሽ እና ግራ የሚያጋባ ተግባር። ሁሉንም ነገር ከባዶ መጻፍ ነበረብኝ።

እኔ እንደማስበው ይህ ቺፕ የ BLE ቁልል እና ለኃይል ቁጠባ ሁነታ ሙሉ "ጥሩዎች" ስብስብ ስላለው ይህ ርዕስ በጣም ጠቃሚ ነው. ነገር ግን በዚህ ርዕስ ላይ ብዙ መጣጥፎች ስለተጻፉ ወደ ቴክኒካዊው ክፍል በጥልቀት አልገባም።

2. የፕሮጀክት መግለጫ

HX711 ADC ከ NRF52832 ጋር እንዴት እንደሚገናኝ

ብረት:

  • Adafruit Feather nRF52 ብሉፍሩት LE (በእጁ ላይ የሆነው ነገር)
  • ADC HX711
  • የቻይናውያን የጭረት መለኪያዎች 2 pcs. (50x2 ኪግ)
  • ፕሮግራመር ST-LINK V2

ሶፍትዌር

  • IDE VSCODE
  • NRF ኤስዲኬ 16
  • ክፍት ኦሲዲ
  • ፕሮግራመር ST-LINK V2

ሁሉም ነገር በአንድ ፕሮጀክት ውስጥ ነው፣ Makefile ን ማስተካከል ብቻ ነው (የእርስዎን ኤስዲኬ ቦታ ይግለጹ)።

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

የ 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 አንቃ

ከዚያ በኋላ የፒፒአይ ሞጁሉን እናስጀምራለን እና የሰዓት ቆጣሪያችንን ከ 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);
}

ክስተቶችን ከRTC ሰዓት ቆጣሪ በ10 ሰከንድ እንጠብቃለን (ይህ በእርስዎ ውሳኔ ነው) እና HX711ን በተቆጣጣሪው ውስጥ ያስጀምሩት፣ ይህም በDOUT መስመር ላይ መስተጓጎል ይፈጥራል።

አንድ ተጨማሪ ነጥብ አለ, ምዝግብ ማስታወሻዎቹ በ UART በኩል ይወጣሉ (baud rate 115200, TX - 6 pins, RX - 8 pins) ሁሉም ቅንብሮች በ sdk_config.h ውስጥ ናቸው.

HX711 ADC ከ NRF52832 ጋር እንዴት እንደሚገናኝ

ግኝቶች

ለሁላችሁም ትኩረት አመሰግናለሁ, ይህ ጽሑፍ ጠቃሚ እንደሚሆን ተስፋ አደርጋለሁ እና ለገንቢዎች መፍትሄ ለማግኘት ጠቃሚ ጊዜን ይቀንሳል. ኖርዲክ በመድረኮቹ ውስጥ የሚጠቀመው ቴክኒካዊ አቀራረብ ከኃይል ቆጣቢነት አንፃር በጣም አስደሳች ነው ማለት እፈልጋለሁ።

PS

ፕሮጀክቱ አሁንም በመገንባት ላይ ነው, ስለዚህ ይህ ርዕሰ ጉዳይ ትኩረት የሚስብ ከሆነ, በሚቀጥለው ርዕስ ላይ የክብደት ዳሳሾችን ለመለካት ስልተ-ቀመርን ለመግለጽ እሞክራለሁ, እንዲሁም የ BLE ቁልል ማገናኘት.

ቁሶች

ምንጭ: hab.com

አስተያየት ያክሉ