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

コードに関するいくつかのコメント:

void 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が得られます。これはかなりの違いです。

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

なぜあなたはループで時間を焼き尽くすのですか?カウントをISR内に配置できませんか?TOFフラグは、割り込みを与える可能性があります。または、ハードウェアに組み込まれている出力比較/PWM機能を使用することをお勧めします。

if(counter == 40)output〜= output;

これは有効なCではなく、コンパイルされません。あなたはおそらく意味しoutput = ~outputました。機内で何かを入力する代わりに、コンパイルした実際のコードを投稿してください。

于 2012-09-12T12:22:10.453 に答える
0

I can't follow your expectation of 1,25ms, as 1/4.3E6MHz=233ns BUSCLK

If you set TPM1MOD to 4309 you should get a period of 233ns*4309=1,002ms.

But if you set TPM1MOD to 0x4309 (hex 0x4309=dez 17161) then you should get a period of 233ns*17161=3,99ms.

EDIT: After your edit, showing the code

It's, it's ... uncommon

IMHO, the pure timer settings will work, perhaps it's a bit inaccurate.

But the code to create your output signal is a bit odd.

Try it with something simple.

while (1)
{
   output = TPM1SC_TOF;
}

or to create a square signal

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