/******************************************************************* * ThermistorThermometerPIC24F * * AN1: A/D input port * A/D sampling period: 0.5sec * A/D Resolution: 10Bit * Vref = 3.23V(実測値) * Input= NTC宝サーミスタ:約2kΩ/25℃, 1.5V-> 温度換算にて液晶表示 * * Condition: * 8MHz Internal RC oscillator, 4x PLL (8MHzx4= 32MHz) * Fcy=32MHz/2=16MHz, Tcy=62.5ns * * CPU: PIC24FJ64GA002 * * 2022/7/2: N.Ishii ********************************************************************/ #include #include "LCD_Lib3.h" #include "stdio.h" #include "math.h" // Set Configuration Word 1 _CONFIG1 ( JTAGEN_OFF & // JTAG Port: OFF GCP_OFF & // Code Protect: OFF GWRP_OFF & // Write Protect:OFF BKBUG_OFF & // Background Debug: OFF COE_OFF & // Clip On Emulation: OFF ICS_PGx1 & // Select ICD Pin: EMUC/EMUD-> PGC1/PGD1 For Common Use FWDTEN_OFF // WDT: OFF ) // Set Configuration Word 2 _CONFIG2 ( IESO_OFF & // 2 Speed Start Up: OFF FNOSC_FRCPLL & // 8MHz Internal RC oscillator, 4x PLL-> 8MHzx4=32MHz FCKSM_CSDCMD & // Change Clock Control: OFF Clock Monitor: OFF OSCIOFNC_ON & // OSCO/RA3 function: Used RA3 IOL1WAY_OFF & // RP Register Protection: Unlimited Writes To RP Registers I2C1SEL_PRI & // I2C1 pins Select: Use Primary I2C1 pins POSCMOD_NONE // Oscillator Selection: Primary disabled ) //----------------------------------------------------------------------------------- unsigned int ResultData; // AD変換値 unsigned int B= 3380; // B定数 unsigned int R1= 1993; // 1.993kΩ unsigned int T0= 25; // 基準温度25℃ float THR; // サーミスタ抵抗 float TEMP; // 温度 float Volt; // AD変換値から換算された電圧値 //-------------------------------------------------------------- /// ADC1 interrupt routine (t = 500mS) void __attribute__((__interrupt__, auto_psv)) _ADC1Interrupt(void) { char buf[4]; LATAbits.LATA4 = !LATAbits.LATA4; // 緑LEDの反転制御 while(!IFS0bits.AD1IF); // End of convertion ? ResultData = ADC1BUF0; // Read 10bit ADC Data From AN1 BUF Volt= ResultData * 3.23/1023; //アナログ値から電圧換算 THR= R1*Volt/(3.23-Volt); // 電圧値からサーミスタ抵抗値換算 TEMP = 1/(log(THR/R1)/B+1/(T0+273.0))-273.0; // 温度計算 sprintf((char *)buf,"%.1f",TEMP); lcd_cmd(0x88); lcd_str(buf); lcd_str("[゚C]"); IFS0bits.AD1IF = 0; // Clear Intterrupt ADC_Flag } //----------------------------------------------------------- // Main routine int main(void) { // CPU Clock Pre Scalere 1:1 CLKDIV = 0; // Set AD1PCFG: ANx Port is All Digital Pin AD1PCFG = 0xFFFF; TRISAbits.TRISA3 = 0; // RA3 is RED_LED output used debug TRISAbits.TRISA4 = 0; // RA4 is GREEN_LED output LATAbits.LATA3 = 1; // RED_LED OFF LATAbits.LATA4 = 1; // GREEN_LED OFF TRISB = 0x03FF; // RB15-10:LCD データ・制御出力 // RB1-0:SW入力、その他未使用:入力 lcd_init(); // Initialize LCD lcd_clear(); // ADC Module OFF AD1CON1bits.ADON=0; /// Inittalize Timer3:T3= Tcy*PS*n= 0.0000625mS*256*31250 = 500mS PR3 = 31249; // n = 31249 (PR3=n-1) T3CON = 0b1000000000110000; // T3_ON, T3_GATE_OFF, T3_PS_1_256, T3_SOURCE_INT /// Initialize ADC: Mod Initialize SQ 110105 AD1PCFG = 0xFFFD; // AD Channel-1 Aanalog Input AD1CHS = 0x0001; // AD Channel-1 Select AD1CSSL = 0x0000; // Scan_None AD1CON3 = 0x1F05; // Acquisition Time=31Tad, 1Tad=5*Tcy AD1CON2 = 0x0000; // Vref=AVdd-AVss, Scan Off, Interrupt Timming=EOC AD1CON1 = 0x0040; // Module Off, Format Integer, T3 Triger, Set SAMP Bits-> Start Sampling // ADC Module ON AD1CON1bits.ADON = 1; // Start Auto Sampling AD1CON1bits.ASAM = 1; // Enable ADC intterrupt IEC0bits.AD1IE = 1; while(1); }