TIM1は外部信号を受信する.外部信号の周波数を測定する
  ----時間測定のやりかた----

この解説にはかなーり根性がいります.ソースコードが複雑になるんです.

なぜか?

測定するということは、マイコン内部の数値情報を外部表示装置に出力しなければなりません.
それが大変なのです.だってSTM8S-DISCOVERYには表示装置がついてないですからね.

では外部表示装置を何にするか?

この連載はゆくゆくはLCDを取り付けるつもりですが、いまのところそれはまだです.
すでにUARTでPCと通信する例を示しているので、ここでも測定結果をUARTでPCに表示させることにします.

とすると、UARTのコードがたくさん追加されるので、ソースコードは増大し、解説するのも理解するのも大変だというわけです.
UARTのソースコードの解説はあまり詳しくせずに、UARTはブラックボックス的に扱い、なるべくタイマーによる時間測定に絞った解説をしようと思います.



仕様を決める

どんなことをできるようにするか?

パルス発振器機能
周波数
1kHz
デューティ
30%
周波数カウンタ機能
周波数表示
約1秒毎に表示
デューティ表示
約1秒毎に表示
表示
PCのTerminal soft画面

COM PORT パラメータ
115200bps  8bit  odd-parity
周波数表示インジケータ
LED

STM8S内部回路構成
TIM1
周期測定回路
外部ピンのアサインはSTM8S105C6のハードウエア的に次のように決められています.
TIM1_CH1  PC1 (26pin) (CN2-2) へ測定したい信号を入力する.
(実験的に TIM1_CH2  PC2 (27pin) (CN2-3) でも試してみる)
割り込みあり
TIM2
パルス発振器回路
外部ピンのアサインはSTM8S105C6のハードウエア的に次のように決められています.
TIM2_CH1  PD4 (45pin) (CN4-9)   正出力
TIM2_CH2  PD3 (44pin) (CN4-8)   負出力

TIM3
PCのTerminal画面へ表示するインターバル

割り込みあり
UART
PCとの通信用
外部ピンのアサインはSTM8S105C6のハードウエア的に次のように決められています.
UART2_RX  PD6  (47pin)
UART2_TX  PD5  (46pin)
割り込みあり
clock
内部16MHzを使用(HSI)
16MHz


総合ブロック図
周期測定回路とパルス発振器の注意点は、TIM2によるパルス発振出力を、そのままTIM1の周期測定入力に接続していることです.
つまり、STM8Sで生成した1kHzを、STM8Sで測定し直すという回路になっています.
具体的には、
TIM1_CH1  PC1 (26pin) (CN2-2)が周期測定回路の入力ピンです.
そこへ、パルス発振器の出力
TIM2_CH1  PD4 (45pin) (CN4-9) を接続するというわけです.

UARTでPCと通信するとはどういうことか?
STM8S-DISCOVERYのUARTは、PCのCOM PORTに接続し通信するための回路です.
しかし、今のPCにはCOM PORTは付いてないので、FT232というICでUSBに変換します.
そして、USBケーブルでPCに接続します.
PCではTerminalソフトをつかって通信します.
したがって、PCを操作する人間から見えるのは、terminal ソフトという通信アプリの画面です.


割り込み構成
TIM1 input capture割り込み
12番
外部ピンに入力されるパルス信号の周期をカウントする.
パルス信号の1周期ごとに割り込みをかける.
TIM1を利用するので、16bitカウンタで、クロックは16MHzである.
測定値は、1周期の長さと、HIGH区間の長さである.
割り込みがかかるごとに、測定結果をTIM1_ICvalueという名の変数に格納する.
__________|~~~~~~~|_______________|~~~~~~~|__________
          <----------------------->  TIM1_ICvalue1
          <------->   TIM1_ICvalue2
TIM3 update割り込み
15番
PC上のterminal画面へ表示するインターバルを発生させる約1秒のタイマ.
ここでは、16MHz÷1024÷10000=1.54Hz の割り込みを発生させる.
UART受信割り込み
21番
UARTが文字を受信したら割り込みをかける.


ハードウエアの準備

@USBシリアル変換回路
まず、UARTをUSBに変換する回路を、STM8S-DISCOVERYにどうやって取り付けるかを説明します.
秋月のUSBシリアル変換基板をSTM8S-DISCOVERYに取り付けます.
回路図は下記です.配線は下記回路図の4本です.
●STM8SのPD5とPD6には、UARTの送信信号と受信信号が出てきますので、それをUSBシリア ル基板に配線しています.
STM8S-DISCOVERYでは、電源はFLASH焼き回路から5V or 3.3Vが供給されますが、これを切断し、USBシリアル変換基板から3.3Vが供給されるようにします.
そのために、ジャンパーをつぎの1)2)のように設定 してください.
  1) USBシリアル変換基板のジャンパーピンは、下図の赤色の位置にします.
  2) STM8S-DISCOVERYのJP1のジャンパーピンは、外しておきます.



USBシリアル変換基板の取付完了状態はこのようになります.
右の黄色の囲いがUSBシリアル変換回路です.同基板に刺さっているMini-USBがPCのUSBへ行きます.
中央の水色の囲いがSTM8Sマイコンです.USBシリアル変換回路と配線されています.
左の赤い囲いは、ブロック図には描きませんでしたがSTM8Sを焼くために必須な回路です.同基板に刺さっているUSBケーブルは、STM8Sを焼くためのケーブルです.やはりPCに接続します.
この回路は、PCのUSBポートを都合2ヶ占有することになります.


プログラムを焼いてしまえば、焼き用のUSBケーブルは不要になるわけで、下図のようにUSBを外してしまいたくなるのが人情です.
ところが、USBケーブルを外しただけでは、STM8Sにリセットがかかってしまって動かなくなってしまいます.
そこで、下の写真の○の中にあるSB1とSB2をハンダごてでOPENにしてやればリセット線が切断されるので、STM8Sが動きます.
この方法は憶えておきましょう.



ATIM1_CH1の改造
STM8S-DISCOVERY基板のオリジナルではTIM1_CH1はタッチパネル機能に使われており、CN2-2に接続されていません.
ハンダごてで改造が必要です.
下の写真のようにSB3のハンダジャンパーを付け替えてください.
写真がわかりにくいかもですが、

@ABと3つのランドが並んでいるとして、オリジナルのSTM8S-DISCOVERYではA+Bがハンダショートされています.
これを変更し@+Aをハンダでショートさせます.
そうすることでTIM1_CH1がCN2-2に接続されます.
この写真は改造後です.


B
周期測定回路の入力ピンとパルス発振器の出力ピンを接続する
最後に、STM8S-DISCOVERY上で周期測定回路とパルス発振器を接続します.
  −TIM1_CH1  PC1 (26pin) (CN2-2) が周期測定回路の入力ピン
  −
TIM2_CH1  PD4 (45pin) (CN4-9) がパルス発振器の出力ピン
この両者を接続します.



ソースコードの解説

サンプルプログラムをこちらに置いてありますので、DLしてください.

下記で解説するソースコードはtest07というprojectです.active projectはこのようにして変更します.


ソースコードは、main.c と usrlib-uart.c の2つです.
usrlib-uart.cはUART関連ルーチンだけをまとめたソースファイルです.
ここでは、UARTの解説は割愛し、UARTルーチンはBlackBoxとして扱います.


以下でソースコード main.c の中身を解説します.

●#include "stdio.h"
#include "stm8s.h"
#include "usrlib-uart.h"
UARTへ送信する文字をつくるためにsprintf()を使いますので、stdio.hをインクルードします.
stm8s.hは、ライブラリを使うためのおきまりのインクルードです.
UARTを動かすルーチン usrlib-uart.c をつかうために、usrlib-uart.h をインクルードします.

#define fMASTER    16000000  // 16MHz
TIM1へ入力されるクロック周波数は16MHzなのでそれをdefineしておきます.

●CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);
CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV1 );
CLK_SYSCLKConfig( CLK_PRESCALER_CPUDIV1 );
クロック設定についてはこちらのページをみて思い出しましょう.
この設定ですと、内部16MHz(HSI)を、CPUにもタイマにも供給
するようになります.

GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST);
割り込みの度にLEDをチカチカさせます.そのためにPD0を出力に設定しています.

TIM1_DeInit();
周波数測定するTIM1の設定の開始です.念のためdefault値に設定しておきます.

●@TIM1_PrescalerConfig(0, TIM1_PSCRELOADMODE_UPDATE);
TIM1に入力されるクロックである16MHzを、分周するかどうかの設定をします.
下図の@のところを設定しているわけです.
第1引数が0なので、分周しません.したがってTIM1の16bitカウンタは16MHzのクロックで動きます.
第1引数は、0〜65535までの範囲を設定できます.0で分周なし、1で2分周、Nで(N+1)分周します.
第2引数は、
TIM1_PSCRELOADMODE_UPDATEを決め打ちでいいでしょう.

●A
TIM1_PWMIConfig(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0);
タイマーにはいろいろな使い方がありますが、周波数測定をすることを、STM8SのdocumentではPWM input signal measurementと呼称しています.
この関数は、TIM1を周波数測定機能に設定する根幹となる関数です.
下図のAの部分を設定しています.

第1引数 TIM1_CH1を入力ピンに設定しています
第2引数 positiveエッジでカウント開始に設定しています
第3引数 InputCapture1とInputCapture2を逆転させるような機能ですが、TIM1_ICSELECTION_DIRECTTI だけ憶えておけばいいでしょう
第4引数 割り込み頻度を下げたいときに使います.
周期測定をするときは、たいてい1周期毎に割り込みをかけます.
すると、TIM1_CH1に入力される信号が100Hzだったら10mSecごとに割り込みが発生しますが、10kHzだったら100uSecごとに割り込みが発生します.
しかし、100uSecごとに割り込み処理するのは無理です.STM8Sがそんなに高速に処理出来っこありません.
なので、TIM1_CH1に入力される信号を間引けば割り込み間隔も長くなって助かるわけです.
こういう処理の遅さはソフトウエアで処理する場合には避けようがありません.
どうしても100kHzの1周期毎にきっちりと測定したいなら、FPGAを使って純hardware処理するしかないでしょう.
さて、この引数の選択肢は、こうなっています.この引数は重要です.
TIM1_ICPSC_DIV1   間引きなし
TIM1_ICPSC_DIV2   1つ間引き    (2分周ではないので注意しましょう)
TIM1_ICPSC_DIV4   3つ間引き
TIM1_ICPSC_DIV8     7つ間引き

第5引数 外部ピンから入力した信号にはノイズが乗っていることがあるので、誤動作を避けるためにフィルタを挿入する場合にこの引数で設定します
 
0: フィルタなし
  1: fMASTERで2クロック後に再チェック
  2: fMASTERで4クロック後に再チェック
  3: fMASTERで8クロック後に再チェック
  4: fMASTER/2で6
クロック後に再チェック
  5: fMASTER/2で8クロック後に再チェック
  6: fMASTER/4で6クロック後に再チェック
  7: fMASTER/4で8クロック後に再チェック
  8: fMASTER/8で6クロック後に再チェック
  9: fMASTER/8で8クロック後に再チェック
10: fMASTER/16で5クロック後に再チェック
11: fMASTER/16で6クロック後に再チェック
12: fMASTER/16で8クロック後に再チェック
13: fMASTER/32で5クロック後に再チェック
14: fMASTER/32で6クロック後に再チェック
15: fMASTER/32で8クロック後に再チェック

●BTIM1_SelectInputTrigger( TIM1_TS_TI1FP1 );
上図のBのところを設定しています.
周期を測定するためには、カウンタが入力信号のエッジでクリアされてほしいわけです.
そのためにはまず、カウンタへTIM1_CH1由来の信号を注入したいわけです.
引数の
TIM1_TS_TI1FP1 だと上図のBのノードがカウンタへ信号が注入されます.

●CTIM1->SMCR = (TIM1->SMCR & ~TIM1_SMCR_SMS) | 0b100; // TIM1->SMCR->SMS=100 (Reset mode)
この行はライブラリ関数callではなくて、TIM1のレジスタをダイレクトにいじっています.
なぜかというと、ライブラリ関数に、ここをいじるのに適した関数がなさそうだったからです.
この設定の意図はこうです.
BでカウンタへTIM1_CH1由来の信号を注入するように設定しました.
ここでは、カウンタが入力信号のエッジでクリアされるように設定しています.
STM8S documentではReset modeと呼称されています.

TIM1_ITConfig(TIM1_IT_CC1, ENABLE);
引数のTIM1_IT_CC1は「InputCapture1で割り込みかけてね」という意味です.

TIM1_Cmd(ENABLE);
TIM1を動かします.

TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_1, 15999);
TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 4800, TIM2_OCPOLARITY_HIGH); // output TIM2_CH1 D4
TIM2_OC2Init(TIM2_OCMODE_PWM2, TIM2_OUTPUTSTATE_ENABLE, 4800, TIM2_OCPOLARITY_HIGH); // output TIM2_CH2 D3
TIM2_Cmd(ENABLE);
タイマはTIM1,2,3,4の4つあります.そのうちTIM2を発振器として活用するための設定です.
ただ発振するだけなので割り込みはかけません.  (TIM1でのパルス発振方法はこちらで解説してます)
やりたいのは、
1kHz 30% dutyのコンプリメンタリなパルスを出力することです.(下図)
上記の設定でどうしてこういう信号を発生させられるのかを説明しますと、
TIM2_TimeBaseInit(TIM2_PRESCALER_1, 15999)
この関数で16MHzを16000カウントします.
これで1kHzの三角波(下図青線)を発生させたことになります.
TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE, 4800, TIM2_OCPOLARITY_HIGH)
この関数で4800でコンパレートしてTIM2_CH1に出力することになります.duty30%です.(下図)
TIM2_OC2Init(TIM2_OCMODE_PWM2, TIM2_OUTPUTSTATE_ENABLE, 4800, TIM2_OCPOLARITY_HIGH)
この関数で4800でコンパレートしてTIM2_CH2に出力することになります.
第1引数が
TIM2_OCMODE_PWM2なのでTIM2_CH1のコンプリメンタリ信号がでます.(下図)
外部ピンは、STM8Sのハードウエアで決まっていまして
TIM2_CH1 PD4、TIM2_CH2 PD3 です.
この関数のいじり所としては、

TIM2_OUTPUTSTATE_DISABLE
にすれば何も出力されなくなります.
4800
を変えればdutyを変えられます.
TIM2_OCPOLARITY_LOW にすれば出力が反転されます.


TIM3_DeInit();
TIM3_TimeBaseInit(TIM3_PRESCALER_1024 , 10000); // 16MHz/1024/10001=1.56Hz
TIM3_ITConfig(TIM3_IT_UPDATE, ENABLE);
TIM3_Cmd(ENABLE);
このプログラムはタイマをたくさん使います.
TIM3はUARTに測定結果を送信するインターバルを発生させます.
TIM3_TimeBaseInit()の第1引数は、TIM1へ入ってくる16MHzクロックを1024分周してねと設定しています.
第2引数は、それを10001サイクルカウントせよと設定しています.
その結果、16MHz/1024/10000=1.56Hzでカウンタがグルグル回ります.
TIM3_ITConfig()はカウンタがoverflowしたら割り込みしてくれと設定しています.
ゆえに1.56HzでTerminalソフト画面に周波数測定結果が表示されることになります.
割り込みルーチンは後ででてきます.

UART2_DeInit();
UART2_Init((u32)115200, UART2_WORDLENGTH_9D, UART2_STOPBITS_1, UART2_PARITY_ODD, UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);   
UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);
UART2_Cmd(ENABLE);
UARTを使うための設定ですが、解説は割愛します.UARTについてはこちらのページを参照してください.

enableInterrupts();
割り込みを許可しています.

●sprintf(TXStr,"start\r\n");
SerialPutString(TXStr);
Terminalソフト画面に「start」という文字を表示しています.
SerialPutString()は、
usrlib-uart.c にソースコードがありますが、UARTの解説は割愛します.

void TIM1_IC_isr(void) interrupt 12
{
    TIM1_IC_value1 = TIM1_GetCapture1()+1;  // get value
    TIM1_IC_value2 = TIM1_GetCapture2()+1;  // get value
    TIM1_ClearFlag(TIM1_FLAG_CC1);
    TIM1_ClearFlag(TIM1_FLAG_CC2);
}
mainルーチンで「InputCapture1で割り込みかけてね」と設定しました.
これにより
TIM1が入力パルスの1サイクルごとに割り込みをかけますと、このルーチンに飛んできます.
TIM1によるこのタイプの割り込みは12番だと決まっているので、interrupt 12と書いてあります.
やっていることはシンプルです.
InputCapture1の値を、変数
TIM1_IC_value1に格納します.
InputCapture2の値を、変数TIM1_IC_value2に格納します.
割り込みフラグをクリアします.

void TIM3_Update_isr(void) interrupt 15
mainルーチンで「1.56Hzで割り込みかけてね」と設定しました.
これによりTIM3が割り込みをかけますと、このルーチンに飛んできます.
TIM1によるこのタイプの割り込みは15番だと決まっているので、interrupt 15と書いてあります.
やってることは、周波数をdutyを計算してUART経由でTerminalソフトに向けて送信することです.

GPIO_WriteReverse(GPIOD,GPIO_PIN_0); // int freq monitor CN4-1pin
表示毎にLEDをオンオフさせています.

MEASURED_HZ = (float)fMASTER / (float)TIM1_IC_value1;
MEASURED_DUTY = (float)TIM1_IC_value2 / (float)TIM1_IC_value1 * 100.0 ;
周波数とdutyを浮動小数点計算しています.

sprintf(TXStr,"MEAS: %9.2f[Hz] %5.2f[pct]",MEASURED_HZ,MEASURED_DUTY);
SerialPutString(TXStr);
sprintf(TXStr," TIM1_IC_value1=%u  TIM1_IC_value2=%u",TIM1_IC_value1,TIM1_IC_value2);
SerialPutString(TXStr);
SerialPutString("\r\n");
UART経由でTerminalソフトに向けて計算結果を送信しています.

TIM3_ClearFlag(TIM3_FLAG_UPDATE);
割り込みフラグをクリアします.
これを怠ると次回の割り込みがかかりません.



TIM1の設定のキモのところを詳細に解説

mainルーチンでTIM1を設定した@ABCについて、サンプルプログラムで動作を理解しましょう.

test07

上で解説した設定と同じです.ソースコードの解説は省略します.
@TIM1_PrescalerConfig(0, TIM1_PSCRELOADMODE_UPDATE);

ATIM1_PWMIConfig(TIM1_CHANNEL_1, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0);
BTIM1_SelectInputTrigger( TIM1_TS_TI1FP1 );
CTIM1->SMCR = (TIM1->SMCR & ~TIM1_SMCR_SMS) | 0b100; // TIM1->SMCR->SMS=100 (Reset mode)


パルス信号入力端子=TIM1_CH1


Terminal soft画面の表示
MEAS:   1000.00[Hz] 29.99[pct] TIM1_IC_value1=16000  TIM1_IC_value2=4799
MEAS:   1000.00[Hz] 29.99[pct] TIM1_IC_value1=16000  TIM1_IC_value2=4799
MEAS:   1000.00[Hz] 29.99[pct] TI
M1_IC_value1=16000  TIM1_IC_value2=4799

動作原理
16bitカウンタが入力パルス信号のpositive edgeでクリアされます.
1kHzなので、16000カウントまで到達します.
InputCapture1には16000が保存されます.
InputCapture2には入力パルス信号のnegative edgeで保存されますので4800が保存されます.


test07b
赤字のところを改造しました.
@TIM1_PrescalerConfig(0, TIM1_PSCRELOADMODE_UPDATE);
ATIM1_PWMIConfig(TIM1_CHANNEL_2, TIM1_ICPOLARITY_RISING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0);
BTIM1_SelectInputTrigger( TIM1_TS_TI2FP2 );
CTIM1->SMCR = (TIM1->SMCR & ~TIM1_SMCR_SMS) | 0b100; // TIM1->SMCR->SMS=100 (Reset mode)


パルス信号入力
端子TIM1_CH2

Terminal soft画面の表示
MEAS:   3334.03[Hz] 333.38[pct] TIM1_IC_value1=4799  TIM1_IC_value2=15999
MEAS:   3334.03[Hz] 333.38[pct] TIM1_IC_value1=4799  TIM1_IC_value2=15999
MEAS:   3334.03[Hz] 333.38[pct] TIM1_IC_value1=4799  TIM1_IC_value2=15999

動作原理
入力端子がTIM1_CH2に変わります.@
カウンタへのクリア信号をTIM1_CH2
由来の信号にすげ替えます.A
InputCapture2には16000が保存されます.
InputCapture1には入力パルス信号のnegative edgeで保存されますので4800が保存されます.
InputCapture1,2の働きが逆転した結果、周波数表示とduty表示が破綻していますが、あえてそのままにしてあります.

注意
入力端子がTIM1_CH2
PC2 (27pin) (CN2-3) に変わったので、配線もこのように変更してから動作させる必要があります.



test07c
赤字のところを改造しました.
@TIM1_PrescalerConfig(0, TIM1_PSCRELOADMODE_UPDATE);
ATIM1_PWMIConfig(TIM1_CHANNEL_1, TIM1_ICPOLARITY_FALLING, TIM1_ICSELECTION_DIRECTTI, TIM1_ICPSC_DIV1, 0);
BTIM1_SelectInputTrigger( TIM1_TS_TI1FP1 );
CTIM1->SMCR = (TIM1->SMCR & ~TIM1_SMCR_SMS) | 0b100; // TIM1->SMCR->SMS=100 (Reset mode)


パルス信号入力端子TIM1_CH1

Terminal soft画面の表示
MEAS:   1000.00[Hz] 70.00[pct] TIM1_IC_value1=16000  TIM1_IC_value2=11200
MEAS:   1000.00[Hz] 70.00[pct] TIM1_IC_value1=16000  TIM1_IC_value2=11200
MEAS:   1000.00[Hz] 70.00[pct] TIM1_IC_value1=16000  TIM1_IC_value2=11200

動作原理
入力端子をTIM1_CH1に戻しました.
入力
パルス信号を反転しました.その結果、
negative edgeでカウンタが動作するようになります.
InputCapture1には16000が保存されます.
InputCapture2には入力パルス信号のpositive edgeで保存されますので11200が保存されます.
InputCapture2の働きが変わった結果、duty表示が破綻していますが、あえてそのままにしてあります.

注意
入力端子をTIM1_CH1に戻したので、配線もこのように戻しましょう.




TIM1の周波数測定機能についてのQ&A

Q: TIM1_CH1に入力した信号の周期測定するのはわかったが、TIM1_CH2,CH3,CH4ではできないのか?

A1: TIM1_CH2を入力にするケースは、test07b で示したとおり、できます.
ただし、
TIM1_IC_value1 と TIM1_IC_value2 の値が逆になってしまうので、プログラムで逆扱いしてやる小細工は必要ですが.

A2: TIM1_CH3を入力にするのは、オススメしません.
もちろんやればできるのですが、ライブラリ関数の
TIM1_PWMIConfig()が、CH1とCH2を設定する機能しか持ってないんです.
なので、CH3を入力にするなら、
TIM1_PWMIConfig()をCH3用に書き換えればできます.
でもそこまでしてCH3を使う必要性はないと思います.


A3: TIM_CH4についてもCH3と同様のことがいえます.オススメしません.

Q: TIM1_CH1に入力した信号を、Input Capture1 と Input Capture2 に振り分けて周期とdutyを測定する方法はわかったが、
TIM1_CH1に入力した信号を、Input Capture3 と Input Capture4 に振り分けて測定することはできるのか?

A: できません.STM8Sのハードウエア的に不可能です.
STM8Sのハードウエアは、つぎのどれかしかできません.
  TIM1_CH1 ---> InputCapture1,2 へ
  TIM2_CH2 ---> InputCapture1,2 へ
  TIM1_CH3 ---> InputCapture3,4 へ
  TIM1_CH4 ---> InputCapture3,4 へ
CH1とCH2が一蓮托生的で、CH3とCH4が一蓮托生的です.

inserted by FC2 system