Problema del temporizador PWM con HCS08 - escala inicial

3

Estoy usando un MC9S08LH64 módulo del temporizador del microcontrolador para generar un temporizador interno para la sincronización . el reloj del bus está en 4.3 MHz, el módulo está configurado en 4309 (TPM1MODH y TPM1MODL) y estoy esperando un pulso cada 1.25 ms, pero el resultado es aproximadamente cada 3.75ms. ¿Hay alguna configuración que me estoy perdiendo aquí? Muchas gracias

En el manual de referencia :

/*
 * TPM1SC: pg 358
   bit 
    7   TOF need to check for this flag
    6       not used since no interrupt being used
    5   1  not used
    4   0  selecting bus clock
    3   1
    2   0  not dividing clock down
    1   0
    0   0
  */ 

TPM1SC = 0x08;

* Actualización: Me acabo de dar cuenta de que cambiar el TPM1MOD no tiene efecto en el ancho del pulso resultante. TPM1SC es el único registro que utilicé para configurar el módulo. ¿Hay algún otro registro que deba configurar para esto?

Aquí está el código fuente para configurar el temporizador:

//to set up the modulo register:
void set_base_pulse(float time_ms)
{
  int modulo_value;
  modulo_value = (int) time_ms*1000/233;
  TPM1MODH = modulo_value >>8;
  TPM1MODL = modulo_value;
}

para generar los pulsos, verifiqué el indicador TOF, cada 40 veces que se apaga el indicador, alterno la salida:

for (counter = 0; counter<40; counter++) {
  while (!TPM1SC_TOF) {}
  if (counter == 39) output ~= output;
}
    
pregunta user1604121

2 respuestas

1

No puedo hacer que los cálculos funcionen a 1.25 ms o 3.75 ms.

Si su TPM está usando el reloj del bus y el reloj del bus está en 4.3 MHz, entonces cada tick es:

$$ \ frac {1} {4.3 \ times10 ^ 6} = 232.56 \, \ mathrm {ns} $$

Si tienes modulo_value establecido en 4309 (decimal), se produce una reinversión cada:

$$ 232.56 \, \ mathrm {ns} \ times4309 = 1 \, \ mathrm {ms} $$

Entonces, si estás revisando 40 ocurrencias de TPM1SC_TOF , entonces output debería alternar cada 40 ms.

Si tiene modulo_value establecido en 4309 (hexadecimal), entonces se produce una reinversión cada:

$$ 232.56 \, \ mathrm {ns} \ times17,161 = 3.99 \, \ mathrm {ms} $$

En cuyo caso output debería alternar cada 159.64 ms.

Intente usar el depurador para ver qué TPM1MODH y TPM1MODL se están configurando realmente. Determine la base adecuada (probablemente hexadecimal en el depurador) y use los cálculos anteriores para ver si puede hacer que los números calculen lo que está viendo.

También se debe tener en cuenta en la página 357 del Manual de referencia:

  

Borre TOF leyendo el estado de TPM y el registro de control cuando TOF está   establecer y luego escribir un 0 lógico a TOF. Si ocurre otro desbordamiento de TPM   antes de que se complete la secuencia de borrado, la secuencia se restablece de modo que   TOF permanece establecido después de que se completó la secuencia clara para el anterior   TOF.

Lo que no estás haciendo en tu bucle.

    
respondido por el embedded.kyle
0

No utilizo UC de Freescale, pero si está configurado como un temporizador de ejecución libre, debe establecer el valor de módulo en cada interrupción, de lo contrario, solo se transferirá a 0 y contará desde allí. Así que su primer pulso se cronometrará correctamente y todo el resto será el conteo completo.

Intente configurar sus registros TPM1MOD en la rutina de interrupción. Háganos saber cómo va.

    
respondido por el Oli Glaser

Lea otras preguntas en las etiquetas