1. Pengenalan
Dalam agenda ialah tugas membangunkan protokol komunikasi untuk mikropengawal nrf52832 dengan dua tolok terikan Cina separuh jambatan.
Tugas itu ternyata tidak mudah, kerana saya berhadapan dengan kekurangan maklumat yang boleh difahami. Kemungkinan besar bahawa "akar kejahatan" berada dalam SDK daripada Nordic Semiconductor itu sendiri - kemas kini versi berterusan, beberapa redundansi dan fungsi yang mengelirukan. Saya terpaksa menulis segala-galanya dari awal.
Saya rasa topik ini agak relevan berdasarkan fakta bahawa cip ini mempunyai timbunan BLE dan satu set keseluruhan "gula-gula" untuk mod penjimatan tenaga. Tetapi saya tidak akan pergi terlalu mendalam ke bahagian teknikal, kerana banyak artikel telah ditulis mengenai topik ini.
2. Penerangan tentang projek
besi:
- Adafruit Feather nRF52 Bluefruit LE (apa yang berlaku di tangan)
- ADC HX711
- Tolok terikan Cina 2 pcs. (50x2 kg)
- Pengaturcara ST-LINK V2
Lembut:
- IDE VSCODE
- NRF SDK 16
- OpenOCD
- Pengaturcara ST-LINK V2
Semuanya ada dalam satu projek, anda hanya perlu tweak Makefile (nyatakan lokasi SDK anda).
3. Penerangan tentang kod
Kami akan menggunakan modul GPIOTE untuk bekerja dengan persisian berdasarkan pengikatan tugas dan acara, serta modul PPI untuk memindahkan data dari satu persisian ke peranti lain tanpa penyertaan pemproses.
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);//Π½Π°ΡΡΡΠ°Π΅Π²Π°Π΅ΠΌ Π½Π° Π²ΡΡ
ΠΎΠ΄
Kami mengkonfigurasi baris penyegerakan PD_SCL kepada output untuk menjana denyutan dengan tempoh 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);//Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°ΠΉΠΌΠ΅Ρ
}
Kami mengkonfigurasi baris data DOUT untuk membaca keadaan kesediaan HX711; jika terdapat tahap rendah, pengendali dicetuskan di mana kami melumpuhkan gangguan dan memulakan pemasa untuk menjana denyutan jam pada output 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);
// dayakan gpiote
Selepas itu, kami memulakan modul PPI dan menyambung pemasa kami ke output PD_SCL untuk menjana denyutan dengan tempoh 10 ΞΌs apabila peristiwa perbandingan berlaku, dan juga menghidupkan modul 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);// ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
Kami memulakan pemasa sifar dan pengendalinya.
if(m_counter%2 != 0 && m_counter<=48){
buffer <<= 1;// ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΡΠΈΡΠ°Π½Π½ΡΡ
Π΄Π°Π½ΡΡ
c_counter++;// ΡΡΠ΅ΡΡΠΈΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΈΠΌΠΏΡΠ»ΡΡΠΎΠ²
if(nrf_gpio_pin_read(DOUT))buffer++;//ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²Ρ
ΠΎΠ΄Π°
}
Perkara yang paling menarik berlaku dalam pengendali pemasa. Tempoh nadi ialah 20 ΞΌs. Kami berminat dengan nadi ganjil (di sepanjang tepi meningkat) dan dengan syarat bilangannya tidak lebih daripada 24, dan terdapat 48 peristiwa. Bagi setiap peristiwa ganjil, DOUT dibaca
Daripada lembaran data ia mengikuti bahawa bilangan denyutan mestilah sekurang-kurangnya 25, yang sepadan dengan keuntungan sebanyak 128 (dalam kod yang saya gunakan 25 denyutan), ini bersamaan dengan 50 peristiwa pemasa, yang menunjukkan akhir bingkai data.
++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
}
Selepas ini, kami mematikan pemasa dan memproses data (mengikut lembaran data) dan menukar HX711 kepada mod penggunaan kuasa rendah.
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);
}
Kami menjangkakan peristiwa daripada pemasa RTC dengan selang 10 saat (ini mengikut budi bicara anda) dan melancarkan HX711 dalam pengendali, menyebabkan gangguan pada garisan DOUT.
Terdapat satu lagi titik, log dikeluarkan melalui UART (kadar baud 115200, TX - 6 pin, RX - 8 pin) semua tetapan berada dalam sdk_config.h
Penemuan
Terima kasih semua atas perhatian anda, saya harap artikel ini berguna dan akan mengurangkan masa yang berharga untuk pembangun mencari penyelesaian. Saya ingin mengatakan bahawa pendekatan teknikal yang digunakan oleh Nordic dalam platformnya agak menarik dari sudut kecekapan tenaga.
PS
Projek ini masih dalam pembangunan, jadi jika topik ini menarik, dalam artikel seterusnya saya akan cuba menerangkan algoritma untuk menentukur sensor berat, serta menyambungkan timbunan BLE.
bahan-bahan
Sumber: www.habr.com