Home > Old PIC > PIC10F222(6pin-PIC) 応用例
擬似PWMによるリレー駆動  (Old piC) 
   (一部未完成) 鋭意製作中です しばらくお待ち下さい
目  次内  容更新: 2014/08/01
[0]始めにPIC10F222(6ピンPIC)の特徴(制約)
[1]サンプル基板外観、回路図、応用回路例、動作タイミングチャート
[2]仕様目的 方法 PWM I/O LED
[3]ソフト構成 初期化 タイマ エッジ検出 ONディレー
[4]動作確認信号波形 PWM波形
[5]ソース初期化 [400uS毎] [20mS毎] [1S毎]の処理 TMR0のチェック

【お礼 と お願い】
・ ホームページで情報公開している方々の貴重な体験を活用させて頂きました
 オリジナルがある場合は参照出来る様に場所を示し詳細は省いています
・ 内容はありのままを記載していますが、間違いや誤解があるかもしれません
 試す場合は全てご自身の責任で行って下さい
・リンクは自由ですが、引用・転載はお断りします

  表示を軽くするため画像を小さくしています 画像が小さくて見難い場合は、
  画像をクリックしてみて下さい (大きな画像が表示されるものも有ります)
  (VGA〜XGAサイズで確認していますが、 すべてのブラウザでの確認はしていません)

ご意見、ご感想、間違い指摘 ..... 等は 掲示板(BBS) 又は <E-mail> へお願いします
―Sorry! Japanese only― Copyright (c)2000 shibatat Allrights resrved



[0]始めに

PIC10F222(6ピンPIC)の特徴(制約)
(1)ピン数は 入力:1、入出力:3、電源、グランド の計6ピンです
(2)プログラムメモリ:512 Word、スタック:2レベル、RAM:23 BYTE
(3)タイマ:8bit×1、A/Dコンバータ:8bit×2
(4)割込機能は有りません (プログラムにかなり工夫が必要です)


[1]サンプル
表面実装部品で小型化に拘って手作りしました(フラックスが飛び散って汚いです)
(10F222) 部品は PIC・抵抗・コンデンサ・LED・5Pピンヘッダ・基板 各1、
配線は手元にあった 0.26ポリウレタン線を使用しました
PICkit3を接続するためのピンヘッダが一番大きいです
(10F222)
[回路図1](左) 試作基板の回路、 (中) テスト用スイッチ、 (右) 配線例
(下) 動作例のタイミングチャート

(10F222)
[回路図2] 実際に使用する場合の応用回路例


Item Top  Page Top  Page Bottom 


[2]仕様
(1)目的リレーの通電時の電力消費を減らして温度上昇を抑える
(2)方法リレー駆動信号の途中に挿入して、信号を PWM制御する
但し、最初リレーの可動鉄片が吸着するまでは定格電圧をかける必要があるのでデューティ比は 100%とする
リレーの可動鉄片が吸着したら、安定して保持できる電圧まで下げるためにデューティ比を下げる
(3)PWM周波数:1kHz程度(正常に動作して異音が出なければ良しとする)
デューティ比:ソフトを簡単にするためデューティ比は、50%(1/2)、33%(1/3)とする
デューティ比の変更:今回は2種類をGP3の入力信号で切換える(注1)
(4)入出力ロジックレベル(TTL等)
GP0 : 信号入力 (Hi:ON/Lo:OFF)
GP1 : LED駆動出力 (Hi:点灯/Lo:消灯) デバッグ用として使用 (最終 点灯:1S/消灯:1S)
GP2 : 信号出力 (Hi:ON/Lo:OFF)
GP3 : PWM設定入力 (Hi:33%/Lo:50%) デューティ比
(5)電源+5V
(注1)外付け部品の増加とソフトの負担が増えてしまうが、 A/D入力に設定用の電圧を加える方法もある


Item Top  Page Top  Page Bottom 


[3]ソフト
(1)構成 タイマー機能を使用して処理の基準となる時間を作成する
    :約416μSec(以下 400uSと記述する)
入力レベルのチェック:20mS 毎
オンディレー処理:約1Sec
擬似PWM処理: ON:400uS、 OFF:400uS×n (n=1,2,3,4...)
RUNランプの点滅: ON:約1Sec、OFF:約1Sec
 
(2)初期化 オシレータのキャリブレーション(最初にやれとマニュアルに書いてある)
オプションレジスタの設定 オシレーターの周波数設定など
I/Oポートの設定
ワークエリア(RAM)の初期化(プリセット、クリアなど)
 
(3)タイマ400uSの周期を作る方法
割込み機能が無いので、ソフトでタイマーの値をチェックする
 

  LOOP0:  TMR=0             タイマーをゼロクリアする
          [400uS毎の処理]
          [20mS毎の処理]    416uS*48=19968uS≒20mS
          [1S毎の処理]      20mS*50=1000mS=1S
  LOOP1:  TMR ?             タイマーのチェック
          TMR<53            LOOP1 へ(余った時間をここで費やす) 
          TMR>=53           LOOP0 へ


(4)エッジ検出  [20mS毎の処理]
[n]今回の状態、[n-1]前回の状態 のフラグを設けて、20mS毎の処理で [n]→[n-1]に移し、今回読み込んだ入力ポートの値を [n]に入れる
信号の立ち上がりエッジを検出する条件は、 [n-1]=0 & [n]=1
信号の立ち下がりエッジを検出する条件は、 [n-1]=1 & [n]=0

正論理(A接点)では、立ち上がりエッジでタイマーの初期値を設定する
 
(5)ディレータイマー  [20mS毎の処理]
今回のタイマーは1秒前後の時間を設定するので、基準時間を 20mSとして 1BYTE(0〜255)のカウンタで処理します
20mS*50=1S  時間精度は±20mS程度  (最大 5.1秒まで設定可能)
ディレータイマーがタイムアップしたら [TimeUp]フラグをセットします
 
(6)出力  [400uS毎の処理]
入力ポートが ONになり、ディレータイマーがタイムアップするまでは、出力をON(PWM-Duty:100%)にします
[TimeUp]フラグがセットされたら、[400uS毎の処理]で出力ポートの ON/OFF操作(PWM制御)を行います
[ON]、[OFF] の繰り返し デューティ比:50%(416*2uS周期:1.2kHz)
[ON]、[OFF][OFF] の繰り返し デューティ比:33%(416*3uS周期:800Hz)
[ON]、[OFF][OFF][OFF] の繰り返し デューティ比:25%(416*4uS周期:600Hz) (注2)
(注2)デューティ比:25%の場合も試してみたが、今回のリレーでは電圧が低過ぎて保持出来なかった


Item Top  Page Top  Page Bottom 


[4]動作確認
(1)LED点灯赤色LED:1秒で点滅、青色LED:負荷リレーの代わり
  YouTube画像をクリックすると別窓(タブ)で動画が見えます (2014/09/23追加)
赤色LEDは単に Run-Lamp(稼働している事を知らせるランプ)です
負荷リレーの代わりに青色LEDを点灯します
点灯直後はデューティ100%、約1秒後にデューティ 25%に落とします
 
 
(2)出力波形[下写真]オシロスコープの観測画面  黄:入力波形、 赤:出力波形
入力にはスイッチを使用しましたので少しチャタリングが発生しています  20mS毎の信号取込なのでチャタリングは無視されます
ディレータイマーの値がやや短めですが、誤差の範囲です
赤く塗りつぶされているのは PWMによる ON/OFF 波形の部分です
(赤く塗りつぶされている所) PWM 動作部分の拡大波形
デューティ比 50% (1.2kHz)
同上
デューティ比 33% (800Hz)


Item Top  Page Top  Page Bottom 


[5]ソースリスト
 
;---------------------------------------------------------------
; Relay Power down Logic for PIC10F222
;---------------------------------------------------------------
	LIST	P=10F222,R=DEC,C=128,N=90
	#include         ; processor specific variable definitions
	errorlevel  -302              ; suppress message 302 from list file
	__CONFIG    _MCLRE_OFF & _CP_OFF & _WDT_OFF & _MCPU_OFF & _IOSCFS_8MHZ
;===============================================================
; RYPD (Relay Power down Logic)
;
; V00.50 Test Version	PWM(50%,33%) Test		2014/08/04
; V00.40 Test Version	PWM(33%,25%) Test		2014/07/16
; V00.30 Test Version	PWM(33%) Test			2014/07/16
; V00.20 Test Version	On Delay Test			2014/07/15
; V00.10 Test Version   Int:416uS			2014/07/15
;===============================================================
; Hardware Connection
;	(I/O)	GP3(6)	GP2(4)	GP1(3)	GP0(1)  Vss(2)  Vdd(5)
;	(DI)	In	---	---	---	Digital
;	(DO)	---	Out	LED	Debug	Digital
;	(ICSP)	Vpp	---	CLK	DAT	To PICkit3
;
; GP0	On delay	デバッグ用出力	
; GP1	LED (Run Lamp)	CPU作動監視用LED
; GP2	Out put		リレー駆動出力
; GP3	In put		リレー駆動入力
;===============================================================
;       Work Area    (counter/timer/flag/buffer  tempolary work)
;===============================================================
WSWSTS	EQU	0x09	;
;	WSWSTS,0	;GP3 (N)
;	WSWSTS,1	;GP3 (N-1)
;	WSWSTS,2	;GP3 Delay
;	WSWSTS,3	;
;	WSWSTS,4	;
;	WSWSTS,5	;
;	WSWSTS,6	;
;	WSWSTS,7	;Start Up Control
;---------------------------------------------------------------
;WADSTS	EQU	0x0A	;
;WADR0L	EQU	0x0B	;
;WADR0H	EQU	0x0C	;
;WADR1L	EQU	0x0D	;
;WADR1H	EQU	0x0E	;
;WADR0_	EQU	0x0F	;
;WADR1_	EQU	0x10	;
;WADAVC	EQU	0x11	;
;	EQU	0x12	;
;	EQU	0x13	;
;	EQU	0x14	;
;	EQU	0x15	;
;	EQU	0x16	;
;	EQU	0x17	;
;	EQU	0x18	;
WDTYCT	EQU	0x19	;
WDELAY	EQU	0x1A	;
WT_02S	EQU	0x1B	;Timer count 20 mS	416uSx48=20mS
WT_SEC	EQU	0x1C	;  //   //    1 Sec	x50=1Sec
;WT_MIN	EQU	0x1D	;  //   //    1 Min	x60=1Min■■■未使用■■■
;WT_HUR	EQU	0x1E	;  //   //    1 Hur	x60=1Hur■■■未使用■■■
;W_SUT1	EQU	0x1F	;
;---------------------------------------------------------------
;[416μS タイマの設定]
; TMR0 割込の場合(初期値→$FF→$00)
;  T=416uS, F=OSC/4=2MHz, OSC=8MHz, P=4(1/4), a=?(ソフトによる割込処理時間)
;  256-(T*F/P)=256-(416*2/4)=256-208(+a)=48+a	;TMR0 Pre Set Value
;_TMR0	EQU	53	;0x35
;---------------------------------------------------------------
; 今回の場合(初期値:$00→比較値)
;  T=416uS, F=OSC/4=2MHz, OSC=8MHz, P=4(1/4), a=?(ソフトによる判定時間)
;  T*F/P=416*2/4=208(-a)=203	;TMR0 Comper Value
;  a: 5 or 6cycles   5*(4/f)=2.5uS or 6*(4/f)=3uS (F=8MHz)
;
;_TMR0	EQU	203	;0xCB	;T*F/P-a=416*2/4-5=203	407uS
;_TMR0	EQU	204	;0xCC	;	=416*2/4-4=204	410uS
;_TMR0	EQU	205	;0xCD	;	=416*2/4-3=205	413uS
_TMR0	EQU	206	;0xCE	;	=416*2/4-2=206	416uS■
;_TMR0	EQU	207	;0xCF	;	=416*2/4-1=207	417uS
;_TMR0	EQU	208	;0xCF	;	=416*2/4-0=208	419uS
;---------------------------------------------------------------
; Delay time	T=20mS*50=1Sec	_DELAY=50
_DELAY	EQU	50	;T=20mS*50=1Sec
;---------------------------------------------------------------
;
;
;===============================================================
;       Reset Process
;===============================================================
;;	ORG	0x1FF		;
;;	MOVLW	XX		;internal oscillator calibration val.
;===============================================================
;	Program Start
;===============================================================
	ORG	0x000		;Reset vector
	MOVWF	OSCCAL		;oscillator calibration
;
	MOVLW	B'10010001'	;
;		  :::::+++------;PS2:PS0=0001(1/4) 8MHz
;		  ::::+---------;PSA=0(Timer0)
;		  :::+----------;T0SE=1(Hi-->Lo transition)
;		  ::+-----------;T0CS=0(internal Fosc/4)
;		  :+------------;/GPPU=0(Enabled)
;		  +-------------:/GPWU=1(Disabled)
	OPTION			;Load OPTION Register
;
	MOVLW	B'00000000'	;
	MOVWF	GPIO
;
	MOVLW	B'00000000'	;GP0,GP1:DIO	A/Dは使用しない
;	MOVLW	B'11000001'	;GP0:AN0,GP1:AN1
;		  ::  :::+------;ADON=1
;		  ::  ::+-------;GO/DONE
;		  ::  :+--------;CHS=0, 1
;		  ::  +---------:"0"
;		  ++------------;ANS1, 0
	MOVWF	ADCON0
;
;	MOVLW	B'00001000'	;
;		      ::++------;GP1,GP0=AN1,AN0
	MOVLW	B'00001001'	;
;		      :::+------;GP0=IN
;		      ::+-------;GP1=OUT
;		      :+--------;GP2=OUT
;		      +---------;GP3=IN
	TRIS	GPIO		;Load TRIS Register
;
;-------------------------------;Work Init
;				Startup timer Value
	MOVLW	100		;50:1Sec, 100:2Sec, 150:3Sec ...
	MOVWF	WT_SEC
;
	CLRF	WSWSTS		;
	CLRF	WDTYCT		;カウンタセット
;
;	CLRF	WT_SEC		;256=0:5.12Sec(max)
;	MOVLW	60
;	MOVWF	WT_MIN
;	MOVLW	60
;	MOVWF	WT_HUR
;
;===============================================================
LOOP	CLRF	TMR0		;TMR0 Service
;===============================================================
;	416uS Timer Service	;416uS 毎処理
;===============================================================
	BTFSC	WSWSTS,7	;Start up control
	GOTO	TM04MS		;goto Nomal process
;-------------------------------;Start up process --------------
;
;
;
	GOTO	TM20MS
;-------------------------------;Nomal process -----------------
TM04MS
;-------------------------------;
;	WSWSTS,0	;GP3 (N)
;	WSWSTS,1	;GP3 (N-1)
;	WSWSTS,2	;GP3 Delay
;-------------------------------;
	BTFSC	WSWSTS,0
	GOTO	GP2CK1
	BCF	GPIO,GP2	;GP2:OFF(0)
	GOTO	GP2END
;
GP2CK1
	BTFSC	WSWSTS,2
	GOTO	POWDWN		;オンディレー後
;				;オンディレー前
	BSF	GPIO,GP2	;GP2:-->ON(1)
	GOTO	GP2END
;
POWDWN	BTFSC	GPIO,GP2	;パワーダウン(PWM)処理
	GOTO	GP2ON		;現在:ON
;				;現在:OFF
	MOVF	WDTYCT,W
	BTFSC	STATUS,Z
	GOTO	GP2ON		;既に 0
	DECFSZ	WDTYCT		;デクリメント
	GOTO	GP2END		;カウント中
;				;カウンタ=0
	BSF	GPIO,GP2	;GP2:-->ON(1)
	GOTO	GP2END
;
GP2ON	BCF	GPIO,GP2	;GP2:ON-->OFF(0)
;---------------------------------------------------------------
;		     T=	416	208
;	P1 P0	n  PWM	F	F
;*****	 0  0	1  50%	1.2kHz	2.4kHz
;*****	 0  1	2  33%  800Hz	1.6kHz
;*****	 1  0	3  25%  600Hz	1.2kHz
;*****	 1  1	4  20%  480Hz	0.96kHz
;
;	 x  0	1  50%  1.2kHz	2.4kHz	V00.50
;	 x  1	2  33%  800Hz	1.6kHz	V00.50
;---------------------------------------------------------------
;
	BTFSC	GPIO,GP0
	GOTO	GP2ST3
;GP2ST2
	MOVLW	1		;
	GOTO	GP2ST
;
GP2ST3	MOVLW	2		;
GP2ST	MOVWF	WDTYCT		;カウンタセット
;
GP2END
;
;-------------------------------;DEBUG On Delay Output
;	BTFSS	WSWSTS,2
;	GOTO	GP0OFF
;GP0ON	BSF	GPIO,GP0	;GP0:ON(1)
;	GOTO	GP0END
;GP0OFF	BCF	GPIO,GP0	;GP0:OFF(0)
;;
;GP0END
;;
;===============================================================
TM20MS	DECFSZ	WT_02S,F	;20mS Timer
	GOTO	CKTMR0		;not 0
	MOVLW	48		;TM0=416uS
	MOVWF	WT_02S
;---------------------------------------------------------------
;	20mS Timer Service	;20mS 毎処理
;===============================================================
	BTFSC	WSWSTS,7	;Start up control
	GOTO	TM20NP		;goto Nomal process
;-------------------------------;Start up process --------------
;
;
;
	GOTO	TM1SEC
;-------------------------------;Nomal process -----------------
TM20NP
;-------------------------------;
;	WSWSTS,0	;GP3 (N)
;	WSWSTS,1	;GP3 (N-1)
;	WSWSTS,2	;GP3 Delay
;-------------------------------;
;
	MOVF	WDELAY,W
	BTFSC	STATUS,Z
	GOTO	GP3CK1		; =0 既にタイムアップ
	DECFSZ	WDELAY,F	; >0 タイマー減算
	GOTO	GP3CK1		;    >0 まだ減算中
	BSF	WSWSTS,2	;GP3 Delay タイムアップ
;
;-------------------------------;
GP3CK1	BCF	WSWSTS,1	;GP3(N) ---> GP3(N-1)
	BTFSC	WSWSTS,0
	BSF	WSWSTS,1	;GP3(N-1)=1
;				;GP3(N-1)=0
	BCF	WSWSTS,0	;GP3 ---> GP3(N)
	BTFSC	GPIO,GP3
	BSF	WSWSTS,0	;GP3(N)=1
;				;GP3(N)=0
	BTFSS	WSWSTS,0
	BCF	WSWSTS,2	;GP3 Delay リセット
;
;-------------------------------;
	BTFSC	WSWSTS,1	;GP3 立ち上りエッジチェック
	GOTO	GP3END
;				;GP3(N-1)=0
	BTFSC	WSWSTS,0
	GOTO	GP3END
;				;GP3(N)=1 立ち上り
	BCF	WSWSTS,2	;GP3 Delay リセット
	MOVLW	_DELAY
	MOVWF	WDELAY		;タイマーセット
;
;-------------------------------;
GP3END

;
;
;
;===============================================================
TM1SEC	DECFSZ	WT_SEC,F	;1Sec Timer
	GOTO	CKTMR0
	MOVLW	50
	MOVWF	WT_SEC
;
	BSF	WSWSTS,7	;Start up control
;---------------------------------------------------------------
;	1Sec Timer Service	;1Sec 毎処理
;===============================================================
	BTFSS	GPIO,GP1
	GOTO	GP1ON
	BCF	GPIO,GP1	;LED:OFF(消灯)
	GOTO	GP1END
GP1ON	BSF	GPIO,GP1	;LED:ON(点灯)
GP1END

;*****				;LED点滅テスト
;*****	BCF	GPIO,GP2	;LED:ON(点灯)
;*****	BTFSC	WSWSTS,6
;*****	BSF	GPIO,GP2	;LED:OFF(消灯)
;---------------------------------------------------------------
;
;
;===============================================================
;TM1MIN	DECFSZ	WT_MIN,F	;1Min Timer
;	GOTO	CKTMR0
;	MOVLW	60
;	MOVWF	WT_MIN
;---------------------------------------------------------------
;	1Minute Timer Service	;1Min 毎処理
;===============================================================
;	ここに処理を書く
;===============================================================
;TM1HUR	DECFSZ	WT_HUR,F	;1Hour Timer
;	GOTO	CKTMR0
;	MOVLW	60
;	MOVWF	WT_HUR
;---------------------------------------------------------------
;	1Hour Timer Service	;1Hour 毎処理
;===============================================================
;	ここに処理を書く
;===============================================================
CKTMR0	MOVLW	_TMR0		;		1
	SUBWF	TMR0,W		;TMR0 -  _TMR0	1
	BTFSS	STATUS,C	;		1 or 2
	GOTO	CKTMR0		;TMR0 <  _TMR0	2
	GOTO	LOOP		;TMR0 >= _TMR0	2
;===============================================================
;
	END



Item Top  Page Top  Old PIC に戻る  Home に戻る