So-net無料ブログ作成
PIC18F25K50 ブログトップ

CTMUが動き始めた [PIC18F25K50]

(2013.12.08)
Microchip社が提供しているアプリケーション・ライブラリにある”mTouch4ChSlider”のコードを使って、CTMUを動かしてみました。

この辺のパラメータを少し変え
mTouchConfig.h
//#define MTOUCH_SENSORS_NUMBER         4
#define MTOUCH_SENSORS_NUMBER         8

//#define MTOUCH_DEFAULT_CHARGE_DELAY   25
#define MTOUCH_DEFAULT_CHARGE_DELAY   18


電極のパラメータを定義して
// P1 RB4 AN11
#define CH0_TRIS    &TRISB
#define CH0_LAT     &LATB
#define CH0_IO_BIT  4
#define CH0_AN_NUM  11

// P2 RB2 AN8
#define CH1_TRIS    &TRISB
#define CH1_LAT     &LATB
#define CH1_IO_BIT  2
#define CH1_AN_NUM  8

一部省略

// P8 RA0 AN0
#define CH7_TRIS    &TRISA
#define CH7_LAT     &LATA
#define CH7_IO_BIT  0
#define CH7_AN_NUM  0


初期化コードはそのまま使って(電極の数だけ4つ増やした)
void Init_ctmu(void)
{
    MTouchInit();
    // sensor #0
    MTouchSetSensor(0, CH0_TRIS, CH0_LAT, CH0_IO_BIT, CH0_AN_NUM, -1, -1, -1);
    // sensor #1
    MTouchSetSensor(1, CH1_TRIS, CH1_LAT, CH1_IO_BIT, CH1_AN_NUM, -1, -1, -1);
    // sensor #2
    MTouchSetSensor(2, CH2_TRIS, CH2_LAT, CH2_IO_BIT, CH2_AN_NUM, -1, -1, -1);
    // sensor #3
    MTouchSetSensor(3, CH3_TRIS, CH3_LAT, CH3_IO_BIT, CH3_AN_NUM, -1, -1, -1);
    // sensor #4
    MTouchSetSensor(4, CH4_TRIS, CH4_LAT, CH4_IO_BIT, CH4_AN_NUM, -1, -1, -1);
    // sensor #5
    MTouchSetSensor(5, CH5_TRIS, CH5_LAT, CH5_IO_BIT, CH5_AN_NUM, -1, -1, -1);
    // sensor #6
    MTouchSetSensor(6, CH6_TRIS, CH6_LAT, CH6_IO_BIT, CH6_AN_NUM, -1, -1, -1);
    // sensor #7
    MTouchSetSensor(7, CH7_TRIS, CH7_LAT, CH7_IO_BIT, CH7_AN_NUM, -1, -1, -1);
}


メイン・ループの中からこの関数を呼び出すと
void ctmu_main(void)
{
    MTouchAcquisition();
}


先に定義した8個の電極のパラメータが順番に(同じ繰り返しを避ける工夫が施されている?)渡されて、計測します。
INT16 MTouchAcquisitionCTMU(SENSOR* pSensor)
{
---省略ーーー
    di();
    MTouchCTMUStart();
    // Wait for the sensor charge
    MTouchChargeDelay(chargeDelay); <==充電中
    // Stop charging
    MTouchCTMUStop();
    // Start conversion
    MTouchADCStart();
    ei();
    MTouchADCWait(); <==A/D変換中
    // Ground sensor
    *tris &= ~ioMask;  <==放電開始
    // Get result 
    result = 1024 - MTouchADCGetResult();
    return result;
}


MTOUCH_DEFAULT_CHARGE_DELAYが25だとA/D変換値が飽和していたので18に変えました。電極にタッチしたり、離したりすると、A/D変換値は330(hex)~110(hex)位の変化を示しました。この辺りの感度はPIC16F1938のCSM機能と同程度です。ただし、計測時間が遥かに短い(1/100位?)ので平均化処理の結果に期待が膨らみます。

メイン・ループの中から呼び出すので、MTouchCTMUStart()からMTouchADCStart()までを割り込み禁止にしました。(割り込みが入るとμSオーダーの時間遅延を生じて計測値に影響を及ぼす)
割り込み禁止時間を計測してみると、凡そ5μSでしたのでUSBやI2Cの通信に支障は生じないものと思われます。

”mTouch4ChSlider”のコードを少し変えただけで、簡単にCTMUを動かすことが出来ました。価値(有用性&実用性)の高いコード満載のMicrochip社のアプリケーション・ライブラリはお奨めです。

----------------------------------------------------------------------------------------
<ご参考>
mTouch4ChSliderに次のようなコードを見つけました。
typedef volatile near unsigned char* SFR;
typedef unsigned char                IOMASK;

SFR      tris;
SFR      lat;
IOMASK   ioMask;
    tris          = pSensor->trisReg;
    lat           = pSensor->latReg;
    ioMask        = pSensor->ioMask;

    *lat &= ~ioMask; *tris &= ~ioMask;

ポインタ経由でファンクション・レジスタ(LATAとかTRISAとか)にアクセスしています。File Registerにマッピングされているのですから出来て当然と言えばそうなんですが・・・
親族SNS管理人には無い発想だったので興味を覚えました。使うかどうか微妙ですが、知っていて損はありません。
----------------------------------------------------------------------------------------

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感
PIC18F25K50 ブログトップ