1. Kirish
Kun tartibida nrf52832 mikrokontrolleri uchun ikkita yarim ko'prikli xitoy deformatsiya o'lchagichlari bilan aloqa protokolini ishlab chiqish vazifasi bor edi.
Vazifa oson bo'lmadi, chunki men tushunarli ma'lumotlarning etishmasligiga duch keldim. "Yovuzlikning ildizi" Nordic Semiconductor-ning SDK-da bo'lishi ehtimoldan yiroq - doimiy versiya yangilanishlari, ba'zi ortiqcha va chalkash funksiyalar. Men hamma narsani boshidan yozishim kerak edi.
O'ylaymanki, bu mavzu ushbu chipda BLE stekiga va energiya tejash rejimi uchun "yaxshi narsalar" to'plamiga ega ekanligiga asoslanib, juda dolzarb. Ammo men texnik qismga chuqur kirmayman, chunki bu mavzu bo'yicha ko'plab maqolalar yozilgan.
2. Loyihaning tavsifi
Temir:
- Adafruit Feather nRF52 Bluefruit LE (qo'lda bo'lgan voqea)
- HX711 ADC
- Xitoy taymerlari 2 dona. (50x2 kg)
- Dasturchi ST-LINK V2
Dasturiy ta'minot:
- IDE VSCODE
- NRF SDK 16
- OpenOCD
- Dasturchi ST-LINK V2
Hammasi bitta loyihada, siz shunchaki Makefile faylini o'zgartirishingiz kerak (SDK joylashuvini belgilang).
3. Kodning tavsifi
Biz GPIOTE modulidan vazifalar va hodisalarni bog'lash asosida tashqi qurilmalar bilan ishlash uchun, shuningdek, protsessor ishtirokisiz ma'lumotlarni bir periferiyadan ikkinchisiga o'tkazish uchun PPI modulidan foydalanamiz.
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);//Π½Π°ΡΡΡΠ°Π΅Π²Π°Π΅ΠΌ Π½Π° Π²ΡΡ
ΠΎΠ΄
Biz PD_SCL sinxronlash liniyasini 10 mks davomiylikdagi impulslarni hosil qilish uchun chiqishga sozlaymiz.
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);//Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°ΠΉΠΌΠ΅Ρ
}
Biz DOUT ma'lumotlar liniyasini HX711 ning tayyorlik holatini o'qish uchun sozlaymiz; agar past daraja bo'lsa, ishlov beruvchi ishga tushiriladi, unda biz uzilishni o'chirib qo'yamiz va PD_SCL chiqishida soat impulslarini yaratish uchun taymerni ishga tushiramiz.
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-ni yoqing
Shundan so'ng, biz PPI modulini ishga tushiramiz va taqqoslash hodisasi sodir bo'lganda 10 mks davomiylikdagi impulslarni hosil qilish uchun taymerimizni PD_SCL chiqishiga ulaymiz, shuningdek, GPIOTE modulini yoqamiz.
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);// ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
Biz nol taymerini va uning ishlov beruvchisini ishga tushiramiz.
if(m_counter%2 != 0 && m_counter<=48){
buffer <<= 1;// ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΡΠΈΡΠ°Π½Π½ΡΡ
Π΄Π°Π½ΡΡ
c_counter++;// ΡΡΠ΅ΡΡΠΈΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΈΠΌΠΏΡΠ»ΡΡΠΎΠ²
if(nrf_gpio_pin_read(DOUT))buffer++;//ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²Ρ
ΠΎΠ΄Π°
}
Eng qiziqarli narsa taymer ishlov beruvchisida sodir bo'ladi. Puls davri 20 mks. Bizni toq impulslar qiziqtiradi (ko'tarilgan chekka bo'ylab) va agar ularning soni 24 tadan ko'p bo'lmasa va 48 ta hodisa mavjud bo'lsa. Har bir toq hodisa uchun DOUT o'qiladi.
Ma'lumotlar varag'idan impulslar soni kamida 25 bo'lishi kerak, bu 128 ta daromadga to'g'ri keladi (kodda men 25 ta impuls ishlatganman), bu ma'lumotlar ramkasining tugashini ko'rsatadigan 50 ta taymer hodisasiga teng.
++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
}
Shundan so'ng biz taymerni o'chirib, ma'lumotlarni qayta ishlaymiz (ma'lumotlar varag'iga ko'ra) va HX711 ni kam quvvat iste'moli rejimiga o'tkazamiz.
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);
}
Biz RTC taymeridan 10 soniyalik interval bilan voqealarni kutamiz (bu sizning ixtiyoringizda) va HX711-ni ishlov beruvchida ishga tushirib, DOUT liniyasida uzilishga olib keladi.
Yana bir nuqta bor, jurnallar UART orqali chiqariladi (bod tezligi 115200, TX - 6 pin, RX - 8 pin) barcha sozlamalar sdk_config.h da.
topilmalar
E'tiboringiz uchun barchangizga rahmat, umid qilamanki, ushbu maqola foydali bo'ladi va ishlab chiquvchilarga yechim topish uchun qimmatli vaqtni qisqartiradi. Aytmoqchimanki, Nordic o'z platformalarida foydalanadigan texnik yondashuv energiya samaradorligi nuqtai nazaridan juda qiziq.
PS
Loyiha hali ham ishlab chiqilmoqda, shuning uchun agar ushbu mavzu qiziq bo'lsa, keyingi maqolada men og'irlik sensorlarini kalibrlash algoritmini, shuningdek, BLE stekini ulashni tasvirlashga harakat qilaman.
materiallari
Manba: www.habr.com