パルス生成を、TIM1/TIM2/TIM3/TIM4 でやる方法を比較する

TIM1をつかってパルス信号を外部に出力する方法はすでに解説しました.

TIM2,TIM3,TIM4ではどうやるのでしょうか?

残念ながら、TIM4では外部に出力することはできません.TIM4の出力ピンは存在しないのです.

TIM2,TIM3でなら可能ですが、TIM1ほどは多機能ではありません.
TIM1でできるけどTIM2,TIM3でできないことは、
●コンプリメンタリ出力できません
●デッドタイムできません
●プリスケーラが2のべき乗だけしかできません

では、そのやりかたを解説します.


ハードウエア仕様

タイマが出力できるのは下記が全てです.

出力アサイン
出力
GPIO
出力
ピン
STM8S-DISCOVERY
のコネクタ
備考
ソースコード
で決まる
duty比
TIM1
TIM1_CH1 PC1
26
CN2-2
基板上のSB3のジャンパ変更が必要   ※110%
TIM1_CH1N   (TIM1_CH1のコンプリメンタリ) PB0
22
CN3-10 option byte書き換えが必要   ※390%
TIM1_CH2 PC2
27
CN2-3

30%
TIM1_CH2N   (TIM1_CH2のコンプリメンタリ) PB1
21
CN3-9
option byte書き換えが必要   ※370%
TIM1_CH3 PC3
28
CN2-4
基板上のSB4のジャンパ変更が必要   ※260%
TIM1_CH3N   (TIM1_CH3のコンプリメンタリ) PB2
20
CN3-8
option byte書き換えが必要   ※340%
TIM1_CH4 (コンプリメンタリ出力はできません)
PC4
29
CN2-5

90%
TIM2
TIM2_CH1 (コンプリメンタリ出力はできません) PD4
45
CN4-9

10%
TIM2_CH2 (コンプリメンタリ出力はできません) PD3
44
CN4-8

30%
TIM2_CH3 (コンプリメンタリ出力はできません) PA3
9
CN1-9
TIM2にはコンパレータが3つだけです
60%
TIM3
TIM3_CH1 (コンプリメンタリ出力はできません) PD2
43
CN4-7

10%
TIM3_CH2 (コンプリメンタリ出力はできません) PD0
41
CN4-5
TIM3にはコンパレータが2つだけです.
LEDが接続されています.
30%
TIM4
出力できません


なし




※1   オリジナルのSTM8S-DISCOVERY基板はTIM1_CH1はタッチパネル機能に使われており、オリジナルではCN2-2に接続されていません.
ハンダごてで改造が必要です.
下の写真のようにSB3のハンダジャンパーを付け替えてください.
写真がわかりにくいかもですが、@ABと3つのランドが並んでいるとして、@+Aをハンダでショートさせています.
(オリジナルのSTM8S-DISCOVERYではA+Bがハンダショートされています)
この改造によってTIM1_CH1がCN2-2に接続されます.

※2  オリジナルのSTM8S-DISCOVERY基板はTIM1_CH3はタッチパネル機能に使われており、オリジナルではCN2-4に接続されていません.
ハンダごてで改造が必要です.
下の写真のようにSB4のハンダジャンパーを付け替えてください.
写真がわかりにくいかもですが、@ABと3つのランドが並んでいるとして、A+Bをハンダでショートさせています.
(オリジナルのSTM8S-DISCOVERYでは@+Aがハンダショートされています)
この改造によってTIM1_CH3がCN2-4に接続されます.

この写真は改造後です.


※3   PB0にTIM1_CH1Nをアサインするためには、option byteを書き換えなくてはいけません.
option byteのつぎの箇所を書き換えます.option byteの書き換え方法はこちらのページです.
PB1にTIM1_CH2N、PB2にTIM1_CH3Nのアサインも下記の操作で一括して行えます)
before

after




ソースコードの解説

サンプルプログラムをこちらに置きます.

以下はmain.cです.

●#include "stm8s.h"
ライブラリを使うためにインクルードします.

●CLK_ClockSwitchConfig ( CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE );
特にこだわりはありませんが、ここでは外部接続の水晶発振子をクロックの源発振とします.(HSE)

●TIM1_DeInit();
TIM1_TimeBaseInit( 15, TIM1_COUNTERMODE_UP, 1000, 0 );
タイマ1のカウンタの設定です.
16MHzを16分周して、さらに0〜1000までカウントするように設定します.
結果として1kHzのパルスが出るようになります.
#ホントは999にするべきでしたね  orz

●TIM1_OC1Init( TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 100, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_SET );
タイマ1には、4つのコンパレータが装備されています.
これはOutPut Comparater 1の設定です.TIM1_CH1とTIM1_CH1Nに出力されます.
詳しくは、任意のdutyのパルスを発生させる方法を解説したこちらのページを参照してください.
要点としては、コンプリメンタリ出力で、100になったらトグルさせてくれってなことを設定しています.
したがって、TIM1_CH1には10%dutyのパルスが出ます.TIM1_CH1Nには90%dutyのパルスが出ます.

●TIM1_OC2Init( TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 300, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_SET );
タイマ1が持つ2番目のコンパレータ
OutPut Comparater 2の設定です.
TIM1_CH2とTIM1_CH2Nに出力されます.

要点としては、コンプリメンタリ出力で、300になったらトグルさせてくれってなことを設定しています.
したがって、TIM1_CH2には30%dutyのパルスが出ます.TIM1_CH2Nには70%dutyのパルスが出ます.


●TIM1_OC3Init( TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 600, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET, TIM1_OCNIDLESTATE_SET );
タイマ1が持つ3番目のコンパレータ OutPut Comparater 3の設定です.
TIM1_CH3とTIM1_CH3Nに出力されます.

要点としては、コンプリメンタリ出力で、600になったらトグルさせてくれってなことを設定しています.
したがって、TIM1_CH3には60%dutyのパルスが出ます.TIM1_CH3Nには40%dutyのパルスが出ます.

●TIM1_OC4Init( TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, 900, TIM1_OCPOLARITY_HIGH, TIM1_OCIDLESTATE_RESET );
タイマ1が持つ4番目のコンパレータ OutPut Comparater 4の設定です.
TIM1_CH4に出力されます.
TIM4はコンプリメンタリ出力はできません.

要点としては、コンプリメンタリ出力で、900になったらトグルさせてくれってなことを設定しています.
したがって、TIM1_CH4には90%dutyのパルスが出ます.


●TIM1_BDTRConfig( TIM1_OSSISTATE_ENABLE, TIM1_LOCKLEVEL_OFF, 0xff, TIM1_BREAK_DISABLE, TIM1_BREAKPOLARITY_LOW, TIM1_AUTOMATICOUTPUT_ENABLE);
デッドタイムの設定をしています.デッドタイムについてはこちらのページを参照してください.

●TIM2_DeInit();
TIM2_TimeBaseInit( TIM2_PRESCALER_16, 1000 );
タイマ2の設定をします.
タイマ2は、プリスケーラ設定が2のべき乗しかできません.(下記)
ここでは、16MHzを16分周して1000カウントするので、結果として1kHzのパルスを発生させます.
    TIM2_PRESCALER_1  
    TIM2_PRESCALER_2  
    TIM2_PRESCALER_4  
    TIM2_PRESCALER_8  
    TIM2_PRESCALER_16  
    TIM2_PRESCALER_32  
    TIM2_PRESCALER_64  
    TIM2_PRESCALER_128  
    TIM2_PRESCALER_256  
    TIM2_PRESCALER_512  
    TIM2_PRESCALER_1024  
    TIM2_PRESCALER_2048  
    TIM2_PRESCALER_4096  
    TIM2_PRESCALER_8192  
    TIM2_PRESCALER_16384  
    TIM2_PRESCALER_32768  

●TIM2_OC1Init( TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 100, TIM2_OCPOLARITY_HIGH );
タイマ2は、3つのコンパレータを装備しています.
これはOutput Comparater 1の設定です.
100カウントしたところで、出力をトグルしてくれと設定しています.
その結果、10%dutyのパルスがTIM2_CH1に出ます.
タイマ2には、コンプリメンタリ出力機能はありません.
タイマ2には、デッドタイム機能はありません.

●TIM2_OC2Init( TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 300, TIM2_OCPOLARITY_HIGH );
これはOutput Comparater 2の設定です.
300カウントしたところで、出力をトグルしてくれと設定しています.
その結果、30%dutyのパルスがTIM2_CH2に出ます.

●TIM2_OC3Init( TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 600, TIM2_OCPOLARITY_HIGH );
これはOutput Comparater 3の設定です.
600カウントしたところで、出力をトグルしてくれと設定しています.
その結果、60%dutyのパルスがTIM2_CH3に出ます.


●TIM3_DeInit();
TIM3_TimeBaseInit( TIM3_PRESCALER_16, 1000 );
TIM3_OC1Init( TIM3_OCMODE_PWM1, TIM3_OUTPUTSTATE_ENABLE, 100, TIM3_OCPOLARITY_HIGH );
TIM3_OC2Init( TIM3_OCMODE_PWM1, TIM3_OUTPUTSTATE_ENABLE, 300, TIM3_OCPOLARITY_HIGH );
TIM3_Cmd(ENABLE);
タイマ3の設定です.
考え方はタイマ2と同じです.
ただし、タイマ3には、コンパレータが2つしかありません



実行結果

解説は省きますが、ソースコードの設定通りの波形が出ています.


inserted by FC2 system