Lectura de datos del sensor de presión digital (Sensor de presión SPD100GD)

1

Necesitamos leer la salida digital de un sensor de presión SPD100GD con un AVR micro (Atmega128) . De acuerdo a la hoja de datos debemos estimar la velocidad de transmisión. La hoja de datos está diciendo:

  

La velocidad de transmisión depende de la velocidad de actualización y varía hasta 8 kHz.      El software debe determinar la velocidad de salida digital mediante el "Bit de inicio".
  Este bit de inicio es 50% bajo y 50% alto.
  Sobre la base de esta información, se puede interpretar la velocidad de los datos entrantes. La paridad se define como un significado par en el caso de que el número de 1 en la palabra es par, la paridad sea cero y en el caso de que el número sea impar, el bit de paridad es 1. Entre el byte superior e inferior hay un bit de parada, nivel 1, con la longitud de la mitad de la celda de datos (no dibujada en la imagen).

Entonces, ¿cómo podríamos estimar la velocidad de transmisión, y después de eso, hay algún código C o C ++ similar para este tipo de sensores digitales?

    
pregunta 1st

3 respuestas

3

Desde la hoja de datos, un solo byte en el cable se vería así:

No creo que tu UART pueda decodificar esto, por lo que es posible que debas recurrir a golpear un pin de E / S digital.

Comience por la izquierda; un bit de parada es alto para un período de bit completo. Espere una transición a bajo y mida el tiempo hasta la transición a alto. Espere una transición a bajo y mida este tiempo.

Si esos tiempos son iguales, este es un bit de inicio. Estas dos medidas añadidas son un período de bits.

Ahora espere una transición a alta: si este tiempo es el 75% de un tiempo de bit completo y la próxima transición a baja es el 25% de un tiempo de bit, este es un '0'.

Enjuague y repita: la unidad envía 8 bits de datos a la vez, con la línea en alto durante un tiempo de bit completo para indicar un bit de parada.

    
respondido por el Peter Smith
3

Me gustaría utilizar sin vergüenza la figura de la excelente respuesta de Peter:

Siobservadetenidamente,notaráque,sibienlosbordesascendentespuedenestarendiferentesposiciones,losbordesdescendentessiempreestánseparadosporunalongituddebit.

Porlotanto,paramedirlavelocidad,esperaríaelprimerflancodescendente(iniciodelbitdeinicio)yluegocontaríalosciclosdelaCPUhastaelflancoascendente.Comosabequeesteeselbitdeinicio,ahoratieneuna"mitad de longitud de bit", que, especialmente, debería ser el umbral entre contar un bit como 1 o 0.

Entonces, cómo escribir un receptor para esto depende del microcontrolador que estés usando, y no estoy versado en AVRs. Pero: normalmente solo puede asignar una interrupción a un pin que se activa cuando el pin cambia

En el enrutamiento del servicio de interrupción (ISR), verificas si se trata de un flanco descendente o ascendente:

  • filo descendente inicia un contador que aumenta automáticamente sin que tengas que hacer nada en el software.
  • borde ascendente :
    • primer bit : contador de parada, se usa como valor de umbral entre 0 y 1
    • bits subsiguientes : detener el contador, comparar con el valor de umbral guardado. Si counter > threshold : recibió un 1 ; si counter <= threshold , un 0 . Si este es el octavo bit, vuelva al estado "esperando el primer bit".

En realidad, hay microcontroladores que tienen receptores de hardware para este tipo de datos. No es tan difícil de implementar, en realidad, como se vio en la descripción lógica de mi software anterior: es una máquina de estado de cuatro estados y, por lo tanto, es relativamente fácil de implementar en hardware. De todos modos, supongo que ATMegas no tiene una unidad de medida PWM (a diferencia de otras alternativas más baratas como varias de las MCU ARM Cortex-M0 que, por ejemplo, ST Micro vende).

Realmente creo que podría convencer a su UART para que reciba estas cosas: tendría que configurar su UART tres veces (o más) la tasa de bits del sensor, y luego interpretar 011 como 1 , y 001 como 0 , e ignorar el bit de inicio. Pero esa no será una buena solución, ya que no se especifica en la hoja de datos, por lo que puedo ver, la tasa de bits probablemente variará mucho.

¹ tras una discusión por Wossname: los cuatro estados podrían ser

  1. A la espera de que el borde descendente comience el bit de inicio
  2. Esperando el flanco ascendente en el bit de inicio
  3. A la espera de que el borde de la caída comience un bit de datos
  4. Esperando el flanco ascendente en el bit de datos
respondido por el Marcus Müller
1

Para elaborar un punto que Marcus Müller hizo en su respuesta, en circunstancias ideales puede ser posible usar un hardware configurable UART para leer este protocolo. Aunque es un poco difícil a menos que puedas ajustar automáticamente tu velocidad de transmisión sobre la marcha :).

Considere este diagrama de tiempo comparando la salida de su sensor (la línea azul) con un desglose de tiempo RS-232 (cuadros de colores). Las casillas grises solo muestran la longitud del "paquete" del bit sensor ...

VerdeeselbitdeinicioRS-232(unpulsobajoqueseactivaporelpulsobajoinicialdelsensor).RojoeselbitdeparadaRS-232quedebefinalizarantesdequeelsensorenvíeelsiguientebit.ElamarilloeslosbitsdedatosRS-232.

LalíneaazulsevuelvepositivadentrodelaseccióndedatosdecadapaqueteRS-232conalmenos1bitderepuestoencadaextremo.Estosignificaqueparadetectarcadaunodelos3estados(INICIO,0y1)podemossimplementeusarunatabladebúsqueda.

UnpaqueteRS-232quecontiene0?111111binarioequivalealestado"lógico 1" del sensor. El 000??111 binario equivaldría a "START STATE", y el 000000?1 binario sería "0 lógico". Aquellos "?" indica bits no confiables que coinciden con el flanco ascendente de la señal.

Sin embargo, esto podría ser difícil de configurar, en el tiempo. El RS-232 sería "8N1" en la imagen que proporcioné anteriormente, pero lo más importante sería la longitud total del RS-232, que no debe exceder la longitud de bits del flujo de datos del sensor (de lo contrario, perdería los bits de inicio) .

Dado que el Mega128 puede manejar la calibración para este régimen de tiempo, el sensor tendría que ser coherente en su tiempo, aunque las brechas entre los datos (lógica alta de ralentí 1) pueden ser arbitrariamente largas.

Creo que una tasa de bits de muestreo RS-232 adecuada sería

bitrate=(sensor data speed) * X

donde X es algo flotante entre 10.0 y 10.8.

    
respondido por el Wossname

Lea otras preguntas en las etiquetas