1. ααα ααααΈααααΎα
αα ααΎααααααΆααααΊααΆααΆααα·α αα ααααΆααααααΎααα·ααΈααΆαααααΆαααααααααααΆαα microcontroller nrf52832 ααΆαα½αααΉααααααΆααααΆαααααααΆαααααΆαααΈαααααα α·αα
αα·α αα ααΆαβααΆαβααααβααααΆαβαα βααΆβαα·αβααΆαβαααα½αβαα αααααβαααα»αβααααΌαβαααααβαα»αβααΉαβααΆαβααααβααααααΆαβαααβα’αΆα βαααβααΆαα ααΆααααααΆααΆ "α«ααααααα’αααΎα’αΆααααα" αααα·ααα αααα»α SDK ααΈ Nordic Semiconductor αααα½αααΆααααΆαα - ααΆαα’αΆαααααααααα₯αααααα ααΆααααααααΌαααΆαααα ααα αα·ααα»αααΆαα αααααα½αα ααα½αα αααα»αβααααΌαβαααααβαααααβαααΆαβααΈβααΎαα
αααα»ααα·αααΆαααααΆααααααααΊααΆαααααααααΆαααααααα’ααααΎααΆααα·ααααααΆαααααααΈααααααΆαααα BLE αα·ααααα»αααΆααααΌααα "αααα·α" αααααΆαααααααααααααΆαααα ααα»ααααβαααα»αβααΉαβαα·αβα αΌαβαααα βαα βαααα»αβαααααβαα αα αααααβαα αααααβα’αααααβααΆβα αααΎαβααααΌαβααΆαβαααααβααΎβαααααΆαααβαααα
2. ααΆααα·αααααΆαααααα
ααΆαα·αααα
- Adafruit Feather nRF52 Bluefruit LE (ααΆαα’αααΈααΎαα‘αΎααα αα)
- HX711 ADC
- αααααΆααααααΆαα α·α 2 ααΈα (50x2 ααΈα‘αΌααααΆα)
- α’αααααααααααααα·ααΈ ST-LINK V2
αααααααα:
- IDE VSCODE
- NRF SDK α‘α¦
- OpenOCD
- α’αααααααααααααα·ααΈ ST-LINK V2
α’αααΈααααααααΆαααΊαα αααα»ααααααααα½α α’αααααααΆααααααααΌααααααα Makefile (αααααΆααααΈααΆαα SDK ααααα’ααα)α
3. ααΆααα·αααααΆα’αααΈαααααΌα
ααΎαααΉαααααΎαααΌαα»α GPIOTE ααΎααααΈααααΎααΆαααΆαα½αααααΏααα»αααααΌααααααααα’ααααΎααΆαα αααααΆααα·α αα αα·αααααΉαααα·ααΆααα ααααΌα ααΆαααΌαα»α PPI ααΎααααΈααααααα·ααααααααΈααααΏααα»αααααΌααααα½ααα α§ααααααααααααααααααααΆαααΆαα αΌααα½αααΈαα½αααααΆαα
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);//Π½Π°ΡΡΡΠ°Π΅Π²Π°Π΅ΠΌ Π½Π° Π²ΡΡ
ΠΎΠ΄
ααΎαααααααα ααΆαααααααααααααΆααααααΎααααΆααααα PD_SCL αα ααΉααα·αααααααΎααααΈαααααΎαααΈαα ααααααΆααααααα 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);//Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°ΠΉΠΌΠ΅Ρ
}
ααΎαααααααα ααΆαααααααααααααΆαααα·αααααα DOUT ααΎααααΈα’αΆαααααΆαααΆαααααααααα½ααααα HX711 ααααα·αααΎααΆαααααα·αααΆα α§ααααααααααααΆαααααΌαααΆαααααα‘αΎα αααααΎααα·αααΆαααααΆα αα·αα αΆααααααΎααααααα·ααΈαααααααααααΎααααΈαααααΎαααΈαα ααα αααααα 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);
// ααΎα gpiote
αααααΆααααΈααα ααΎαα αΆααααααΎααααΌαα»α PPI α αΎαααααΆαααααααα·ααΈαααααααααααααααΎααα ααΉααααααα PD_SCL ααΎααααΈαααααΎαααΈαα ααααααΆααααααα 10 ΞΌs αα αααααααΉαααα·ααΆαααααααααααααΎαα‘αΎα α αΎαααααΎααααΌαα»α 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);// ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
ααΎαα αΆααααααΎααααααα·ααΈαααααααααααΌααα αα·αα§ααααααααααααΆαααααααΆα
if(m_counter%2 != 0 && m_counter<=48){
buffer <<= 1;// ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΡΠΈΡΠ°Π½Π½ΡΡ
Π΄Π°Π½ΡΡ
c_counter++;// ΡΡΠ΅ΡΡΠΈΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΈΠΌΠΏΡΠ»ΡΡΠΎΠ²
if(nrf_gpio_pin_read(DOUT))buffer++;//ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²Ρ
ΠΎΠ΄Π°
}
α’αααΈααααα½αα±ααα αΆααα’αΆαααααααααα»αααΎαα‘αΎααα αααα»αα§αααααααααααααααααΆα ααααααααΈαα αααΊ 20 ΞΌsα ααΎαα αΆααα’αΆααααααααΎααΈαα αααα (ααΆααααααΎαα‘αΎα) α αΎααααααααΆα ααα½ααααααα½ααααα·αααΎαααΈ 24 α αΎαααΆαααααΉαααα·ααΆαααα ααα½α 48 α αααααΆααααααΉαααα·ααΆααααααααΈαα½αα DOUT ααααΌαααΆαα’αΆα
ααΈαααααΉααα·ααααααααΆααΌα ααΆααααααααΆα ααα½αααααΈαα αααααΌαααααΆααααΆαα αα ααΆαα 25 αααααααΌαααααΆααΉαααΆαααΎαα‘αΎααα 128 (αα αααα»αααΌαααααααα»αααΆαααααΎ 25 pulses) αααααΊααααΎααΉαααααΉαααα·ααΆααααααααααααα ααα½α 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 115200, TX - 6 pins, RX - 8 pins) ααΆααααααααΆααα’ααααΊαα αααα»α sdk_config.h
ααΆαααααΎα
ααΌαα’ααα»αα’αααααΆααα’αααααααΆααααΆαααα α·ααααα»αααΆααααααα’ααα αααα»ααααααΉαααΆα’ααααααααααΉαααΆααααααααα α αΎαααΉαααΆααααααααααααααΆααααΆαααααααααααΆααα’αααα’αα·ααααααααΎααααΈααααααααααααααααΆαα αααα»αα αααα·ααΆαααΆαα·ααΈααΆααααααα αα αααααααα Nordic ααααΎαα αααα»ααααα·ααΆααααααΆααΊαα½αα±ααα αΆααα’αΆααααααααΆααααΈααααααααααααα·αααααΆαααΆαααα
PS
ααααααααααααα»ααααα·ααααααααΆαα’αα·αααααααα α‘αΎα ααΌα ααααααααα·αααΎαααααΆααααααα αΆααα’αΆαααααα α’ααααααααααΆαααααα»αααΉαααααΆααΆααααααΆα’αααΈαααα½ααααααααΆααααααΆααααΆααααα·αα§αααααα αΆαααααααΆαααααα ααααΌα ααΆααΆαααααΆααααα BLE αααααα
αααααΆαα
ααΌααααααα -
αααα»ααα·αααααα HX711 ααΆααΆααΆα’ααααααα -
ααΆααα·αααααΆα’αααΈααααα·ααααα·ααΆααααααααΆααααααΆα
ααααα: www.habr.com