1. introduction
In agenda erat munus evolvendi communicationem protocollum nrf52832 microcontrollerum cum duobus dimidiatis pontis cola Sinensium gauges.
Negotium non facile evasit, ut praenotavit defectus cuiuslibet notitiae intelligibilis. Verisimile est "radix mali" in SDK esse ab ipso Semiconductore Nordico - constantis versionis updates, quaedam additae et confusionis functionis. Dederam omnia scribere de integro.
Hunc locum satis pertinere puto ex eo quod hic chippis habet acervum BLE et totum numerum "lacus" pro industria modus salutaris. Sed non nimis profundam in partem technicam, cum multi articuli de hoc argumento scripti sint.
2. Project descriptionem
Ferrum:
- Adafruit Pluma nRF52 Bluefruit LE (quod factum est ad manum)
- HX711 ADC
- Seres cola gauges 2 quam at pede. (50x2 kg)
- Programmator ST-LINK V2
Mollis:
- IDE VSCODE
- NRF SDK 16
- OpenOCD
- Programmator ST-LINK V2
Omnia in uno incepto sunt, tu modo fac ut tweak (specificare situm tui SDK).
3. Descriptio ex codice
GPIOTE modulo utemur ad operandum periphericis innixum obligatione officiorum et eventuum, necnon PPI moduli ad datam ab uno peripherico in alium transferendi sine participatione processus.
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 synchronisationi lineam ad output configuramus pulsus generandi cum duratione 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 data linea configuramus ad legendi promptitudinem statum HX711, si humili gradu est, tracto utitur in quo interrumpere et timer incipimus ad pulsus horologii generandi pulsus in PD_SCL output generandi.
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);
// enable gpiote
Post hoc moduli initializemus PPI et timentem nostrum ad PD_SCL output coniungimus ad pulsus generandos cum duratione 10 ΞΌs cum comparationis res incidit, et etiam in moduli GPIOTE vertimus.
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);// ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ
Nos nulla timor initialize et tracto eius.
if(m_counter%2 != 0 && m_counter<=48){
buffer <<= 1;// ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΡΠΈΡΠ°Π½Π½ΡΡ
Π΄Π°Π½ΡΡ
c_counter++;// ΡΡΠ΅ΡΡΠΈΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΠΈΠΌΠΏΡΠ»ΡΡΠΎΠ²
if(nrf_gpio_pin_read(DOUT))buffer++;//ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π²Ρ
ΠΎΠ΄Π°
}
Maxime interesting res fit in timer tracto. Pulsus periodus 20 ΞΌs est. Nos interest pulsuum imparium (per marginem orientis) et dummodo numerus eorum non plus sit quam XXIV, et eventus 24 sunt. Pro unoquoque impari eventu legitur DOUT.
Ex scheda schedae sequitur numerum pulsus minimum esse debere XXV, qui respondet quaestui 25 (in codice quo usus sum 128 pulsuum), hoc aequivalet eventorum 25 timorum, qui in fine tabulae notitiae indicat.
++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
}
Post hoc, timer avertimus et notitias processus (secundum notitia sheet) et modum potentiae consummationis HX711 commutandum est.
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);
}
Expectamus eventus a timer RTC cum intervallo 10 s ( hoc arbitrio tuo ) et HX711 in tracto deducimus , interregem in linea DOUTA.
Unum punctum, ligna output sunt per UART (baud rate 115200, TX - 6 fibulae, RX - 8 fibulae) omnes occasus in sdk_config.h.
Inventiones
Tibi gratias omnes pro attentione tua, spero hunc articulum utile fore et tempus pretiosum reducere tincidunt solutionem invenire. Dicere cupimus technicum accessum quem Nordic usus in suis suggestis suggestis esse satis interesting ex parte efficientiae energiae.
PS
Propositum adhuc sub evolutione est, quare si hic locus interest, in proximo articulo conabor algorithmum ponderis sensoriis calibrandi describere, ac ACERVUM BLE connectere.
materials
Source: www.habr.com