JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC16F18326 MCC FVRテスト

2024-02-08 13:35:50 | MPLAB X MCC
 PIC16F18326が内蔵しているFVR(Fixed Voltage Reference 低電圧リファレンス)のテストをします。

 FVRの構成です。(説明書より)

 bufferが2つあり、buffer1がADC用、buffer2がComperators and DAC用です。それぞれGainを1x,2x,4xに設定できます。

 今回はADC用のプラス電源としてFVRを利用してみます。
 テストする回路です。



 VDDをボリュームで調整して、その電圧をRC3からADCに入力し、変換値をI2C LCD1602に1secごとに表示します。

 プロジェクトを作成し、MCCを立ち上げ、各種設定を行います。
 systemモジュールです。デフォルトのままで、クロックは1MHzです。


 FVAR,ADC,MSSP1モジュールを導入して、それぞれ設定します。
 表示用にI2C LCD1602を使いますので、MSSP1モジュールをI2C Masterモードに設定します。



 ADCモジュールです。Result Alignmentをrightに、Positive ReferenceをFVRに設定します。



 FVRモジュールです。
 FVR_buffer1 Gainを4x 4.096Vに設定します。



 Interruputモジュールです。I2Cで割り込みを使います。



 pinモジュールです。
 ADCのinputはRC3に設定します。
 I2CのSCL1はRC0に、SDA1はRC1に設定します。


 以上の設定をして、Generateして、main.cのプログラムを次のように書きました。
------------------------------------------------
/*
 * PIC16F18326 MCC FVR test
 * 2024.02.08
 * JH7UBC Keiji Hata
*/

#include "mcc_generated_files/mcc.h"
#include "mcc_generated_files/examples/i2c1_master_example.h"

#define I2C_LCD_addr 0x27
#define LCD_EN 0b00000100//Enable
#define LCD_BL 0b00001000//Back Light
#define LCD_CMD 0x00
#define LCD_CHR 0x01
#define LCD_LINE1 0x80
#define LCD_LINE2 0xC0

//I2C LCDに1byteのdataを書き込む
void I2C_write_data(uint8_t data){
     I2C1_Write1ByteRegister(I2C_LCD_addr, (data | LCD_EN | LCD_BL),(data | LCD_BL));
     __delay_us(100);
}

//I2C LCDにコマンドまたは文字を送る
void LCD_write(uint8_t data, uint8_t mode){
     //上位4bitを送る
     I2C_write_data((data & 0xF0) | mode);
     //下位4bitを送る
     I2C_write_data(((data << 4) & 0xF0) | mode);
}

//I2C LCD 初期化
void LCD_init(){
     __delay_ms(40);
     LCD_write(0x33,LCD_CMD);//8bit mode set 2回
     LCD_write(0x32,LCD_CMD);//8bit mode set 1回,4bit mode set
     LCD_write(0x06,LCD_CMD);//Entry mode set
     LCD_write(0x0C,LCD_CMD);//display ON,cursor OFF,blink OFF
     LCD_write(0x28,LCD_CMD);//Function set 4bit mode,2line
     LCD_write(0x01,LCD_CMD);//Clear display
     __delay_ms(1);
}

void LCD_clear(){
     LCD_write(0x01,LCD_CMD);
     __delay_ms(1);
}

void LCD_home(){
     LCD_write(0x02,LCD_CMD);
     __delay_ms(1);
}

void LCD_cursor(uint8_t x,uint8_t y){
     if(y == 0){
     LCD_write(LCD_LINE1 + x,LCD_CMD);
    }
     if(y == 1){
         LCD_write(LCD_LINE2 + x,LCD_CMD);
    }
}

//文字列の表示
void LCD_str(char *str){
     while(*str)
     LCD_write(*str++,LCD_CHR); //pointer increment
}

//1文字表示
void putch(char ch){
     LCD_write(ch,LCD_CHR);
}


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

     // Enable the Global Interrupts
     INTERRUPT_GlobalInterruptEnable();

     // Enable the Peripheral Interrupts
     INTERRUPT_PeripheralInterruptEnable();
     LCD_init();
     printf("FVR & ADC TEST");
     LCD_cursor(12,1);

     int data = 0;

     while (1)
    {
      data = ADC_GetConversion(19);
      LCD_cursor(5,1);
      printf("%5d",data);
      __delay_ms(1000);
    }
}
------------------------------------------------
 putch()関数を定義して、printf()関数を使いますので、Project Propertiesの C standardは、C90に設定しました。

 ブレッドボードです。
 10kΩのボリュームを回すとその電圧に対してADCの値がLCDに表示されます。
 FVRのGainをx4に設定しましたので、電圧0~4.096Vの値がADCで変換されて0~1023の値で表示されます。
 写真では、4.10Vの時1023と表示しています。4.10V以上では1023のままです。


 FVRとADCを利用すれば、デジタル電圧計を作ることができます。
 ただし、ADCの変換値がけっこうふらつきますので、ノイズ対策と平均化などの対策が必要です。



最新の画像もっと見る

コメントを投稿