1

我正在使用 MC9S08LH64 微控制器的定时器模块来生成用于同步的内部定时器。总线时钟为 4.3 MHz,模数设置为 4309(TPM1MODH 和 TPM1MODL),我期望每 1.25 毫秒脉冲一次,但结果大约是每 3.75 毫秒。我在这里缺少任何设置吗?非常感谢

 /*
 * 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;

*更新:我刚刚意识到更改 TPM1MOD 对结果脉冲宽度没有影响。TPM1SC 是我用来设置模块的唯一寄存器。我需要为此设置任何其他寄存器吗?

下面是设置定时器的源代码:

//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;
}

为了生成脉冲,我检查了 TOF 标志,每 40 次标志熄灭,我切换输出:

for(counter = 0; counter<40; counter++
{

   while(!TPM1SC_TOF){}
   if(counter ==40) output~=output;
}
4

2 回答 2

1

关于代码的一些评论:

无效 set_base_pulse(浮动时间_毫秒){

在 8 位微控制器上使用浮点数通常是一个非常糟糕的主意。生成的代码效率极低。在这种情况下,我非常怀疑您是否需要它们。

(int) time_ms*1000/233;

神奇的数字233是什么?首先将其定义为有意义#define BUSCLOCK_ns 233或类似的东西。此外,您的逻辑有缺陷:1.25 * 1000 / 233 = 5.36。将此类型转换为 int 并得到 5。这是完全不同的。

for(计数器 = 0; 计数器<40; 计数器++

为什么你会在循环中消耗时间?您不能将计数放在 ISR 中吗?TOF 标志可以给你一个中断。或者更好的是,使用硬件中的内置输出比较/PWM 功能。

如果(计数器==40)输出~=输出;

这不是有效的 C 语言,不会编译。你可能的意思是output = ~output。请发布您编译的真实代码,而不是在飞行中输入任何内容。

于 2012-09-12T12:22:10.453 回答
0

我无法遵循您对 1,25ms 的期望,因为 1/4.3E6MHz=233ns BUSCLK

如果您将 TPM1MOD 设置为 4309,您应该得到 233ns*4309=1,002ms 的周期。

但是,如果您将 TPM1MOD 设置为 0x4309(十六进制 0x4309=dez 17161),那么您应该得到 233ns*17161=3,99ms 的周期。

编辑:编辑后,显示代码

这是,这是...不常见

恕我直言,纯粹的计时器设置会起作用,也许它有点不准确。

但是创建输出信号的代码有点奇怪。

尝试一些简单的东西。

while (1)
{
   output = TPM1SC_TOF;
}

或创建一个方形信号

while (1)
{
   if ( TPM1SC_TOF )
     output = !output;
}
于 2012-09-07T20:28:18.617 回答