1. அறிமுகம்
நிகழ்ச்சி நிரலில் nrf52832 மைக்ரோகண்ட்ரோலருக்கான தகவல் தொடர்பு நெறிமுறையை இரண்டு அரை-பாலம் சீன ஸ்ட்ரெய்ன் கேஜ்களுடன் உருவாக்கும் பணி இருந்தது.
புரிந்துகொள்ளக்கூடிய எந்த தகவலும் இல்லாததால், பணி எளிதானது அல்ல. நோர்டிக் செமிகண்டக்டரிலிருந்தே "தீமையின் வேர்" SDK இல் இருக்க வாய்ப்புள்ளது - நிலையான பதிப்பு புதுப்பிப்புகள், சில பணிநீக்கம் மற்றும் குழப்பமான செயல்பாடு. நான் புதிதாக எல்லாவற்றையும் எழுத வேண்டியிருந்தது.
இந்த சிப்பில் ஒரு BLE ஸ்டாக் மற்றும் ஆற்றல் சேமிப்பு பயன்முறைக்கான முழு "குடீஸ்" தொகுப்பு உள்ளது என்பதன் அடிப்படையில் இந்த தலைப்பு மிகவும் பொருத்தமானது என்று நான் நினைக்கிறேன். ஆனால் இந்த தலைப்பில் பல கட்டுரைகள் எழுதப்பட்டிருப்பதால், நான் தொழில்நுட்ப பகுதிக்கு மிக ஆழமாக செல்ல மாட்டேன்.
2. திட்ட விளக்கம்
இரும்பு:
- 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);//настраеваем на выход
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 தொகுதியை துவக்கி, ஒரு ஒப்பீட்டு நிகழ்வு நிகழும்போது 10 μs கால அளவு கொண்ட பருப்புகளை உருவாக்க, 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 μ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 வழியாக வெளியிடப்படுகின்றன (பாட் விகிதம் 115200, TX - 6 பின்கள், RX - 8 பின்கள்) அனைத்து அமைப்புகளும் sdk_config.h இல் உள்ளன
கண்டுபிடிப்புகள்
உங்கள் கவனத்திற்கு அனைவருக்கும் நன்றி, இந்த கட்டுரை பயனுள்ளதாக இருக்கும் மற்றும் டெவலப்பர்கள் ஒரு தீர்வைக் கண்டுபிடிப்பதற்கான மதிப்புமிக்க நேரத்தை குறைக்கும் என்று நம்புகிறேன். ஆற்றல் திறனின் பார்வையில் நோர்டிக் அதன் தளங்களில் பயன்படுத்தும் தொழில்நுட்ப அணுகுமுறை மிகவும் சுவாரஸ்யமானது என்று நான் கூற விரும்புகிறேன்.
சோசலிஸ்ட் கட்சி
திட்டம் இன்னும் வளர்ச்சியில் உள்ளது, எனவே இந்த தலைப்பு ஆர்வமாக இருந்தால், அடுத்த கட்டுரையில் எடை சென்சார்களை அளவீடு செய்வதற்கான வழிமுறையை விவரிக்க முயற்சிப்பேன், அத்துடன் BLE ஸ்டேக்கை இணைக்கவும்.
பொருட்கள்
ஆதாரம்: www.habr.com