PIC16F1705の特徴の一つは、オペアンプを内蔵していることです。
このオペアンプは、いろいろな使い方ができると思います。
今回は、PIC内のFVR(Fixed Voltage Reference)をオペアンプを介して外部に取り出してみます。
オペアンプはボルテージフォロアで動作させて低インピーダンスで出力します。ボルテージフォロアの場合、入力電圧=出力電圧です。
内部のオペアンプのダイアグラムです。非反転入力には、FVR Buffer2を選び、反転入力には、OP OUTを接続するように設定します。
FVRは、1.024Vですが、SWを押すたびVRF Buffer Gainを変えて、2倍(2.48V)、4倍(4.96V)を出力するようにプログラミングします。
プロジェクトを作成して、MCCを立ち上げます。
オペアンプは、OPA1を使うことにして、OPA1モジュールを導入し、更にFVRモジュールも導入します。
System Moduleは、Clock 8MHz_HFに、LVPはチェックを外しました。
Pinモジュールの設定です。SWは、RC3に接続しますので、RC3をinputに設定し、WPUにチェックを入れて、ウィークプルアップします。この時、RegistersでnWPUENをenabledに設定します。
OPA1モジュールで、入力チャンネルをFVR_Buffer2とします。
FVRモジュールは、FVR_Buffer2 Gainの初期値として、1x=1.024Vとしておきます。
プログラムです。
FVR_Buffer Gainmの設定は、FVRCONレジスタのbi4,bi3で行い
bit4 bit3
1 1 x4
1 0 x2
0 1 x1
0 0 off
ですので、dataを左に2bitシフトして、0x80に加えた値をFVRCONに設定しています。(なお、bit8はFVRENで、1でFVR onです。)
-------------------------------------------------------------
/*
* PIC16F1705 MCC OP Amp test 1
* 2022.4.6
* JH7UBC Keiji Hata
*/
#include "mcc_generated_files/mcc.h"
#define SW RC3
uint8_t n = 1;
void Vref_change(uint8_t data )
{
FVRCON = 0x80 + (data<<2);
}
void main(void)
{
// initialize the device
SYSTEM_Initialize();
while (1)
{
if (SW==0)
{
n++;
if(n > 3)
n=1;
Vref_change(n);
while(SW==0){ //SWが1になるまで待つ
__delay_ms(10);
}
}
__delay_ms(10);
}
}
-------------------------------------------------------------
電源を入れると初期のFVR=1.024Vが出力されます。
実測値は1.04Vでした。
SWボタンを一回押すとFVR_Buffer2 Gain=x2となり、2.048Vが出力されます。
実測値は、2.07Vでした。
更にもう一回SWを押すとFVR_Buffer2 Gain=x4となり、4.096Vになります。実測値は、4.11Vでした。
更に、SWを押すと、Gain=x1となり、最初の状態に戻ります。