我正在使用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;
}发布于 2012-09-12 20:22:10
关于代码的一些注释:
空set_base_pulse(float time_ms){
在8位微控制器上使用浮点数通常是一个非常糟糕的想法。生成的代码将非常低效。在这种情况下,我非常怀疑你是否需要它们。
(int) time_ms*1000/233;
神奇的数字233是什么?首先,将它定义为有意义的东西,#define BUSCLOCK_ns 233或类似的东西。此外,您的逻辑是有缺陷的: 1.25 * 1000 / 233 = 5.36。将这个类型转换为int,你会得到5,这是非常不同的。
计数器(
= 0;counter<40;counter++
为什么你要在循环中浪费时间?你不能把计数放在ISR里吗?TOF标志可以给你一个中断。或者更好的做法是使用硬件中的内置输出比较/PWM功能。
计数器if(
==40) output~=output;
这不是有效的C语言,无法编译。你可能指的是output = ~output。请发布你编译的真实代码,而不是在飞行中输入一些东西。
发布于 2012-09-08 04:28:19
我不能满足你对1.25ms的期望,因为1/4.3E6 can=233 as
如果您将TPM1MOD设置为4309,您应该会得到一个233ns*4309=1,002ms句号。
但是,如果您将TPM1MOD设置为0x4309 (十六进制0x4309=dez 17161),那么您应该会得到一个233ns*17161=3,99ms句号。
编辑:编辑完成后,显示代码
这是..。不同寻常
IMHO,纯粹的计时器设置会起作用,也许它有点不准确。
但是创建输出信号的代码有点奇怪。
试着用一些简单的东西。
while (1)
{
output = TPM1SC_TOF;
}或者创建一个正方形信号
while (1)
{
if ( TPM1SC_TOF )
output = !output;
}https://stackoverflow.com/questions/12323787
复制相似问题