---
---
Starter Kit のハード改造で取り付けた、汎用入力とLCD用出力の動作確認のために、汎用入力に取り付けたボリュームの値をADCで読み、LCDにその10進値を表示するプログラムを作成しました。 内部クロック7.37MHzをPLLで80MHzにしてdsPICを最高速度の40MHz命令クロックで動作させています。 出力は、UARTで9600bpsのシリアルデータとして、出力します。 XBeeシリアル受信機 の本体部分に入力し結果を表示させています。
プロジェクトファイル dsP02_LCDADC.zip |
/********************************************************************* AN4の電圧を12bit AD変換し、10進でシリアルLCDに文字表示 変換は、プログラムでSAMPをクリアすると開始 DMAは使用していない *********************************************************************/ #define FCY 39613750UL //7.37MHz clockから生成 #include <p33FJ256GP506.h> #include <libpic30.h> #include "L_sLCD.h" #include <stdio.h> // コンフィグラーション _FGS(GWRP_OFF & GCP_OFF); _FOSCSEL(FNOSC_FRC); _FOSC(FCKSM_CSECMD & OSCIOFNC_ON & POSCMD_NONE); _FWDT(FWDTEN_OFF); // プロトタイプ void Init_ADC(void); int main (void){ char msgDsp[21]; unsigned int result; // --------------------------------------------------- // Fcy 40MHz動作のため内部クロックをPLLで80MHzにする // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2 (25.2ns) // Fosc= 7.37M*43/(2*2)=79.2275Mhz PLLFBD=41; // M = 43 CLKDIVbits.PLLPOST=0; // N1 = 2 CLKDIVbits.PLLPRE=0; // N2 = 2 OSCTUN=0; __builtin_write_OSCCONH(0x01); // FRCからPLLに切替 __builtin_write_OSCCONL(0x01); while (OSCCONbits.COSC != 0b01); // PLLの安定を待つ while (!OSCCONbits.LOCK); // --------------------------------------------------- Init_ADC(); // AD変換の初期化 // --------------------------------------------------- LCD_int(); // LCD初期化 LCD_posyx(1,0); // 2行目に表示 LCD_str("A/D val = "); // -------------------------------------------- while(1){ AD1CON1bits.SAMP = 0; // ADC開始 while(!AD1CON1bits.DONE); // 完了を待つ result = ADC1BUF0; // 結果を取得 LCD_posyx(1,10); // 2行目に sprintf(msgDsp,"%4d",result); // 10進に変換し LCD_str(msgDsp); // LCDに表示 __delay_ms(200); } } // ******************* AD変換の初期化 **************************** // --------------------------------------------------------------- // AD1CON1 =0x0404; // * 12 bit ADC、符号なし整数 // * SAMPクリアで変換開始 // * 変換終了でサンプル開始 // --------------------------------------------------------------- void Init_ADC(void){ _ADON = 0; // ADC OFF _ADSIDL = 0; // Idle時にも動作 _ADDMABM = 0; // Scatter/Gatherモード(DMAでないのでNA) _AD12B = 1; // 12bit ADC _FORM = 0; // 符号なし整数 _SSRC = 0; // SAMPを[0]でサンプル終了し変換開始 _SIMSAM = 0; // AD12B=[1]なのでNA _ASAM = 1; // 変換終了後すぐにサンプル開始 _SAMP = 0; // サンプル終了し変換開始 // --------------------------------------------------------------- // AD1CON2 =0x0000; // * 基準電圧 AVdd : AVss , // * channel 0 使用、スキャンなし // --------------------------------------------------------------- _VCFG = 0; // VREF+:AVDD、VREF-:AVSS _CSCNA = 0; // スキャンしない _CHPS = 0; // AD12B=[1]なのでNA _SMPI = 0; // 変換後毎回+1(DMA使用しないのでNA) _BUFM = 0; // DMA転送は毎回バッファの先頭から _ALTS = 0; // 入力はSampleA回路のみ // --------------------------------------------------------------- // AD1CON3 =0x0010; // * Tad=17*Tcy=428ns > 117.6ns // * 変換周期は、7.3us (141ksps) // --------------------------------------------------------------- _ADRC = 0; // システムクロックを分周して使用 _SAMC = 0; // SSRC=[1]なのでNA _ADCS = 16; // Tad=(16+1)*Tcy=428ns > 117.6ns // --------------------------------------------------------------- // AD1CHS0 =0x0404; // * 入力 AN4 // --------------------------------------------------------------- _CH0NB = 0; // SampleBの負入力:VREF- _CH0SB = 4; // SampleBの正入力:AN4 _CH0NA = 0; // SampleAの負入力:VREF- _CH0SA = 4; // SampleAの正入力:AN4 // --------------------------------------------------------------- AD1CSSL =0x0000; // スキャンしない // --------------------------------------------------------------- AD1PCFGL=0xFFEF; // AN4 input is Analog // --------------------------------------------------------------- _PCFG4 = 0; // AN4をアナログ入力に設定 // --------------------------------------------------------------- AD1CON1bits.ADON =1; // ADC ON }