Estoy usando una placa B-L072Z-LRWAN1 (que tiene una MCU STM32L072) y quiero obtener datos de un sensor DHT11. Para lograr esto, necesito un retraso de microsegundos que no puedo obtener.
Las bibliotecas proporcionadas por ST tienen una función de retraso de milisegundos pero no una función de microsegundos.
Necesito algo de ayuda. ¡Gracias de antemano!
No necesita un retraso de microsegundos, sino un contador de tiempo con una precisión de microsegundos.
Mirando la hoja de datos vinculada por @JRE, este es un protocolo asíncrono. El host transmite un pulso largo y bajo (al menos 18 milisegundos ), y ese es el único momento en que la MCU debe retrasar algo. Pero ya tiene una función de retraso de milisegundos (y de todos modos, sería mejor hacerlo en la interrupción de milisegundos que probablemente ya se esté ejecutando).
Luego, el dispositivo responde con un ciclo de inicio y 40 ciclos de datos, donde la longitud de la fase alta codifica el valor del bit. Tienes que medir el tiempo transcurrido entre el flanco de subida y el de bajada.
Si la interrupción de milisegundos se está ejecutando, entonces ya hay algo que cuenta los ciclos. Por lo general, es el SysTick
temporizador. Espere el flanco ascendente en el pin, obtenga una marca de tiempo de SysTick->VAL
, espere el flanco descendente, lea el contador nuevamente y reste la marca de tiempo anterior. Tenga cuidado con el desbordamiento, agregue SysTick->LOAD+1
al resultado si es negativo. Divida el resultado por la frecuencia del reloj (en MHz) para obtener un valor en microsegundos.
Sin embargo, es posible que prefiera que la MCU haga algo útil o dejarla en reposo para conservar energía mientras ingresan los datos.
Un temporizador y DMA pueden hacer la mayor parte del trabajo por su cuenta
Lea la descripción funcional de TIM2/TIM3/ sección Modo de captura de entrada en el Manual de referencia.
Como la fase baja de la señal siempre debe tener una duración de 50 us, también puede medir el tiempo entre dos flancos descendentes consecutivos. El ejemplo en el manual es para flancos ascendentes, pero por supuesto puede modificarse para capturar flancos descendentes cambiando los bits CC1P
y CC1NP
en el Paso 3.
CCR
registro del canal del temporizador a una matriz de tamaño adecuado en la memoria.PSC
, y no olvide configurar UG
) EGR
para obtener convenientemente una marca de tiempo en milisegundos.DIER
.ARR
.
usuario197178
JRE
chris stratton
usuario197178