À l'agenda era u compitu di sviluppà un protokollu di cumunicazione per u microcontroller nrf52832 cù dui strain gauges chinesi di mezzu ponte.
U compitu ùn era micca faciule, postu chì era affruntatu cù una mancanza di infurmazione intelligibile. Hè più prubabile chì a "radica di u male" hè in u SDK da Nordic Semiconductor stessu - aghjurnamenti di versione custanti, qualchì redundanza è funziunalità cunfusa. Aviu avutu à scrive tuttu da zero.
Pensu chì questu tema hè abbastanza pertinenti basatu annantu à u fattu chì stu chip hà una pila BLE è un inseme sanu di "buoni" per u modu di risparmiu d'energia. Ma ùn andaraghju troppu in a parte tecnica, postu chì parechji articuli sò stati scritti nantu à questu tema.
2. Descrizzione di u prugettu
Ferru:
Adafruit Feather nRF52 Bluefruit LE (ciò chì hè accadutu à a manu)
ADC HX711
Strain gauges chinesi 2 pezzi. (50 x 2 kg)
Programmatore ST-LINK V2
Software:
IDE VSCODE
NRF SDK 16
OpenOCD
Programmatore ST-LINK V2
Tuttu hè in un prughjettu, basta à aghjustà u Makefile (specificà u locu di u vostru SDK).
3. Descrizzione di u codice
Aduprà u modulu GPIOTE per travaglià cù periferiche basate nantu à u ligame di i travaglii è l'avvenimenti, è ancu u modulu PPI per trasfiriri dati da un perifericu à l'altru senza a participazione di u processatore.
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);//настраеваем на выход
Configurate a linea di sincronizazione PD_SCL à l'output per generà impulsi cù una durata di 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);
Configurate a linea di dati DOUT per leghje u statu di prontezza di l'HX711; se ci hè un livellu bassu, hè attivatu un gestore in quale disattivemu l'interruzzione è cuminciamu un timer per generà impulsi di clock à l'output PD_SCL.
Dopu à quessa, avemu inizializatu u modulu PPI è cunnette u nostru timer à l'output PD_SCL per generà impulsi cù una durata di 10 μs quandu si verifica un avvenimentu di paraguni, è ancu accende u modulu 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);// срабатывает по сравнению
A cosa più interessante succede in u gestore di timer. U periodu di l'impulsu hè di 20 μs. Semu interessate in impulsi strani (longu à u bordu crescente) è sempre chì u so numeru ùn hè micca più di 24, è ci sò avvenimenti 48. Per ogni avvenimentu stranu, DOUT hè lettu.
Da a datasheet segue chì u numeru di impulsi deve esse almenu 25, chì currisponde à un guadagnu di 128 (in u codice aghju utilizatu 25 impulsi), questu hè equivalente à 50 eventi timer, chì indica a fine di u quadru di dati.
Aspittemu avvenimenti da u timer RTC cù un intervallu di 10 s (questu hè à a vostra discrezione) è lanciate u HX711 in u handler, causendu una interruzzione in a linea DOUT.
Ci hè un puntu più, i logs sò in output via UART (baud rate 115200, TX - 6 pins, RX - 8 pins) tutti i paràmetri sò in sdk_config.h
scuperti
Grazie à tutti per a vostra attenzione, speru chì questu articulu serà utile è riducerà u tempu preziosu per i sviluppatori per truvà una suluzione. Vogliu dì chì l'approcciu tecnicu chì Nordic usa in e so plataforme hè abbastanza interessante da u puntu di vista di l'efficienza energetica.
PS
U prugettu hè sempre in sviluppu, dunque, se stu tema hè di interessu, in u prossimu articulu pruvaraghju à descriverà l'algoritmu per calibrating sensors di pisu, è ancu di cunnette u stack BLE.