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Ⅱをベースにしたもので検討することにする。

CNCコントロールボックスを作り直した

ちょっと時間ができたので、CNCの電源と関連するコントローラー類をひとつにまとめて収容するボックスを作ってみた。

また例によって、木製である。アルミはカッコ良いが、高価なのであきらめる。
近くのホームセンターにコンクリート打設用の型枠として使われる合板の端材が安く入手できたので、それで作った。

ちなみに、ボックスの色が、からし色なのは型枠用合板だから。

今回、基板を固定するのに鬼目ナットを使ったのだが、からし色の塗装と相まってなかなか良い感じで基板を固定することができた。



ついでに、非常停止ボタンなどもつけてみる。

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
;***********************