月曜日, 11月 04, 2019

PIC24FV16KM202 w/microstick ADCテスト

 PIC16FのXC8と勝手が違っていたので,メモ。

参考リンク

テストとして,プルアップしたスイッチをADCとして読み,読み値をOLEDに表示。

MCCを使ったセットアップ。

saharaさんのページの通り,[Enable Auto Sampling]にチェック。TADが指示された値より大きくなるように,Conversion Clockを設定。Conversion Triggerは[Internal counter...]を選ぶ。

これだけかと思った。プログラムを走らせてみると,どうもRA0の値を読んでいるっぽい。読みたいのはRB3なのに...

というわけで,MCCのADC画面の下,RB3=AN5のところ,[Scan Enable]にチェックを入れる。これが正解だった。複数チャンネルの時はどうするんだろう... 後で考えよう。

main.cでは,ADC1_ConversionResultGet()を使えば良い。
無事,5Vっぽい値が読めている。スイッチを押すと,ゼロになる。

(追記)
タイマー割り込みを使い,どのぐらいたくさんのサンプリングが行えるか実験した。
結果,5usec間隔の206k サンプル/秒 ぐらいが限界点だと思われた。

ADCの設定では1usecで変換が終わることになっているが,無理は禁物...

PLL使用の32MHz動作。検証は以下のmain.c 生存確認のため,Lチカのスイッチテストと,稼働時間が表示されている。

#include "mcc_generated_files/system.h"
#include "mcc_generated_files/rtcc.h"
#include "mcc_generated_files/mcc.h"

#define FCY 16000000UL
#include <libpic30.h>

#define address 0x3C

struct tm CURRENT_RTCC;

unsigned long int ADC_COUNT = 0;
unsigned long int ADC_COUNT_PREV = 0;

int PREV_SEC = 0;


void My_TMR1_ISR(void) {
    ADC1_ConversionResultGet();
    ADC_COUNT++;
}

int main(void)
{
    // initialize the device
    SYSTEM_Initialize();
 


    __delay_ms(500);

    OLED_Init(0x3C);
    OLED_clear();
    OLED_string("This is from my", 0, 0);
    OLED_string(" PIC24FV16KM202", 0, 8);
    OLED_string("with OLED 128*64.", 0, 24);
    OLED_write();

    __delay_ms(500);

    OLED_clear();
    OLED_write();
       
    char d1[30]="";
   
    TMR1_SetInterruptHandler(My_TMR1_ISR) ;
    TMR1_Start();
   
    while(1) {

        RTCC_TimeGet(&CURRENT_RTCC);

    
        if (CURRENT_RTCC.tm_sec != PREV_SEC) {
           
            PREV_SEC=CURRENT_RTCC.tm_sec;
           
            sprintf(d1,"%02d:%02d:%02d",CURRENT_RTCC.tm_hour,CURRENT_RTCC.tm_min,CURRENT_RTCC.tm_sec);
            OLED_string(d1,0,0);

            TMR1_Stop();
            sprintf(d1,"ADC_COUNT = %8lu",ADC_COUNT);
            OLED_string(d1,0,8);
            OLED_write();
            ADC_COUNT=0;
            TMR1_Start();
        }
        

        _LATA0=_RA1; // for switch test

    };

    return 1;
}

0 件のコメント: