/********************************************************** ITU4でクロック信号のH区間デューティ比を測定する。 またITU3で任意のデューティ比をつくり検証する
ITU4でinputcapture (周期とH区間長さを測定) ITU3でPWM(for
debug)
設定 ITU4のインプットキャプチャ+バッファを使用 TIOCAとTIOCBに同じ信号を入力 GRAは両エッジでインプットキャプチャ GRBは立上りでインプットキャプチャ インプットキャプチャBでカウンタクリア インプットキャプチャBで割り込み 割り込み時には BRAにHigh区間の長さが入る GRBに周期が入る この2つよりデューティ比がわかる
Time Chart TIOCA
______|~~~~~~~~~~|_____________|~~~~~~~~~~|___
^P1
^Q1
^P2
^Q2 TCNT CLR > >
up > > > > > > > CLR > > up
> GRA |
N at P1 | N at Q1 | N at P2
| BRA | N
at Q0 | N at P1 | N at Q1
| GRB
| N at
P1
| N at P2
^interrupt
^interrupt
**********************************************************/ #include
<3048fone.h> #include "h8_3048fone.h"
/*clockindex
0:φ,1:φ/2,2:φ/4,3:φ/8*/ /*pwmmax
*/ /* 10
0.4 0.8
1.6 3.2 [μsec]*/ /*
20 0.8
1.6 3.2 6.4
*/ /* 50
2
4
8 16 */ /*
100 4
8 16
32 */ /* 200
8 16
32 64 */ /*
500 20
40 80
160 */ /* 1000
40 80
160 320 */ /*
2000 80
160 320
640 */ /* 5000
200 400
800 1600 */ /*
10000 400 800
1600 3200 */ /*
20000 800 1600
3200 6400 */ /* 50000
2000 4000 8000
16000 */
/* 割り込みベクタ IMIB4 41
0xA4-0xA7
入力端子 測定したい波形を,以下の2つの端子に入力する 4
TIOCA4/TP10/PB2 CN1-18 5 TIOCB4/TP11/PB3
CN1-19 */ /*デューティ比測定のための初期化*/ void initMeasDuty(int
clockindex) { ITU4.TCR.BIT.TPSC=clockindex;
/*0:φ,1:φ/2,2:φ/4,3:φ/8*/ ITU4.TCR.BIT.CCLR=2;
/*GRBのインプットキャプチャでカウンタクリア*/ ITU4.TIOR.BIT.IOA=7;
/*GRAは立上/立下の両エッジでインプットキャプチャ*/ ITU4.TIOR.BIT.IOB=4;
/*GRBは立上のエッジでインプットキャプチャ*/ ITU.TFCR.BIT.BFA4=1;
/*GRA4とBRA4はバッファ動作*/ ITU4.TSR.BIT.IMFB=0;
/*GRBコンペアマッチフラッグクリア*/ ITU4.TIER.BIT.IMIEB=1;
/*IMFBフラグによる割込みを許可*/ ITU.TSTR.BIT.STR4=1;
/*ITU4スタート*/ }
#define readPeriod()
(ITU4.GRB) #define readHigh() (ITU4.BRA)
/*検査用PWM出力*/ /*出力端子 2
ITOCA3/PB0 CN1-16*/
/*ITU channel3 でPWM出力*/ void
initPWM3(unsigned short int pwmmax, int
clockindex) { ITU3.TCR.BIT.TPSC=clockindex;
/*内部クロックφでカウント*/ ITU3.TCR.BIT.CKEG=0;
/*立ち上がりエッジでカウント*/ ITU3.TCR.BIT.CCLR=1;
/*GRAのコンペアマッチでTCNTをクリア*/
ITU3.GRA=pwmmax-1;
/*GRAの値(GRB=GRAのときPWMが100%)をPWM_MAXに設定*/
ITU3.GRB=0;
/*GRBの値を0に設定(=PWM0%)パルス幅はこの値に依存*/
ITU.TMDR.BIT.PWM3=1;
/*ITUのPWMに使うchをPWMモードに設定*/
ITU3.TIOR.BIT.IOB=0;
/*TIOCBにPWM信号を出力しないように設定*/
ITU.TSTR.BIT.STR3=1; /*カウントスタート(PWM信号が出力される)*/ }
/*PWM出力*/ void outPWM3(unsigned
int value) { if (value)
{ ITU3.TCR.BIT.CCLR=1;
/*GRAのコンペアマッチでTCNTをクリア*/
value--; if
(ITU3.GRA==value) value++;
ITU3.GRB=value; } else
{ ITU3.TCR.BIT.CCLR=2;
/*GRBのコンペアマッチでTCNTをクリア*/ } }
volatile unsigned short int
period=9999; volatile unsigned short int high=0;
main() {
int keyhit; unsigned short int
pwmvalue=1000; unsigned short int
oldperiod=9999; unsigned short int
oldhigh=0; initSCI1();
initPWM3(2000, 3); /*clock:φ/8 1msec周期*/
outPWM3(pwmvalue); /*デューティ比1000/2000(50%)*/
initMeasDuty(3); /*clock:φ/8*/
E_INT();
/*CPU割り込み許可*/ SCI1_printf("\n\n\nDuty Ratio
Measurement Check Program\n"); SCI1_printf("Connect
CN1-16,18,19.\n"); SCI1_printf("Key [D] decrease PWM
duty ratio down to 10%%.\n"); SCI1_printf("Key [U]
increase PWM duty ratio up to 90%%.\n");
SCI1_printf("pwmmax=2000\n"); while(1)
{ if
(period!=oldperiod||high!=oldhigh)
{
SCI1_printf("pwm,high,period=%6d :
%6u/%6u\n",pwmvalue,high,period);
oldperiod=period;
oldhigh=high;
} if
(0<(keyhit=chkgetCharSCI1()))
{
switch (keyhit)
{
case 'D':case
'd':
if (200<pwmvalue)
pwmvalue-=200;
break;
case 'U':case
'u':
if (pwmvalue<1800)
pwmvalue+=200;
break;
}
outPWM3(pwmvalue);
SCI1_printf("\n");
} } }
#pragma asm .SECTION MYVEC,
DATA, LOCATE=H'0000A4 .ORG H'0000A4 ;
ITU4インプットキャプチャB割り込みベクタアドレス .DATA.L
_int_IMIB4 .SECTION P,CODE,ALIGN=2
;これを忘れてはいけない #pragma endasm
#pragma interrupt (int_IMIB4) void int_IMIB4()
/*インプットキャプチャB割り込みルーチン*/ { ITU4.TSR.BIT.IMFB=0;
/*GRBコンペアマッチフラッグクリア*/
period=readPeriod(); high=readHigh(); }
/************************************************************ Duty
Ratio Measurement Check Program Connect CN1-16,18,19. Key [D]
decrease PWM duty ratio down to 10%. Key [U] increase PWM duty ratio up
to 90%. pwmmax=2000 pwm,high,period= 1000 :
1000/ 2000 u pwm,high,period= 1200 :
1200/ 2000 u pwm,high,period= 1400 :
1400/ 2000 u pwm,high,period= 1600 :
1600/ 2000 u pwm,high,period= 1800 :
1800/ 2000 d pwm,high,period= 1600 :
1600/ 2000 d pwm,high,period= 1400 :
1400/ 2000 d pwm,high,period= 1200 :
1200/ 2000 d pwm,high,period= 1000 :
1000/ 2000 d pwm,high,period= 800
: 800/ 2000 d pwm,high,period=
600 : 600/
2000 d pwm,high,period= 400 :
400/ 2000 d pwm,high,period= 200
: 200/ 2000 u pwm,high,period=
400 : 400/
2000 u pwm,high,period= 600 :
600/ 2000 u pwm,high,period= 800
: 800/ 2000 u pwm,high,period= 1000
: 1000/ 2000 u pwm,high,period= 1200
: 1200/ 2000 u pwm,high,period= 1400
: 1400/ 2000 u pwm,high,period= 1600
: 1600/ 2000 u pwm,high,period= 1800
: 1800/
2000 ************************************************************/ |