---
---
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
}