temporizador del microcontrolador PIC

0

Queremos poder diseñar un temporizador basado en microcontrolador PIC. La especificación requiere que tengamos un tiempo de al menos un mes (30 días). He estado tratando de averiguar cómo se puede hacer eso pero estoy atascado. ¿Alguna sugerencia por favor?

    
pregunta hikimoto

3 respuestas

4

¿Qué tan preciso debe ser este período de 30 días? 30 días son aproximadamente 2.5 millones de segundos, con una precisión de cristal de 20 ppm puede tener un error de un minuto después de 1 mes.

Si un error de un minuto es inaceptable, puede usar un oscilador de temperatura controlada o un cristal mejor, como 5 ppm. Si se permite la ayuda externa, puede utilizar la señal de un receptor DCF77 (Europa, WWVB para América del Norte). Estos te darán un tick por segundo con precisión de reloj atómico. Todo lo que tienes que hacer es contar pulsos. Tenga en cuenta que DCF77 tiene solo 59 pulsos por minuto, el pulso omitido indica el comienzo de un nuevo minuto. Si tiene esto en cuenta, su período de 30 días ha transcurrido después de 2 548 800 pulsos (59 \ $ \ veces \ $ 60 \ $ \ veces \ $ 24 \ $ \ veces \ $ 30).

Si el PIC tiene que hacerlo todo por sí mismo, eso tampoco debería ser un problema. Reloj a 32768 Hz y programe un temporizador para dar una interrupción después de 32768 ciclos de reloj, eso es un segundo. Cuente 2 592 000 interrupciones (60 \ $ \ veces \ $ 60 \ $ \ veces \ $ 24 \ $ \ veces \ $ 30).

En un mes pueden pasar muchas cosas, y es probable que desee una batería de respaldo en caso de que haya un corte de energía. Si usa la señal del reloj atómico, también puede decodificar el código de tiempo después de cada pulso por minuto y comparar la fecha y la hora con su hora objetivo. En ese caso, los cortes de energía ni siquiera importan.

editar
No mencionas qué PIC estás usando, y sin ninguna experiencia práctica con ellos sé que hay muchos de ellos. Elegiré el PIC10F200 porque, según tengo entendido, es uno de los PIC menos capaces. , solo tiene un temporizador / contador de 8 bits.
El temporizador / contador puede sincronizarse internamente con el reloj / 4, y tiene un prescaler seleccionable. Si usa un cristal de 32.768 kHz para el reloj, entonces reloj / 4 = 8192 Hz. Establezca el prescaler en \ $ \ div \ $ 32 y el contador / temporizador de 8 bits se desbordará una vez por segundo.

edit 2 (con respecto al comentario de Olin)
Olin señala que el PIC10F200 solo tiene un oscilador interno. Eso no tendrá una precisión de cristal, pero puede sincronizar el temporizador desde un reloj externo. Conecte la salida del oscilador de 32.768 kHz a la entrada T0CKI y configure el prescaler en \ $ \ div \ $ 128. Luego, el contador / temporizador de 8 bits se desbordará una vez por segundo. Según tengo entendido, no hay interrupción de desbordamiento, por lo que tendrá que detectarlo comparando el valor del temporizador con 0x00.

edit 3 (vuelve a tu comentario sobre la precisión)
Permitir un error de dos días en un mes es lo que llamamos precisión muy baja. Ese 6,7%. El oscilador interno está calibrado al 1% a 25 ° C, 2% en todo el rango. Entonces, si lo desea, puede usar el oscilador interno, entonces no necesita el cristal externo de 32.768 kHz. El oscilador está sintonizado a 4MHz, \ $ \ div \ $ 4 le da 1MHz en el prescaler del temporizador. Si configura el prescaler en \ $ \ div \ $ 64, entonces el temporizador de 8 bits se registra en 15625Hz. Cuente con 61 desbordamientos por cada segundo, incluso si ignora el resto, todavía obtiene un 0.06% de precisión.

    
respondido por el stevenvh
2

Los PIC no tienen osciladores con periodos de 30 días incorporados, pero se pueden crear fácilmente a partir de un oscilador más rápido al contar los ciclos. Comienza con un reloj más rápido que tiene disponible, como el reloj de instrucciones o un oscilador externo con temporizador 1. Puede usar un temporizador para reducir este reloj a una frecuencia lo suficientemente baja como para que sea razonable interrumpirlo o incluso simplemente pedir un nuevo ciclo en el código de primer plano.

Por ejemplo, puede generar fácilmente períodos de miles de ciclos de instrucción utilizando el temporizador 2 y su registro de período dedicado, preescalador y escalador posterior. No dijiste qué PIC tenías en mente, así que asumiré un PIC 16 normal o un PIC 18. Usas un contador en la RAM que administras desde el firmware para dividir el resto del camino. Por ejemplo, si el PIC hará otras cosas, a menudo es conveniente configurar una interrupción periódica de 1 ms con el temporizador 2. La rutina de interrupción podría generar múltiples tics, como 10 ms, 100 ms y 1 segundo, 1 minuto, 1 hora, y 1 día. Luego cuentas 30 tics de 1 día. Este método requiere solo un solo byte para cada divisor en la cadena y tiene sentido cuando las otras marcas también son útiles. Si las otras marcas no sirven, puede contar 2,592,000,000 milisegundos, que requieren 4 bytes.

Si la potencia baja es importante y el PIC puede dormir una buena fracción del tiempo durante los 30 días, luego conecte un cristal de reloj de 32768 Hz al temporizador 1 y haga que el PIC se despierte cada 2 segundos cuando el temporizador se desborda. Cuenta 1,296,000 temporizadores 1 desbordamientos para obtener 30 días. Eso requiere 21 bits, por lo que solo 3 bytes de RAM.

    
respondido por el Olin Lathrop
0

Hay otra solución. Algunos PIC incluyen una función de calendario de reloj en tiempo real (RTCC). Para ver cuáles son compatibles con esto, haga clic en el enlace y luego marque "Hardware RTCC" a la derecha. enlace

Este gráfico es rápido y fácil (cuando se clasifica por conteo de pines y se ve cerca de la parte inferior) revela que el 18F24J11 debe ser pequeño, robusto, barato y viene en paquetes QFN, SOIC, SPDIP, SSOP (28).

En los PIC con RTCC, establece la fecha y la hora actuales, luego configura una fecha y hora de alarma y la pone en suspensión. Períodos que van desde fracciones de segundo a siglos son posibles. Entonces puede despertarse después de la interrupción de la alarma RTCC. Algunos modelos usan muy poca corriente mientras está dormido (con el módulo RTCC aún en ejecución).

    
respondido por el rdtsc

Lea otras preguntas en las etiquetas