1. inleiding
Op die agenda was die taak om 'n kommunikasieprotokol vir die nrf52832 mikrobeheerder met twee halfbrug Chinese rekmeters te ontwikkel.
Die taak blyk nie maklik te wees nie, aangesien ek gekonfronteer is met 'n gebrek aan enige verstaanbare inligting. Dit is meer waarskynlik dat die "wortel van kwaad" in die SDK van Nordic Semiconductor self is - konstante weergawe-opdaterings, 'n mate van oortolligheid en verwarrende funksionaliteit. Ek moes alles van voor af skryf.
Ek dink hierdie onderwerp is redelik relevant, gebaseer op die feit dat hierdie skyfie 'n BLE-stapel en 'n hele stel "goedere" het vir energiebesparingsmodus. Maar ek gaan nie te diep in die tegniese deel nie, aangesien baie artikels oor hierdie onderwerp geskryf is.
2. Projekbeskrywing
Yster:
- Adafruit Feather nRF52 Bluefruit LE (wat toevallig byderhand was)
- HX711 ADC
- Chinese rekmeters 2 stuks. (50x2 kg)
- Programmeerder ST-LINK V2
Sagteware:
- IDE VSCODE
- NRF SDK 16
- OpenOCD
- Programmeerder ST-LINK V2
Alles is in een projek, jy hoef net die Makefile aan te pas (spesifiseer die ligging van jou SDK).
3. Beskrywing van die kode
Ons sal die GPIOTE-module gebruik om met randapparatuur te werk gebaseer op die binding van take en gebeure, sowel as die PPI-module om data van een randapparaat na 'n ander oor te dra sonder die deelname van 'n verwerker.
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);//Π½Π°ΡΡΡΠ°Π΅Π²Π°Π΅ΠΌ Π½Π° Π²ΡΡ
ΠΎΠ΄
Ons konfigureer die PD_SCL-sinchronisasielyn na die uitset om pulse te genereer met 'n duur van 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);//Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°ΠΉΠΌΠ΅Ρ
}
Ons konfigureer die DOUT-datalyn om die gereedheidstoestand van die HX711 te lees; as daar 'n lae vlak is, word 'n hanteerder geaktiveer waarin ons die onderbreking deaktiveer en 'n timer begin om klokpulse by die PD_SCL-uitset te genereer.
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);
// aktiveer gpiote
Daarna inisialiseer ons die PPI-module en koppel ons timer aan die PD_SCL-uitset om pulse met 'n duur van 10 ΞΌs te genereer wanneer 'n vergelykingsgebeurtenis plaasvind, en skakel ook die GPIOTE-module aan.
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);// ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
Ons inisialiseer die nul-timer en sy hanteerder.
if(m_counter%2 != 0 && m_counter<=48){
buffer <<= 1;// ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΡΠΈΡΠ°Π½Π½ΡΡ
Π΄Π°Π½ΡΡ
c_counter++;// ΡΡΠ΅ΡΡΠΈΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΈΠΌΠΏΡΠ»ΡΡΠΎΠ²
if(nrf_gpio_pin_read(DOUT))buffer++;//ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²Ρ
ΠΎΠ΄Π°
}
Die interessantste ding gebeur in die timer hanteerder. Die polsperiode is 20 ΞΌs. Ons stel belang in onewe pulse (langs die stygende rand) en mits hul getal nie meer as 24 is nie, en daar 48 gebeurtenisse is. Vir elke onewe gebeurtenis word DOUT gelees
Uit die datablad volg dit dat die aantal pulse ten minste 25 moet wees, wat ooreenstem met 'n wins van 128 (in die kode het ek 25 pulse gebruik), dit is gelykstaande aan 50 timergebeure, wat die einde van die dataraam aandui.
++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
}
Hierna skakel ons die timer af en verwerk die data (volgens die datablad) en skakel die HX711 oor na lae kragverbruikmodus.
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);
}
Ons verwag gebeure van die RTC-tydteller met 'n interval van 10 s (dit is na u goeddunke) en begin die HX711 in die hanteerder, wat 'n onderbreking op die DOUT-lyn veroorsaak.
Daar is nog een punt, die logs word uitgevoer via UART (baudrate 115200, TX - 6 penne, RX - 8 penne) alle instellings is in sdk_config.h
Bevindinge
Dankie almal vir u aandag, ek hoop dat hierdie artikel nuttig sal wees en waardevolle tyd sal verminder vir ontwikkelaars om 'n oplossing te vind. Ek wil sΓͺ dat die tegniese benadering wat Nordic in sy platforms gebruik, nogal interessant is uit die oogpunt van energiedoeltreffendheid.
PS
Die projek is nog in ontwikkeling, so as hierdie onderwerp van belang is, sal ek in die volgende artikel probeer om die algoritme vir die kalibrering van gewigsensors te beskryf, asook om die BLE-stapel te verbind.
Materiale
Bron: will.com