7.TIMタイマーの使用の概要

1.TIMタイマーの関連レジスタの概要

  • 入力キャプチャユニットの構成
    ここに画像の説明を挿入
    ステータスレジスタ1(TIM1_SR1)
    ここに画像の説明を挿入
    貨物拒否イベントが発生すると、ステータスレジスタ1(TIM1_SR1)の対応するCCxIFフラグビットが「1」に設定され、カウント値がキャプチャされたことを示します。キャプチャ/比較レジスタ(TIM1_CCRx)。
    ここに画像の説明を挿入
    ステータスレジスタ1(TIM1_SR1)のCCxIFフラグが "1"に設定され、別のキャプチャイベントが発生すると、ステータスレジスタ2(TIM1_SR2)のCCxOFが1に設定され、キャプチャイベントが繰り返し発生したことを示します。
    ここに画像の説明を挿入

2.入力キャプチャモードの概要

入力キャプチャモードでは、ICi信号の対応するエッジが検出されると、カウンタの現在の値がキャプチャ/比較レジスタ
(TIM1_CCRx)にラッチされます。キャプチャイベントが発生すると、対応するCCiIFフラグ(TIM1_SRレジスタ)が設定されます。
TIM1_IERレジスタのCCiIEビットがセットされている場合、つまり割り込みが有効になっている場合、割り込み要求が生成されます。キャプチャ
イベントが発生したときにCCiIFフラグがすでにハイの場合、繰り返しキャプチャフラグCCiOF(TIM1_SR2レジスタ)は1に設定されます。CCiIF = 0を書き込む
か、TIM1_CCRiLレジスタに格納されているキャプチャされたデータを読み取ると、CCiIFをクリアできます。CCiOF = 0を書き込んで、CCiOFをクリアします。
次の例は、TI1入力の立ち上がりエッジでTIM1_CCR1レジスタへのカウンタ値をキャプチャする方法を示しています。手順は次のとおりです。

  1. 有効な入力端子を選択してください。たとえば、TIM1_CCR1がTI1入力に接続されているため、
    CC1S = 01がTIM1_CCR1レジスタに書き込まれます。このとき、チャネルは入力として構成され、TIM1_CCR1レジスタは読み取り専用になります。
  2. 入力信号TIiの特性に応じて、TIM1_CCMRiレジスタのICiFビットを構成すること
    により、対応する入力フィルタのフィルタ時間を設定できます5つのクロックサイクルの最大内、入力信号のジッタを仮定すると、我々は、フィルタ設定する必要があります
    5つのクロックサイクルよりも長くなるように帯域幅をので、我々は、である、TI1上の真のエッジ遷移を確認するために、連続8回サンプリングできる
    TIMi_CCMR1にレジスタにIC1F = 0011を書き込みます。この時点で、信号は8つの同一のTI1信号が連続的にサンプリングされた場合にのみ
    有効なります(サンプリング周波数はf MASTERです)。
  3. TI1チャネルの実効変換エッジを選択し、CC1P = 0(立ち上がりエッジ)をTIM1_CCER1レジスタに書き込みます。
  4. 入力プリスケーラを設定します。この例では、有効なレベル遷移の瞬間ごとにキャプチャを実行する必要があるため、
    プリスケーラは無効になっています(TIM1_CCMR1レジスタにIC1PS = 00を書き込みます)。
  5. TIM1_CCER1レジスタでCC1E = 1を設定して、キャプチャカウンタの値をキャプチャレジスタにキャプチャできるようにします。
  6. 必要に応じて、TIM1_IERレジスタのCC1IEビットをセットして、関連する割り込み要求を有効にします。
    入力キャプチャが発生すると、次のようになります。
    ●有効なレベル遷移が発生すると、カウンタの値がTIM1_CCR1レジスタに転送されます。
    ●CC1IFフラグが設定されています(割り込みフラグ)。少なくとも2つの連続したキャプチャが発生し、CC1IFがクリアされていない場合、
    CC1OFも1に設定されます。
    ●CC1IEビットがセットされている場合、割り込みが生成されます。
    キャプチャオーバーフロー(CC1OFビット)に対処するために、再キャプチャフラグを読み取る前にデータを読み取ることをお勧めします。これは
    、キャプチャオーバーフローフラグが読み取られた後、データが読み取られる前に生成される可能性のある再キャプチャ情報が失われないようにするためです。読んだ。
1)PWM入力信号測定

このモードは、入力キャプチャモードの特殊なケースですが、次の違いを除いて、動作は入力キャプチャモードと同じです。
●2つのICI信号が同じTIi入力にマッピングされます。
●2つのICi信号の有効なエッジは、反対の極性を持っています。
●TIiFP信号の1つがトリガー入力信号として使用され、トリガーモードコントローラーがトリガーモードをリセットするように構成されています。

2)PWM信号の周期測定例

たとえば、TI1に入力されたPWM信号の周期(TIM1_CCR1レジスタ)とデューティサイクル(TIM1_CCR2レジスタ)は次のように測定できます。(f MASTERの周波数とプリスケーラの値に依存します)

  1. TIM1_CCR1の有効な入力を選択します。TIM1_CCMR1レジスタにCC1S = 01を設定します(TI1を選択します)。
  2. TI1FP1の有効な極性を選択します(TIM1_CCR1にデータをキャプチャし、カウンタをクリアするために使用されます):CC1P = 0(立ち上がりエッジで
    有効)に設定します。
  3. TIM1_CCR2の有効な入力を選択します。TIM1_CCMR2レジスタにCC2S = 10を設定します(TI1FP2を選択します)。
  4. TI1FP2の有効な極性を選択します(データをTIM1_CCR2にキャプチャします):CC2P = 1(立ち下がりエッジが有効)に設定します。
  5. 有効なトリガー入力信号を選択します。TIM1_SMCRレジスタにTS = 101を設定します(TI1FP1を選択します)。
  6. トリガーモードをリセットするようにトリガーモードコントローラーを構成します。TIM1_SMCRでSMS = 100を設定します。
  7. キャプチャを有効にする:TIM1_CCER1レジスタにCC1E = 1およびCC2E = 1を設定します。
    ここに画像の説明を挿入

3.入力キャプチャ測定の初期化の一般的なプロセス

  1. 特定の入力チャネル、キャプチャ/比較モードレジスタ(TIM1_CCMRx)の両方のCCxS [1:0]ビットを設定します。
    ここに画像の説明を挿入
  2. 信号のサンプリングレートとフィルタ、つまりキャプチャ/比較モードレジスタ(TIM1_CCMRx)のICxF [3:0]ビットを設定します。
    ここに画像の説明を挿入
  3. 信号エッジの極性を設定します。これは、キャプチャ/比較イネーブルレジスタ(TIM1_CCERx)のCCxPビットを設定するためのものです。
    ここに画像の説明を挿入
  4. キャプチャ/比較モードレジスタ(TIM1_CCMRx)のIC1PSC [1:0]ビットである信号事前割り当て係数を設定します。
    ここに画像の説明を挿入
  5. キャプチャ/比較イネーブルレジスタ(TIM1_CCERx)のCCxEビットを設定するキャプチャ機能を有効にします。
    ここに画像の説明を挿入

4.参照コード

2つの初期化方法:

/****************************************************************/
//TIM1功能初始化函数my_init(),无形参,无返回值
/****************************************************************/
void my_init(void)
{
   //1.CC1通道被配置为输入,IC1映射在TI1FP1上“CC1S[1:0]=01”
  TIM1_CCMR1|=0x01;
  //2.配置信号边沿极性为TI1F或TI2F的低电平或下降沿“CC1P=1”
   TIM1_CCER1&=0xFD;    //上升沿
   
  //3.CC2通道被配置为输入,IC2映射在TI1FP2上“CC2S[1:0]=10”
  TIM1_CCMR2|=0x02;
  //4.配置TI1FP2信号边沿极性为下降沿“CC2P=1”
  TIM1_CCER1|=0x20; 
   
   
  //5.配置采样率为主时钟频率,无滤波器“IC1F[3:0]=0000”
  TIM1_CCMR1&=0x0F;
  //6.配置输入/捕获1通道预分频器因子为8分频“IC1PSC[1:0]=11”
  TIM1_CCMR1|=0x0C;
  //7.使能TIM1_CH1输入捕获功能“CC1E=1”
  TIM1_CCER1|=0x01;
  //8.使能TIM1计数器功能“CEN=1”
  TIM1_CR1|=0x01;

}

/****************************************************************/
//TIM1功能初始化函数TIM1_init(),无形参,无返回值
/****************************************************************/
void TIM1_init(void)
{
  //1.CC1通道被配置为输入,IC1映射在TI1FP1上“CC1S[1:0]=01”
  // 0x000000001 : CC1通道被配置为输入,IC1映射在TI1FP1上;
  TIM1_CCMR1|=0x01;
  
  //2.配置TI1FP1信号边沿极性为上升沿“CC1P=0”
  // 0x11111101 : 捕获发生在TI1F或TI2F的上升沿;
  TIM1_CCER1&=0xFD;
  
  //3.CC2通道被配置为输入,IC2映射在TI1FP2上“CC2S[1:0]=10”
  // 0x00000010 : CC2通道被配置为输入,IC1映射在TI2FP2上;
  TIM1_CCMR2|=0x02;
  
  //4.配置TI1FP2信号边沿极性为下降沿“CC2P=1”
  // 0x00100000 : 1:捕获发生在TI1F或TI2F的下降沿
  TIM1_CCER1|=0x20; 
  
  //5.配置触发输入信号为TI1FP1,“TS[2:0]=101”
  // 0x01010000 : 选择用于选择同步计数器的触发输入,滤波后的定时器输入1(TI1FP1)
  TIM1_SMCR|=0x50;
  
  //6.配置触发模式为复位触发,“SMS[2:0]=100”
  // 0x00000100 : 复位模式 – 在选中的触发输入(TRGI)的上升沿时重新初始化计数器,并且产生一个更新寄存器的信号
  TIM1_SMCR|=0x04;
  
  //7.使能TIM1计数器功能“CEN=1”
  TIM1_CR1|=0x01;
  
  //没有设置在外部触发寄存器(TIM1_ETR)中的采样频率
}

おすすめ

転載: blog.csdn.net/weixin_44751294/article/details/110685476