アクエリアスの時代到来、そして新たな時代に合った文明や科学、人のありかたなどを探求してみたい。そして、太陽の国である日本は地球人類のリーダー的存在となる必要があります。その一助を担えれば幸いです。
2012年5月29日火曜日
パルスジェネレーターver2.0
先日、新しいパルスジェネレーターを検討すると書いたが、いろいろ思考をめぐらしていくうちに、今あるパルスジェネレーターを少し改造すれば、簡単に使えるのではないかと思った。
実を言うと、USB機能の追加が少しハードルが高くて、どうしようか悩んでいたのもある。
まずPIC18Fだと、Cよりもアセンブラになるだろうということ、リアルタイムOSが使えるかどうかということ、USBをリアルタイムOSに乗せるのは可能か、などなど。
すると、実績などを考えるとPIC24Fの方がよくないかとか、課題が増えてしまって、収集がつかなくなってしまう。
だから、まずは既存のパルスジェネレーターを改造することから初めて、新しいパルスジェネレーターの本当に必要な機能を見極めてから、作っても遅くは無いだろうという思いが出てきた。
USB機能はないが、マニュアル操作で、パルス量をリアルタイムに変化できるようにしてみたい。
操作は、ロータリーエンコーダーがあるので、パルス出力中にこれをまわすとパルス量が増減できるようにする。
となると、PICソフトを書き換えるだけで済む。
MPLABを立ち上げて、プロジェクトを開く。FreeRTOSを使ったソフトだったことを思い出した。
LCD表示でパルス幅1.0usec未満の場合に小数点が消えるバグがひとつあったので、これもついでに直す。
コンパイルが通ったところで、メモリーUSAGEを見てみる。まだ十分な余裕がある。
パルス量増減モードを追加しても問題なさそうだ。
2012年5月13日日曜日
新しいパルス発信器を
フリーエネルギー装置の実験は、全く結果が出なかった。
いろいろと検討してみたのだが、パルスのかけ方に問題があるのではないかと思った。
以前作ったパルスジェネレータは、一定の周期でパルスを出すことができるが、このパルスの密度を高めるとかいった用途には使えないのだ。
パルスの与える回数を、加速度を加えるように密度を上げていきたいのである。そういうことができるようなものを作ろうと思う。パルス密度スイープ機能付のパルスジェネレーターである。
それから、実験に際して、毎回手でスイープさせるのも面倒なので、USB付のPICを使って、パソコンからコントロールできるようにしてみたい。実験パターンを自動化したいのである。
ハードウェア構成は、PIC18F4550+MAXⅡをベースにしたもので検討することにする。
いろいろと検討してみたのだが、パルスのかけ方に問題があるのではないかと思った。
以前作ったパルスジェネレータは、一定の周期でパルスを出すことができるが、このパルスの密度を高めるとかいった用途には使えないのだ。
パルスの与える回数を、加速度を加えるように密度を上げていきたいのである。そういうことができるようなものを作ろうと思う。パルス密度スイープ機能付のパルスジェネレーターである。
それから、実験に際して、毎回手でスイープさせるのも面倒なので、USB付のPICを使って、パソコンからコントロールできるようにしてみたい。実験パターンを自動化したいのである。
ハードウェア構成は、PIC18F4550+MAXⅡをベースにしたもので検討することにする。
CNCコントロールボックスを作り直した
ちょっと時間ができたので、CNCの電源と関連するコントローラー類をひとつにまとめて収容するボックスを作ってみた。
また例によって、木製である。アルミはカッコ良いが、高価なのであきらめる。
近くのホームセンターにコンクリート打設用の型枠として使われる合板の端材が安く入手できたので、それで作った。
ちなみに、ボックスの色が、からし色なのは型枠用合板だから。
今回、基板を固定するのに鬼目ナットを使ったのだが、からし色の塗装と相まってなかなか良い感じで基板を固定することができた。
ついでに、非常停止ボタンなどもつけてみる。
PIC12F509という8ピンの小さなPICをつかって、非常停止ボタンが押されたら、PC用の電源3つのパワーが落ちるという細工を試みる。
CNC周りの配線に少し余裕を持たせて、コネクタで接続できるようにした。CNC本体とコントロールBOXとが分離できるようになったので、移動させるのも困らなくなった。
これで、CNCの使い勝手が少し向上した。
まだまだ、成長途中。あちこち修正したい点はたくさんある。
また時間のあるときに少しずつ改良することになるだろう。
以下、PICのアセンブラソース
また例によって、木製である。アルミはカッコ良いが、高価なのであきらめる。
近くのホームセンターにコンクリート打設用の型枠として使われる合板の端材が安く入手できたので、それで作った。
ちなみに、ボックスの色が、からし色なのは型枠用合板だから。
今回、基板を固定するのに鬼目ナットを使ったのだが、からし色の塗装と相まってなかなか良い感じで基板を固定することができた。
ついでに、非常停止ボタンなどもつけてみる。
PIC12F509という8ピンの小さなPICをつかって、非常停止ボタンが押されたら、PC用の電源3つのパワーが落ちるという細工を試みる。
CNC周りの配線に少し余裕を持たせて、コネクタで接続できるようにした。CNC本体とコントロールBOXとが分離できるようになったので、移動させるのも困らなくなった。
これで、CNCの使い勝手が少し向上した。
まだまだ、成長途中。あちこち修正したい点はたくさんある。
また時間のあるときに少しずつ改良することになるだろう。
以下、PICのアセンブラソース
;
; CNC 非常停止ボタンコントローラー
;
; ** HISTORY **
; 2012-04-26 新規 by Mahakala
; 2012-04-27 細かなバグ取り by Mahakala
; ⇒キーを離した瞬間に切り替わっていたので、キー前処理で反転するように修正
;
;--------------------------------------
; SPECIFICATION:
; 非常停止ボタンの制御を行い、電源BOXのON/OFFを行う。
; 復旧はRESETボタンで行う。
; POWER ON 時は、非常ボタン押下時と同じ。
;
; CLOCK 4MHz (PIC内蔵OSC)
;
; GP5 : OUTPUT RED LED EMERGENCY : 正常=OFF,停止=ON
; GP4 : INPUT SW1 RESET : 押す=Lo,通常=Hi
; GP3 : INPUT SW2 EMERGENCY : 押す=Hi,通常=Lo (BREAK接点)
; GP2 : OUTPUT RELAY3 : 正常=ON,停止=OFF
; GP1 : OUTPUT RELAY2 : 正常=ON,停止=OFF
; GP0 : OUTPUT RELAY1 : 正常=ON,停止=OFF
;
LIST P=12F509
#INCLUDE
__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC
;
;***** MACRO *****
;----------------------------------------
;MOVE L to F
;※Wレジスタ破壊
;例: MOVLF H'10',FILE
;----------------------------------------
MOVLF MACRO L,FILE
MOVLW L
MOVWF FILE
ENDM
;----------------------------------------
;MOVE F to F
;※Wレジスタ破壊
;例: MOVFF SRC,DST
;----------------------------------------
MOVFF MACRO SRC,DST
MOVF SRC,W
MOVWF DST
ENDM
;----------------------------------------
;IF(FILE1 <> FILE2) GOTO PTR
;F1<>F2の場合PTRへとぶ
;※Wレジスタ破壊
;例: CPFFN F1,F2,PTR
;----------------------------------------
CPFFN MACRO FILE1,FILE2,PTR
MOVF FILE1,W
XORWF FILE2,W ;IF FILE1 = FILE2 THEN Z = 1
BTFSS STATUS,Z ;Z = 1 なら1行とばす
GOTO PTR
ENDM
;----------------------------------------
;JMP Z,PTR
; 結果が0なら PTR へジャンプ
;例: JPZ PTR
;----------------------------------------
JPZ MACRO PTR
BTFSC STATUS,Z
GOTO PTR
ENDM
;
;***** LABEL DEFINITIONS *****
LED EQU 0x05
RES_SW EQU 0x04
EMG_SW EQU 0x03
RELAY3 EQU 0x02
RELAY2 EQU 0x01
RELAY1 EQU 0x00
;
;***** VARIABLE DEFINITIONS *****
UDATA
WORK RES 1 ;作業用
EMRGCY RES 1 ;動作モード 正常=0,非常停止中=1
KEY_PRV RES 1 ;前回のキー値
KEY_FIL RES 1 ;キーフィルタ
KEY_WK RES 1 ;キーワーク
WAIT_CNT RES 1 ;WAIT用カウンタ
WAIT_MSC RES 1 ;msec WAIT用カウンタ
;***** PROGRAM AREA *****
CODE 0
;
; ORG 0x000
MAIN
;Initialize Port
MOVWF OSCCAL
MOVLW 0x18 ;GP3とGP4を入力にする
TRIS 0x06
MOVLW 0xDF ;T0CKIは使わないで、GP2を出力ポートに
OPTION
;Initialize Variables
CLRF KEY_PRV
CLRF KEY_FIL
CLRF WAIT_CNT
CLRF WAIT_MSC
MOVLF .1,EMRGCY ;起動時は'1'にする
;Initialize I/O
BSF GPIO,RELAY1 ;全リレーOFF
BSF GPIO,RELAY2 ; => H出力でRELAY=OFF
BSF GPIO,RELAY3
BSF GPIO,LED ;LED点灯
CALL WT256MS ;0.5秒待つ
CALL WT256MS
;キー入力の処理
LOOP MOVF GPIO,W
MOVWF WORK ;復帰釦(GP4)をビット反転する
BTFSS WORK,RES_SW ;IF GP4=0 GOTO GP3SET
GOTO GP4SET
BCF WORK,RES_SW ;GP4:1から0へ
GOTO KEYINP
GP4SET BSF WORK,RES_SW ;GP4:0から1へ
KEYINP MOVF WORK,W
ANDLW B'00011000' ;GP4,GP3を取る
MOVWF KEY_WK
CPFFN KEY_WK,KEY_FIL,KEYEND ;IF WK<>FIL THEN GOTO KEYEND
MOVFF KEY_PRV,WORK ;a = PRV
MOVFF KEY_WK,KEY_PRV ;PRV = WK
MOVF WORK,W ;押下エッジ検出
XORWF KEY_WK,W ;(a XOR WK) AND WK
ANDWF KEY_WK,W
JPZ KEYEND ;IF W==0 GOTO KEYEND
;キー押下時の処理
MOVWF WORK ;非常釦(GP3)?復帰釦(GP4)?
BTFSS WORK,EMG_SW ;IF GP3==0 GOTO RES_ON
GOTO RES_ON ;
;非常釦の処理
BTFSC EMRGCY,0 ;IF EMRGCY==1 THEN GOTO KEYEND
GOTO KEYEND
MOVLF .1,EMRGCY ;モード:非常停止中
BSF GPIO,RELAY1 ;全リレーOFF
BSF GPIO,RELAY2
BSF GPIO,RELAY3
BSF GPIO,LED ;赤LED ON
RES_ON BTFSS WORK,RES_SW ;IF GP4==0 GOTO KEYEND
GOTO KEYEND ;
;復帰釦の処理
BTFSS EMRGCY,0 ;IF EMRGCY==0 THEN GOTO KEYEND
GOTO KEYEND
CLRF EMRGCY ;モード:正常動作中
BCF GPIO,RELAY1 ;全リレーON
BCF GPIO,RELAY2
BCF GPIO,RELAY3
BCF GPIO,LED ;赤LED OFF
KEYEND MOVFF KEY_WK,KEY_FIL ;フィルター保存
GOTO LOOP
;---------------------------------------------
; 256ms WAIT
WT256MS MOVLF .0,WAIT_CNT
;---------------------------------------------
; ミリ秒ウェイト
; CLOCK 4MHz : 0.25usec
; 4T=1u
; CNT=0x01 : 2+1+(17+1+2)*49+17+1+1+2 = 1004step : 1.004msec
; CNT=0x02 : 2+(1+(20*50-2)+1+2)*2-2+2 = 2006 : 2.006
; CNT=0x03 : 2+(1+(20*50-2)+1+2)*3-2+2 = 3008 : 3.008
; CNT=0xFF : 2+(20*50-2+4)*255 = 255512 : 255.512
; CNT=0x00 : 2+(20*50-2+4)*256 = 256514 : 256.514
; CALL WAIT_MS ;+2
WAIT_MS MOVLF .50,WAIT_MSC ;+1
WTMS1 NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
DECFSZ WAIT_MSC,F ;+1
GOTO WTMS1 ;+2
DECFSZ WAIT_CNT,F ;+1
GOTO WAIT_MS ;+2
RETURN ;+2
END
;***********************
; CNC 非常停止ボタンコントローラー
;
; ** HISTORY **
; 2012-04-26 新規 by Mahakala
; 2012-04-27 細かなバグ取り by Mahakala
; ⇒キーを離した瞬間に切り替わっていたので、キー前処理で反転するように修正
;
;--------------------------------------
; SPECIFICATION:
; 非常停止ボタンの制御を行い、電源BOXのON/OFFを行う。
; 復旧はRESETボタンで行う。
; POWER ON 時は、非常ボタン押下時と同じ。
;
; CLOCK 4MHz (PIC内蔵OSC)
;
; GP5 : OUTPUT RED LED EMERGENCY : 正常=OFF,停止=ON
; GP4 : INPUT SW1 RESET : 押す=Lo,通常=Hi
; GP3 : INPUT SW2 EMERGENCY : 押す=Hi,通常=Lo (BREAK接点)
; GP2 : OUTPUT RELAY3 : 正常=ON,停止=OFF
; GP1 : OUTPUT RELAY2 : 正常=ON,停止=OFF
; GP0 : OUTPUT RELAY1 : 正常=ON,停止=OFF
;
LIST P=12F509
#INCLUDE
__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _IntRC_OSC
;
;***** MACRO *****
;----------------------------------------
;MOVE L to F
;※Wレジスタ破壊
;例: MOVLF H'10',FILE
;----------------------------------------
MOVLF MACRO L,FILE
MOVLW L
MOVWF FILE
ENDM
;----------------------------------------
;MOVE F to F
;※Wレジスタ破壊
;例: MOVFF SRC,DST
;----------------------------------------
MOVFF MACRO SRC,DST
MOVF SRC,W
MOVWF DST
ENDM
;----------------------------------------
;IF(FILE1 <> FILE2) GOTO PTR
;F1<>F2の場合PTRへとぶ
;※Wレジスタ破壊
;例: CPFFN F1,F2,PTR
;----------------------------------------
CPFFN MACRO FILE1,FILE2,PTR
MOVF FILE1,W
XORWF FILE2,W ;IF FILE1 = FILE2 THEN Z = 1
BTFSS STATUS,Z ;Z = 1 なら1行とばす
GOTO PTR
ENDM
;----------------------------------------
;JMP Z,PTR
; 結果が0なら PTR へジャンプ
;例: JPZ PTR
;----------------------------------------
JPZ MACRO PTR
BTFSC STATUS,Z
GOTO PTR
ENDM
;
;***** LABEL DEFINITIONS *****
LED EQU 0x05
RES_SW EQU 0x04
EMG_SW EQU 0x03
RELAY3 EQU 0x02
RELAY2 EQU 0x01
RELAY1 EQU 0x00
;
;***** VARIABLE DEFINITIONS *****
UDATA
WORK RES 1 ;作業用
EMRGCY RES 1 ;動作モード 正常=0,非常停止中=1
KEY_PRV RES 1 ;前回のキー値
KEY_FIL RES 1 ;キーフィルタ
KEY_WK RES 1 ;キーワーク
WAIT_CNT RES 1 ;WAIT用カウンタ
WAIT_MSC RES 1 ;msec WAIT用カウンタ
;***** PROGRAM AREA *****
CODE 0
;
; ORG 0x000
MAIN
;Initialize Port
MOVWF OSCCAL
MOVLW 0x18 ;GP3とGP4を入力にする
TRIS 0x06
MOVLW 0xDF ;T0CKIは使わないで、GP2を出力ポートに
OPTION
;Initialize Variables
CLRF KEY_PRV
CLRF KEY_FIL
CLRF WAIT_CNT
CLRF WAIT_MSC
MOVLF .1,EMRGCY ;起動時は'1'にする
;Initialize I/O
BSF GPIO,RELAY1 ;全リレーOFF
BSF GPIO,RELAY2 ; => H出力でRELAY=OFF
BSF GPIO,RELAY3
BSF GPIO,LED ;LED点灯
CALL WT256MS ;0.5秒待つ
CALL WT256MS
;キー入力の処理
LOOP MOVF GPIO,W
MOVWF WORK ;復帰釦(GP4)をビット反転する
BTFSS WORK,RES_SW ;IF GP4=0 GOTO GP3SET
GOTO GP4SET
BCF WORK,RES_SW ;GP4:1から0へ
GOTO KEYINP
GP4SET BSF WORK,RES_SW ;GP4:0から1へ
KEYINP MOVF WORK,W
ANDLW B'00011000' ;GP4,GP3を取る
MOVWF KEY_WK
CPFFN KEY_WK,KEY_FIL,KEYEND ;IF WK<>FIL THEN GOTO KEYEND
MOVFF KEY_PRV,WORK ;a = PRV
MOVFF KEY_WK,KEY_PRV ;PRV = WK
MOVF WORK,W ;押下エッジ検出
XORWF KEY_WK,W ;(a XOR WK) AND WK
ANDWF KEY_WK,W
JPZ KEYEND ;IF W==0 GOTO KEYEND
;キー押下時の処理
MOVWF WORK ;非常釦(GP3)?復帰釦(GP4)?
BTFSS WORK,EMG_SW ;IF GP3==0 GOTO RES_ON
GOTO RES_ON ;
;非常釦の処理
BTFSC EMRGCY,0 ;IF EMRGCY==1 THEN GOTO KEYEND
GOTO KEYEND
MOVLF .1,EMRGCY ;モード:非常停止中
BSF GPIO,RELAY1 ;全リレーOFF
BSF GPIO,RELAY2
BSF GPIO,RELAY3
BSF GPIO,LED ;赤LED ON
RES_ON BTFSS WORK,RES_SW ;IF GP4==0 GOTO KEYEND
GOTO KEYEND ;
;復帰釦の処理
BTFSS EMRGCY,0 ;IF EMRGCY==0 THEN GOTO KEYEND
GOTO KEYEND
CLRF EMRGCY ;モード:正常動作中
BCF GPIO,RELAY1 ;全リレーON
BCF GPIO,RELAY2
BCF GPIO,RELAY3
BCF GPIO,LED ;赤LED OFF
KEYEND MOVFF KEY_WK,KEY_FIL ;フィルター保存
GOTO LOOP
;---------------------------------------------
; 256ms WAIT
WT256MS MOVLF .0,WAIT_CNT
;---------------------------------------------
; ミリ秒ウェイト
; CLOCK 4MHz : 0.25usec
; 4T=1u
; CNT=0x01 : 2+1+(17+1+2)*49+17+1+1+2 = 1004step : 1.004msec
; CNT=0x02 : 2+(1+(20*50-2)+1+2)*2-2+2 = 2006 : 2.006
; CNT=0x03 : 2+(1+(20*50-2)+1+2)*3-2+2 = 3008 : 3.008
; CNT=0xFF : 2+(20*50-2+4)*255 = 255512 : 255.512
; CNT=0x00 : 2+(20*50-2+4)*256 = 256514 : 256.514
; CALL WAIT_MS ;+2
WAIT_MS MOVLF .50,WAIT_MSC ;+1
WTMS1 NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
NOP ;+1
DECFSZ WAIT_MSC,F ;+1
GOTO WTMS1 ;+2
DECFSZ WAIT_CNT,F ;+1
GOTO WAIT_MS ;+2
RETURN ;+2
END
;***********************
登録:
投稿 (Atom)