目次

電源位相制御

 AC100Vの電源電圧を、位相制御すると
 白熱電球の輝度調整やドリルモータの
 回転数を可変できます。
 (白熱電球は、現在、身の回りには
  ありませんが)

 電源電圧の波形でみると、位相を変化させて
 負荷へと与える電力量を制御していることと
 等価。




 AC100Vの色をつけた領域の面積と出力の面積が
 異なることがわかると思います。

 面積の差が、負荷に与える電力量の差に相当。

 位相制御を考えるときは、0Vを横切るときを
 基準にします。次の回路で電圧が0Vを過ぎる
 ときを検出します。




 0Vを横切るときを、ゼロクロスポイントと
 呼びます。ゼロクロスを、外部割込みとして
 8048に与えれば、位相制御ができそう。

 8048のピンアサインを確認しておきます。



 外部割込みで使える端子には、INT、T0、T1が
 ありますが、T1はエッジトリガーのカウントで
 何かの動作をします。

 INTを使い、変化に即応する仕様で考えます。

 INTは、負論理なので、ゼロクロスポイントを
 検出する回路は、次のように変更。



 フォトカプラの出力を、エミッタ側から取り出します。

 電圧が1.2Vを超えると、フォトカプラ内部のLEDが点灯
 して、フォトトランジスタのコレクタからエミッタに
 電流が流れて、抵抗に電圧を発生させます。

 ゼロクロスポイントで、トリガーを発生させることが
 できます。

 INTの割込みはレベルトリガーなので、8048が反応できる
 時間幅まで、ワンショット回路で引き延して対応。





 割込みを受け付けたなら、指定時間だけ待って
 ソリッドステートリレー(SSR)をオンオフさせます。

 タイミングチャートでは、次のように指定します。



 SSRは、以下を利用。




 SSRは、制御ピンに'H'レベルを与えると
 AC100Vを導通させてます。

 トライアックを利用し、リレーの動作を半導体で
 実現するデバイスがSSR。

 リレーには寿命がありますが、SSRの方は適切な
 使い方をすれば永久寿命になります。

 位相制御のため、ポート2の4ビットをSSRの
 制御ピンに接続して利用することにします。



 ポート2の4ビット目に論理値を印加する
 コードは、以下。

SND_H:
	; set 2^4
	mov  r2,#10h
	; get now state
	in   a,P2
	; set bit
	orl  a,r2
	; impress
	outl P2,a
	;
	ret

SND_L:
	; set 2^4
	mov  r2,#10h
	; get now state
	in   a,P2
	; clear bit
	xrl  a,r2
	; impress
	outl P2,a
	;
	ret

 SSRに論理値'L'を、どれくらいの時間続けているのかを
 指定するため、ポート1の8ビットを使って入力します。



 8ビット値の入力は、以下。

GET_V:
	; set pointer
	mov	r0,#INTV
	; get value
	mov	a,@r0
	mov	r2,a
	; load value
	in	a,P1
	; copy
	mov	r3,a
	; compare
	anl	a,r2
	; judge
	jz	GET_V1
	; store value
	xch	a,r3
	mov	@r0,a
GET_V1:
	ret

 既に格納している値と同じであれば、更新せずに維持。

 どれ位遅延するかは、タイマーカウンタを利用。
 タイマーカウンタに値を設定し、オーバーフロー
 割込みで通知させます。

 タイマーカウンタは、12.5kHz(周期80usec)の整数倍を設定可能。

 タイマーカウンタをオーバーフローさせるために
 2の補数を利用した値を設定します。

 タイマーカウンタに値を設定するには、以下の
 サブルーチンを利用。

SET_V:
	; set pointer
	mov r0,#INTV
	; get value
	mov	a,@r0
	; calculate
	cpl	a
	inc	a
	; store
	mov	t,a
	;
	ret

 ここまでで、必要なサブルーチンを定義できたので
 動作シーケンスを考えていきます。

 割込みが発生したときに、どのような操作をすれば
 よいのかを確認しておきます。

 外部割込み発生

  このときのシーケンスは、以下。
  1. タイマー動作停止。
  2. SSRに対して、論理値'L'を出力。
  3. 遅延指定値を取得。
  4. 遅延指定値を設定。
  5. タイマー動作開始。
  シーケンスをコードに置き換えます。 E_HND: ; stop timer stop tcnt ; impress 'L' to SSR call SND_L ; get interval value call GET_V ; set interval value call SET_V ; start timer strt t ; retr  タイマー割込み発生   このときのシーケンスは、以下。
  1. イベント通知フラグのクリア。
  2. SSRに対して、論理値'H'を出力。
  このシーケンスは、メインルーチンで処理しますが   タイマー割込み時には、イベント通知フラグを設定   するコードを定義しておきます。 T_HND: ; set pointer mov r1,#TFLAG ; set flag mov a,#1 mov @r1,a ; retr  初期化を含めて、全体をまとめると、以下。 ; ; TEST program for 8048 ( PROASM-II ) ; Copyright (C) 2018 Kensuke Ooyu ; INCLUDE 8048.LIB ;******************* ; value and address ;******************* DUMMY equ 128 INTV equ 18h TFLAG equ 19h ;**************** ; define symbols ;**************** ENTRY equ 0h E_INT equ 3h E_TIM equ 7h ;******************* ; interrupt vectors ;******************* org ENTRY jmp START ; external interrupt org E_INT jmp E_HND ; timer interrupt org E_TIM jmp T_HND org 10h ;************** ; sub routines ;************** INIT: ; disable external interrupt dis i ; disable timer interrupt dis tcnti ; initialize I/O clr a outl p1,a outl p2,a ; initialize value mov r0,#INTV mov @r0,#DUMMY ; clear flag mov r1,#TFLAG mov @r1,#0 ; enable external interrupt en i ; enable timer interrupt en tcnti ret SND_H: ; set 2^4 mov r2,#10h ; get now state in a,P2 ; set bit orl a,r2 ; impress outl P2,a ; ret SND_L: ; set 2^4 mov r2,#10h ; get now state in a,P2 ; clear bit xrl a,r2 ; impress outl P2,a ; ret GET_V: ; get value mov a,@r0 mov r2,a ; load value in a,P1 ; copy mov r3,a ; compare anl a,r2 ; judge jz GET_V1 ; store value xch a,r3 mov @r0,a GET_V1: ret SET_V: ; get value mov a,@r0 ; calculate cpl a inc a ; store mov t,a ; ret E_HND: ; stop timer stop tcnt ; impress 'L' to SSR call SND_L ; get interval value call GET_V ; set interval value call SET_V ; start timer strt t ; retr T_HND: ; set flag mov @r1,#1 ; retr ;************** ; main routine ;************** org 100h START: call INIT MAIN: ; judge flag mov a,#1 anl a,@r1 jz MAIN_END ; clear flag mov @r1,#0 ; impress 'H' to SSR call SND_H MAIN_END: ; jmp MAIN end  アセンブルリストは、以下。 0000 ; 0000 ; TEST program for 8048 ( PROASM-II ) 0000 ; Copyright (C) 2018 Kensuke Ooyu 0000 ; 0000 INCLUDE 8048.LIB 0000 list 0000 0000 ;******************* 0000 ; value and address 0000 ;******************* 0080 DUMMY equ 128 0018 INTV equ 18h 0019 TFLAG equ 19h 0000 0000 ;**************** 0000 ; define symbols 0000 ;**************** 0000 ENTRY equ 0h 0003 E_INT equ 3h 0007 E_TIM equ 7h 0000 0000 ;******************* 0000 ; interrupt vectors 0000 ;******************* 0000 org ENTRY 0000 2400 + jmp START 0002 0002 ; external interrupt 0002 org E_INT 0003 043B + jmp E_HND 0005 0005 ; timer interrupt 0005 org E_TIM 0007 0444 + jmp T_HND 0009 0009 org 10h 0010 ;************** 0010 ; sub routines 0010 ;************** 0010 INIT: 0010 ; disable external interrupt 0010 15 + dis i 0011 0011 ; disable timer interrupt 0011 35 + dis tcnti 0012 0012 ; initialize I/O 0012 27 + clr a 0013 39 + outl p1,a 0014 3A + outl p2,a 0015 0015 ; initialize value 0015 B818 + mov r0,#INTV 0017 B080 + mov @r0,#DUMMY 0019 0019 ; clear flag 0019 B919 + mov r1,#TFLAG 001B B100 + mov @r1,#0 001D 001D ; enable external interrupt 001D 05 + en i 001E 001E ; enable timer interrupt 001E 25 + en tcnti 001F 001F 83 + ret 0020 0020 SND_H: 0020 ; set 2^4 0020 BA10 + mov r2,#10h 0022 ; get now state 0022 0A + in a,P2 0023 ; set bit 0023 4A + orl a,r2 0024 ; impress 0024 3A + outl P2,a 0025 ; 0025 83 + ret 0026 0026 SND_L: 0026 ; set 2^4 0026 BA10 + mov r2,#10h 0028 ; get now state 0028 0A + in a,P2 0029 ; clear bit 0029 DA + xrl a,r2 002A ; impress 002A 3A + outl P2,a 002B ; 002B 83 + ret 002C 002C GET_V: 002C ; get value 002C F0 + mov a,@r0 002D AA + mov r2,a 002E ; load value 002E 09 + in a,P1 002F ; copy 002F AB + mov r3,a 0030 ; compare 0030 5A + anl a,r2 0031 ; judge 0031 C635 + jz GET_V1 0033 ; store value 0033 2B + xch a,r3 0034 A0 + mov @r0,a 0035 GET_V1: 0035 83 + ret 0036 0036 SET_V: 0036 ; get value 0036 F0 + mov a,@r0 0037 ; calculate 0037 37 + cpl a 0038 17 + inc a 0039 ; store 0039 62 + mov t,a 003A ; 003A 83 + ret 003B 003B E_HND: 003B ; stop timer 003B 65 + stop tcnt 003C ; impress 'L' to SSR 003C 1426 + call SND_L 003E ; get interval value 003E 142C + call GET_V 0040 ; set interval value 0040 1436 + call SET_V 0042 ; start timer 0042 55 + strt t 0043 ; 0043 93 + retr 0044 0044 T_HND: 0044 ; set flag 0044 B101 + mov @r1,#1 0046 ; 0046 93 + retr 0047 0047 ;************** 0047 ; main routine 0047 ;************** 0047 org 100h 0100 START: 0100 1410 + call INIT 0102 0102 MAIN: 0102 ; judge flag 0102 2301 + mov a,#1 0104 51 + anl a,@r1 0105 C60B + jz MAIN_END 0107 0107 ; clear flag 0107 B100 + mov @r1,#0 0109 0109 ; impress 'H' to SSR 0109 1420 + call SND_H 010B 010B MAIN_END: 010B ; 010B 2402 + jmp MAIN 010D 010D end  HEXファイルは、次のようになります。 :020000002400DA :02000300043BBC :020007000444AF :10001000153527393AB818B080B919B100052583CC :10002000BA100A4A3A83BA100ADA3A83F0AA09AB3C :100030005AC6352BA083F037176283651426142C1B :0700400014365593B1019342 :0D0100001410230151C60BB100142024027D :00000001FF

目次

inserted by FC2 system