PIC que mide la longitud del pulso PWM

4

Acabo de comenzar con los procesadores PIC, impulsados principalmente por la escasez de PICAXE más simple de mi distribuidor local. Mi pregunta es, ¿cómo puedo leer la duración de un pulso PWM en un determinado pin de entrada (análogo al título comando PULSIN en PICAXEs). Estoy usando el IDE de MPLab, y el PIC específico en cuestión es el 12F683. En segundo lugar, (lamento combinar dos preguntas en una), ¿existen bibliotecas que contengan funciones 'comunes' (salida PWM, soporte i2c y similares)? Google está apareciendo seco, pero me parece que esas bibliotecas tienen que estar allí, en algún lugar ... ¡Gracias por cualquier ayuda!

EDIT: el lenguaje es C, y la señal PWM es la salida de un receptor RC destinado a un servo, por lo tanto, es un pulso alto de 1-2 ms cada 20 ms (si lo comprendo correctamente)

    
pregunta Chris

3 respuestas

4

Hay varias formas de medir el ancho de los pulsos entrantes. Lo que es más apropiado depende del ancho de los pulsos, la precisión que necesita y los periféricos que tiene su PIC. Algunas posibilidades son:

  1. Utilice dos módulos CCP en modo de captura. Esto no es posible para su PIC particular, ya que solo tiene un módulo de CCP, lo mencionaré de todas formas para los demás o en caso de que cambie el PIC. Un módulo CCP en modo de captura captura una instantánea del temporizador 1 de 16 bits de funcionamiento libre en el borde de un pin de E / S. Con dos de estas capturas, una para cada borde, las restas para obtener la duración del pulso.

    Este método permite los pulsos de menor duración y tiene la mayor precisión, pero toma dos módulos CCP.

  2. Use un solo módulo CCP y mueva el borde que captura en una interrupción activada por la primera captura. Esto tiene la misma precisión y resolución que el # 1 y utiliza solo un único módulo CCP, pero requiere que el pulso tenga un ancho mínimo para que la rutina de interrupción tenga tiempo para capturar el valor capturado, cambiar la polaridad del borde de captura.

  3. Capture el temporizador de ejecución libre 1 en el firmware de cada borde, luego haga la resta como en # 1 y # 2. Esto no requiere ningún módulo CCP, pero debe haber un tiempo mínimo entre los bordes para que la rutina de interrupción haga su trabajo. También tiene un poco más de error debido a cierta incertidumbre en la respuesta a la interrupción, y posiblemente en un número variable de instrucciones de la rutina de interrupción si no se codifica con cuidado.

  4. Puerta del temporizador 1 desde el pulso. Haga que el borde posterior cause una interrupción, que luego lee el valor del temporizador 1 y posiblemente lo reinicia listo para el siguiente impulso. Esto tiene una buena precisión y resolución, pero requiere un tiempo mínimo entre los pulsos para que la interrupción tome el valor del temporizador 1 y se configure para el siguiente pulso.

También hay otros métodos, pero sin saber más sobre las características de sus pulsos, no vale la pena dedicarles tiempo. Dado que su PIC tiene un solo módulo CCP y un temporizador 1 con opción de activación, vale la pena considerar los métodos 2 y 4. De nuevo, sería útil saber más sobre las características del pulso.

Una cosa que no detecté es el manejo de desbordamiento para pulsos largos, pero si se sabe que sus pulsos son lo suficientemente cortos, esto no es un problema.

    
respondido por el Olin Lathrop
1

Microchip proporciona una colección de consejos y trucos , que contiene muchas soluciones útiles (pequeñas) para muchos problemas La Parte 3.4 proporciona una solución para medir el ancho de un pulso (con la funcionalidad de captura / comparación, como se menciona correctamente en @Chris). Explica lo que hace, pero no proporciona ningún código fuente (pero junto con la hoja de datos del 12F683 debería ser bastante fácil codificar esto en C).

A su segunda pregunta: Microchip proporciona dichas bibliotecas solo para su serie PIC18 y superiores, por lo que no tiene suerte con el PIC12. Pero hay algunos otros repositorios de código de ejemplo , en el que puede utilizar una base para su trabajo.

    
respondido por el hli
1

En cuanto a las bibliotecas, puede utilizar el compilador mikroC C para PIC de MikroElektronika. La versión gratuita que proporcionan limita el tamaño binario de salida a 2 KB (no es un problema con PIC12F683, ya que su memoria de programa también es de 2 KB). El compilador viene con muchas bibliotecas útiles como Pwm, Eeprom, Uart, Manchester, etc. He estado usando este IDE para jugar con PIC12F683 por un tiempo, es bastante fácil acostumbrarme a ello.

    
respondido por el Zviadi Varshanidze

Lea otras preguntas en las etiquetas