/********************************************************** 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
<3048f.h> #include "h8_3048.h"
/*clockindex
0:φ,1:φ/2,2:φ/4,3:φ/8*/ /*pwmmax
*/ /* 10
0.625 1.25
2.5 5 [μsec]*/ /*
20 1.25
2.5 5 10
*/ /* 50
3.125 6.25 12.5
25 */ /* 100
6.25 12.5
25 50 */ /*
200 12.5
25 50
100 */ /* 500
31.25 62.5 125
250 */ /* 1000
62.5 125
250 500 */ /*
2000 125
250 500 1000
*/ /* 5000 312.5
625 1250 2500 */ /*
10000 625
1250 2500 5000 */ /*
20000 1250
2500 5000 10000 */ /*
50000 3125 6250
12500 25000 */
/* 割り込みベクタ 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();
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"); initMeasDuty(3);
/*clock:φ/8*/ initPWM3(2000, 3); /*clock:φ/8
1msec周期*/ outPWM3(pwmvalue);
/*デューティ比1000/2000(50%)*/
E_INT();
/*CPU割り込み許可*/ 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
;IMIA1 .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 ************************************************************/ |