2014-06-23に投稿

PIC32MX220F032BでmTouch(CTMU)

PIC32MX220F032BでCTMUを試してみた。
一応プログラムもあるけど、ひとつ問題が。
普通触った時は容量の取得値が下がるはずなんだけど、
色々ためしてもどうも触った時に増えてしまうという逆の反応になってしまっている。
通常時が23くらいで触ると30くらい。

回路かプログラムのどっちかが悪いと思うのだけど調べられていない。
なのでもし使う方がいたらその辺ご注意を。

lcdなんとかの関数は他のファイルのlcd関連を呼んでるだけなので
適宜自分のものに置き換えて下さい。
(過去の記事に似た関数群は掲載してます)

あと、AD変換は自動サンプリングでなく、手動サンプリング。
自動でも動いてたけど、公式?のPDFに手動が載っていたので
最初に書いた不具合の改善に繋がるかと思って変更した。
(改善はしなかった)
なのでAD変換まわりの設定を間違えると
AD変換が完了しなくなってwhileループで停止してしまう。

|c|

include <xc.h>

include <plib.h>

include "lcd32.h"

pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF

pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_8

define SYS_FREQ (80000000L)

define CMT_COUNT 100

DWORD CTM_ReadRobe() {
DWORD temp, cap , i;

temp = 0 ;
for (i=0 ; i &lt; CMT_COUNT ; i++) {
    //sampling開始
    AcquireADC10();
    // ゼロ電位から開始させる為に電荷を放電させる
    CTMUCONbits.IDISSEN = 1 ;
    lcdDelayUs(125) ;
    CTMUCONbits.IDISSEN = 0 ;
    // 電極に充電を行う
    CTMUCONbits.EDG2STAT = 0 ;
    CTMUCONbits.EDG1STAT = 1 ;
    lcdDelayUs(125) ;
    CTMUCONbits.EDG1STAT = 0 ;
    //sampling終了
    mAD1ClearIntFlag();
    ConvertADC10();
    // 電極の電圧を読み取る
    while (!mAD1GetIntFlag()) ;
    cap = ReadADC10(0);
    temp = temp + cap;
    mAD1ClearIntFlag();
}
return temp / CMT_COUNT;              // 10回の平均値を返す

}

int main(void)
{
char s[17];

SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
mJTAGPortEnable(DEBUG_JTAGPORT_OFF);

CloseADC10();   // ensure the ADC is off before setting the configuration

#define PARAM1  ADC_MODULE_ON | ADC_IDLE_CONTINUE | ADC_FORMAT_INTG | ADC_CLK_MANUAL | ADC_AUTO_SAMPLING_OFF | ADC_SAMP_OFF
#define PARAM2  ADC_VREF_AVDD_AVSS | ADC_OFFSET_CAL_DISABLE | ADC_SCAN_OFF | ADC_SAMPLES_PER_INT_1 | ADC_ALT_BUF_OFF | ADC_ALT_INPUT_OFF
#define PARAM3  ADC_CONV_CLK_SYSTEM | ADC_SAMPLE_TIME_0
#define PARAM4  ENABLE_AN2_ANA
#define PARAM5  0
// use ground as neg ref for A | use AN2 for input A
SetChanADC10( ADC_CH0_NEG_SAMPLEA_NVREF | ADC_CH0_POS_SAMPLEA_AN2); // configure to sample AN2
OpenADC10( PARAM1, PARAM2, PARAM3, PARAM4, PARAM5 ); // configure ADC using the parameters defined above
EnableADC10(); // Enable the ADC

CTMUCON = 0x40408000;

lcdInit(SYS_FREQ);
lcdPuts("Monitor Debug");

DWORD i = 0, temp;
while(1)
{
    lcdDelayMs(200);
    temp = CTM_ReadRobe();
    itoa(s, temp, 10);
    lcdClearLine(1);
    lcdPuts(s);
}

}
||

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, React, Flutter, Vue.js, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント