1. Perkenalan
Agendanya adalah tugas mengembangkan protokol komunikasi untuk mikrokontroler nrf52832 dengan dua alat pengukur regangan Cina setengah jembatan.
Tugas tersebut ternyata tidak mudah, karena saya dihadapkan pada kurangnya informasi yang dapat dimengerti. Sepertinya "akar kejahatan" ada di SDK itu sendiri dari Nordic Semiconductor - ini adalah pembaruan versi yang konstan, beberapa redundansi, dan kebingungan fungsi. Saya harus menulis semuanya dari awal.
Saya pikir topik ini cukup relevan mengingat chip ini memiliki tumpukan BLE dan seluruh rangkaian "permen" dari mode hemat daya. Tetapi saya tidak akan membahas lebih jauh ke bagian teknis, karena banyak artikel telah ditulis tentang topik ini.
2. Deskripsi proyek
Besi:
- Adafruit Feather nRF52 Bluefruit LE (apa yang terjadi sudah dekat)
- ADC HX711
- Alat pengukur regangan Cina 2 pcs. (50x2 kg)
- Pemrogram ST-LINK V2
Perangkat lunak:
- IDE VSCODE
- NRF SDK 16
- OpenOCD
- Pemrogram ST-LINK V2
Semuanya ada dalam satu proyek, Anda hanya perlu dukun Makefile (tentukan lokasi SDK Anda).
3. Deskripsi kode
Kami akan menggunakan modul GPIOTE untuk bekerja dengan periferal berdasarkan pengikatan tugas dan acara, serta modul PPI untuk mentransfer data dari satu periferal ke periferal lain tanpa partisipasi prosesor.
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 garis sinkronisasi PD_SCL ke output untuk menghasilkan pulsa dengan durasi 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 jalur data DOUT untuk membaca status siap HX711, jika ada level rendah, penangan dipicu di mana kami menonaktifkan interupsi dan memulai pengatur waktu untuk menghasilkan pulsa clock 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);
// aktifkan gpiote
Setelah itu, kita menginisialisasi modul PPI dan mengalihkan timer kita ke output PD_SCL, untuk menghasilkan pulsa dengan durasi 10 μs saat peristiwa perbandingan terjadi, dan juga mengaktifkan 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 menginisialisasi pengatur waktu nol dan penangannya.
if(m_counter%2 != 0 && m_counter<=48){
buffer <<= 1;//
c_counter++;//
if(nrf_gpio_pin_read(DOUT))buffer++;//
}
Hal yang paling menarik terjadi di pengatur waktu. Periode nadi adalah 20 μs. Kami tertarik dengan pulsa ganjil (di tepi naik) dan asalkan jumlahnya tidak lebih dari 24, dan ada 48 kejadian.Untuk setiap kejadian ganjil, DOUT dibaca
, 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 , RX — 8 ) sdk_config.h
Terima kasih atas perhatiannya semoga artikel ini bermanfaat dan menghemat waktu yang berharga bagi para developer yang mencari solusinya. Saya ingin mengatakan bahwa pendekatan teknis yang digunakan Nordik dalam platformnya cukup menarik dalam hal efisiensi energi.
PS
Proyek ini masih dalam pengembangan, jadi jika topik ini menarik dalam artikel berikutnya, saya akan mencoba menjelaskan algoritme untuk mengkalibrasi sensor bobot, serta menghubungkan tumpukan BLE.