1. Nhanganyaya
Pachirongwa chaive basa rekugadzira nzira yekutaurirana yenrf52832 microcontroller ine maviri hafu-bhiriji Chinese strain geji.
Basa racho rakanga risiri nyore, sezvo ndakanga ndatarisana nokushaiwa mashoko api naapi anonzwisisika. Zvinonyanya kuitika kuti "mudzi wezvakaipa" uri muSDK kubva kuNordic Semiconductor pachayo - inogara ichigadziridza shanduro, kumwe kudhindwa uye kuvhiringidza mashandiro. Ndaifanira kunyora zvose kubva pakutanga.
Ini ndinofunga iyi musoro wakanyatsoenderana zvichienderana nekuti chip iyi ine BLE stack uye yakazara seti ye "goodies" yesimba rekuchengetedza maitiro. Asi ini handisi kuzopinda zvakanyanya muchikamu chehunyanzvi, sezvo zvinyorwa zvakawanda zvakanyorwa pane iyi nyaya.
2. Tsanangudzo yeprojekiti
Simbi
- Adafruit Feather nRF52 Bluefruit LE (chii chakaitika kuti chava pedyo)
- ADC HX711
- Chinese strain gauges 2 pcs. (50x2 kg)
- Programmer ST-LINK V2
Yakapfava
- IDE VSCODE
- NRF SDK 16
- OpenOCD
- Programmer ST-LINK V2
Zvese zviri mupurojekiti imwe chete, iwe unongofanirwa kugadzirisa iyo Makefile (taura nzvimbo yeSDK yako).
3. Tsanangudzo yekodhi
Isu tichashandisa iyo GPIOTE module kushanda nemaperipherals zvichienderana nekusungwa kwemabasa uye zviitiko, pamwe neiyo PPI module yekuendesa data kubva kune imwe peripheral kuenda kune imwe pasina kutora chikamu kwe processor.
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);//Π½Π°ΡΡΡΠ°Π΅Π²Π°Π΅ΠΌ Π½Π° Π²ΡΡ
ΠΎΠ΄
Isu tinogadzirisa PD_SCL mutsara wekubatanidza kune inobuda kuti ibudise mapurusi ane nguva yegumi ΞΌ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);//Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°ΠΉΠΌΠ΅Ρ
}
Isu tinogadzirisa iyo DOUT data mutsara kuti uverenge kugadzirira mamiriro eHX711; kana paine yakaderera nhanho, mubato unokonzereswa umo isu tinodzima kukanganisa uye tanga timer kugadzira wachi pulses paPD_SCL yakabuda.
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);
// shandisa gpiote
Mushure meizvozvo, isu tinotanga iyo PPI module uye tinobatanidza timer yedu kune PD_SCL yakabuda kuti ibudise pulses nehurefu hwegumi ΞΌs kana chiitiko chekuenzanisa chikaitika, uye zvakare vhura GPIOTE module.
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);// ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
Isu tinotanga zero timer uye mubati wayo.
if(m_counter%2 != 0 && m_counter<=48){
buffer <<= 1;// ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΡΠΈΡΠ°Π½Π½ΡΡ
Π΄Π°Π½ΡΡ
c_counter++;// ΡΡΠ΅ΡΡΠΈΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΈΠΌΠΏΡΠ»ΡΡΠΎΠ²
if(nrf_gpio_pin_read(DOUT))buffer++;//ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²Ρ
ΠΎΠ΄Π°
}
Chinhu chinonyanya kufadza chinoitika mumubati wenguva. Nguva yekurova ndeye 20 ΞΌs. Isu tinofarira zvisinganzwisisiki pulses (parutivi runokwira) uye chero nhamba yavo isingapfuuri 24, uye pane zviitiko 48. Pachiitiko chimwe nechimwe chisingadikanwi, DOUT inoverengwa.
Kubva padhetabheti zvinotevera kuti nhamba yemapulses inofanira kunge iine makumi maviri neshanu, iyo inoenderana nekuwana kwe25 (mune kodhi yandakashandisa makumi maviri neshanu pulses), izvi zvakaenzana ne128 timer zviitiko, izvo zvinoratidza kupera kweiyo data 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
}
Mushure meizvi, tinodzima timer uye tinogadzirisa data (maererano nedhetabheti) uye shandura iyo HX711 kune yakaderera simba rekushandisa maitiro.
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);
}
Isu tinotarisira zviitiko kubva kuRTC timer ine nguva yegumi (izvi zviri pakufunga kwako) uye vhura HX10 mumubati, zvichikonzera kukanganisa pamutsetse weDOUT.
Pane imwezve poindi, matanda anobuda kuburikidza neUART (baud rate 115200, TX - 6 pini, RX - 8 pini) zvese zvigadziriso zviri sdk_config.h
zvakawanikwa
Ndinokutendai mose nokuda kwekucherechedza kwenyu, ndinovimba kuti chinyorwa ichi chichabatsira uye chichaderedza nguva inokosha yevagadziri kuti vawane mhinduro. Ndinoda kutaura kuti nzira yehunyanzvi iyo Nordic inoshandisa mumapuratifomu ayo inonakidza kubva pakuona kwesimba rekushandisa.
PS
Iyo purojekiti ichiri kugadziridzwa, saka kana ichi chinyorwa chiri chekufarira, mune inotevera chinyorwa ini ndichaedza kutsanangura iyo algorithm yecalibrating uremu sensors, pamwe nekubatanidza iyo BLE stack.
Zvinhu
Source: www.habr.com