Timer

16bit カウンタを用いるハードウェアタイマー(TIMER0 .. 4) を利用可能です。

このタイマーは、PWM 出力などのペリフェラルとして利用することもできますし、ソフトウェア処理を行うハードウェアタイマーとして利用することも可能です。

ポートの割り当て

タイマー番号
副2
解説

TIMER0

8, 9, 10

2,3,4

汎用タイマー機能利用可能

TIMER1

11

5

PWM 出力専用

TIMER2

12

6

DO0*

PWM 出力専用

TIMER3

13

7

DO1*

PWM 出力専用

TIMER4

17

8

PWM 出力専用

ペリフェラル API vAHI_TimerSetLocation() により、副割り当てに変更できます。

* TIMER2と3 は DO0,1 に割り当てを変更できます。ただし、これらのポートについては、電源投入時に Vcc レベルになっていないと TWELITE 無線マイコンが正常起動しないことがあります。

初期化と開始、終了

事前にペリフェラルマニュアルを参照の上、Timer で利用しないポートを宣言します。この宣言をしないと、Timer の初期化後、該当ポートは汎用のIOポートとして利用できなくなります。

以下の例では bit0,1,2 をセットします。これは TIMER0 で使用する PWM 用のピンを全て汎用IO向けに解放します。

vAHI_TimerFineGrainDIOControl(0x7);

tsTimerContext() のパラメータ

Bit

Timer Input/Output

0

TIMER 0 ゲート/イベント入力

1

TIMER 0 キャプチャー入力

2

TIMER 0 PWM 出力

3

TIMER 1 PWM 出力

4

TIMER 2 PWM 出力

5

TIMER 3 PWM 出力

6

TIMER 4 PWM 出力

7

予約

次に Timer ライブラリ用の初期化構造体 tsTimerContext を静的に確保し、設定を行います。

必要なタイマーの周波数に対して適切な PreScale を選択するようにします。

プリスケール(u8PreScale) は、要求する周期(周波数)に対して、多くの場合はより小さい値を選択します。

Timer は 16Mhz のカウンター値をプリスケールしており、1周期のカウント値(Ct)は以下の式で与えられます。

この Ct 値が 16bit の最大数(65535)を超えないように設定します。例えば64Hzのタイマーが欲しい場合は p=2 で Ct = 62500, p=4 で Ct = 15625 となります。 より正確なDuty比のPWM出力が必要な場合は、少しでも小さな p=2 を選択しますが、単純にソフトウェア用のタイマーが必要な場合は p=4 でも違いはありません。

最後に、Timer を開始します。

Timer を一時的に停止させるには、vTimerStop() を呼び出します。完全に無効化するには vTimerDisable() を呼び出します。

タイマー割り込み

ToCoNet_u8HwInt() ToCoNet_vHwEvent() の u8DeviceID パラメータが E_AHI_DEVICE_TIMER0 から E_AHI_DEVICE_TIMER4 をとります。

PWM 出力

Timerの出力として PWM 出力を設定することが可能です。

Duty比の精度を向上させるため、上述のプリスケール値を十分小さい値にしておくことを推奨します。

PWM出力を得るためには以下の設定が必要です。

  • tsTimerContext の bPWMOut を TRUE に設定する

  • tsTimerContext の u16duty を 0..1024 の値に設定する

  • vAHI_TimerFineGrainDIOControl() で出力を無効にしていない

最終更新