PIC F1シリーズでmTouch(その後2)

新PIC16シリーズの静電容量タッチセンサモジュールを使っていろいろやっているのだが、とりあえず使えそうになってきたのでソース公開する。タイマーリソースはタイマ0ではなくタイマ1を使うようにした。というのもタイマ0は8ビットなのですぐにオーバーフローしてしまうので調整が面倒である。自分で自分の作ったセットで個人的に使うのであればフローしないようにタイマ0で調整してもイイのだが、ブレッドボード上で実験することを前提としているので配線が変わる度に調整するのでは教えるのが大変である。そこで16ビットタイマーであるタイマー1を使うように変更した。いろいろ調整すべき箇所があるが、一番難しいのがどれだけ周波数が下がったらONとして認識して、どれだけ戻ったらOFFと見なすかというところ。ソースで言えばisCpsOnの後半if文のav/24とav/64のところで、24の値を大きくするとONの感度が上がり、64の値を大きくするとON→OFFの感度が下がる。ONの感度を上げ過ぎるとタッチしなくてもONになってしまい誤作動が増える。OFFの感度を上げるとOFFに戻らなくなってしまうなんてことになりかねない。また、セットを動かしただけでもONになったりONになりっぱなしになったりするので、注意が必要である。また、サンプリング時間は5msで設定しているが、これ以上短くすると丸め誤差が出てきて移動平均の値が狂ってくるのでこれも注意が必要。じゃぁ長くすればいいかというと長くすると当然スイッチの反応が鈍くなる。ということで、今回の値くらいが妥当じゃないかと思う。

// CPSライブラリで使用する定数など
#define CPS_ST    5000    // サンプリング時間
int CpsAve[5];            // 各チャンネルの移動平均した無負荷時のTMR値

void CpsInit(byte ch)
{
    byte b;
    if(ch>4) return;    // for safe
    b=0x01<<ch;

    TRISA=TRISA|b;
//  WPUA&=~b;        // not available on f1827
    ANSELA=ANSELA|b;
    T1CONbits.TMR1CS=3;TMR1ON=1;TMR1GE=0;    // Using Timer1
    CPSCON0bits.CPSRNG=3;    // 3:high,1:low,0:off
    CPSCON1bits.CPSCH=ch;
    TMR1L=0;TMR1H=0;
    CPSON=1;
    __delay_us(CPS_ST);            // sampling time
    CPSON=0;
    CpsAve[ch]=TMR1L+TMR1H*256;    // setting initial mean value
}

byte isCpsOn(byte ch)
{
    int t,av; // Ave[ch]
    static byte onoff[5]={0,0,0,0,0};
    if(ch>4) return 0;    // for safe
    av=CpsAve[ch];
    CPSCON1bits.CPSCH=ch;
    TMR1L=0;TMR1H=0;
    CPSON=1;
    __delay_us(CPS_ST);        // sampling time
    CPSON=0;
    t=TMR1L+TMR1H*256;
    if(t<av-av/24){
        onoff[ch]=1;
    }else if(t>av-av/64){
        CpsAve[ch]=((long)av*15+t)/16;
        onoff[ch]=0;
    }
    return onoff[ch];
}

このライブラリはPIC16F1827用になっており、また、ポートAの5チャンネル分しかサポートしていないのでフルサポートしたければCpsInitを書き換えるとよい。ポートの設定を調整すれば他のF1シリーズにも移植は簡単だと思う。

肝心の使い方は、CpsInitでチャンネルを指定して初期化して、isCpsOnでチャンネルをしてすればONかOFFがわかる。前回のビデオではメインループの中で次のようにしてON/OFFをチェックし、7セグLEDを制御している。

if(isCpsOn(3)) LATB|=0x42; else LATB&=0xbd;

マイクロチップからも日本語のアプリケーションノートがPDF配布されているので、実システムに組み込む人は参考にするといいと思う。今回はブレッドボード上で教材として使うことをメインにしているのでよいが、実システムに組むには考慮すべき点が他にもあるので参考にすべきである。

wordpressではcodeタグを使ってもスペースが勝手に削除されて非常に見づらいソースになってしまうみたいだ(ぼそっ)。やっと直した。

  1. ちなみに同じF1シリーズでも12F1822,16F1823-29の18ピンでないものはもう少し細かな設定ができるようだ。CPSRMを1にすると、FVRとDACを使って発生させる周波数の範囲を細かく設定できる。これらのチップで上記のルーチンを使用するときにはCPSRM=0;を入れてやれば同じことができる。また、28ピンや40ピンのF1シリーズ(16F19xx)は18ピンのものと同様なので上記ルーチンをそのまま使えそうである。

  1. トラックバックはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。