Na axenda estaba a tarefa de desenvolver un protocolo de comunicación para o microcontrolador nrf52832 con dous extensómetros chineses de media ponte.
A tarefa resultou non ser doada, xa que estaba ante a falta de información intelixible. É máis probable que a "raíz do mal" estea no SDK do propio Nordic Semiconductor: actualizacións constantes da versión, certa redundancia e funcionalidades confusas. Tiven que escribir todo dende cero.
Creo que este tema é bastante relevante baseándose no feito de que este chip ten unha pila BLE e todo un conxunto de "goodies" para o modo de aforro de enerxía. Pero non vou afondar demasiado na parte técnica, xa que se escribiron moitos artigos sobre este tema.
2. Descrición do proxecto
Ferro:
Adafruit Feather nRF52 Bluefruit LE (o que estaba a man)
ADC HX711
Extensómetros chinos 2 unidades. (50 x 2 kg)
Programador ST-LINK V2
Suave:
IDE VSCODE
NRF SDK 16
OpenOCD
Programador ST-LINK V2
Todo está nun proxecto, só tes que axustar o Makefile (especifica a localización do teu SDK).
3. Descrición do código
Utilizaremos o módulo GPIOTE para traballar con periféricos baseados na vinculación de tarefas e eventos, así como o módulo PPI para transferir datos dun periférico a outro sen a participación dun procesador.
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);//настраеваем на выход
Configuramos a liña de sincronización PD_SCL á saída para xerar pulsos cunha duración de 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);
Configuramos a liña de datos DOUT para ler o estado de preparación do HX711; se hai un nivel baixo, desenvólvese un controlador no que desactivamos a interrupción e iniciamos un temporizador para xerar pulsos de reloxo na saída PD_SCL.
Despois diso, inicializamos o módulo PPI e conectamos o noso temporizador á saída PD_SCL para xerar pulsos cunha duración de 10 μs cando se produce un evento de comparación, e tamén activamos o módulo 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);// срабатывает по сравнению
Inicializamos o temporizador cero e o seu controlador.
O máis interesante ocorre no controlador do temporizador. O período do pulso é de 20 μs. Interésanos os pulsos impares (ao longo do bordo ascendente) e sempre que o seu número non sexa superior a 24 e haxa 48 eventos. Para cada evento impar, lese DOUT
Da folla de datos despréndese que o número de pulsos debe ser polo menos 25, o que corresponde a unha ganancia de 128 (no código usei 25 pulsos), isto é equivalente a 50 eventos de temporizador, o que indica o final do marco de datos.
Esperamos eventos do temporizador RTC cun intervalo de 10 s (isto é ao teu criterio) e lanzar o HX711 no controlador, provocando unha interrupción na liña DOUT.
Hai un punto máis, os rexistros saen a través de UART (velocidade en baudios 115200, TX - 6 pinos, RX - 8 pinos) todas as configuracións están en sdk_config.h
Descubrimentos
Grazas a todos pola súa atención, espero que este artigo sexa útil e reduza o tempo valioso para que os desenvolvedores atopen unha solución. Quero dicir que o enfoque técnico que Nordic utiliza nas súas plataformas é bastante interesante dende o punto de vista da eficiencia enerxética.
PS
O proxecto aínda está en desenvolvemento, polo que se este tema é de interese, no seguinte artigo intentarei describir o algoritmo para calibrar sensores de peso, así como conectar a pila BLE.