PIC16F1705の特徴の一つは、オペアンプを内蔵していることです。
このオペアンプは、いろいろな使い方ができると思います。
今回は、PIC内のFVR(Fixed Voltage Reference)をオペアンプを介して外部に取り出してみます。
オペアンプはボルテージフォロアで動作させて低インピーダンスで出力します。ボルテージフォロアの場合、入力電圧=出力電圧です。
![](https://blogimg.goo.ne.jp/user_image/26/b5/220f6cc1f2a2d4ec23ed3a5dc8a72208.png)
内部のオペアンプのダイアグラムです。非反転入力には、FVR Buffer2を選び、反転入力には、OP OUTを接続するように設定します。
![](https://blogimg.goo.ne.jp/user_image/1e/0b/6ccf1964b44144e0b1ddbfea66ab4825.png)
FVRは、1.024Vですが、SWを押すたびVRF Buffer Gainを変えて、2倍(2.48V)、4倍(4.96V)を出力するようにプログラミングします。
プロジェクトを作成して、MCCを立ち上げます。
オペアンプは、OPA1を使うことにして、OPA1モジュールを導入し、更にFVRモジュールも導入します。
System Moduleは、Clock 8MHz_HFに、LVPはチェックを外しました。
![](https://blogimg.goo.ne.jp/user_image/02/71/b51d4f8723c106ea2382125dc6a39887.png)
Pinモジュールの設定です。SWは、RC3に接続しますので、RC3をinputに設定し、WPUにチェックを入れて、ウィークプルアップします。この時、RegistersでnWPUENをenabledに設定します。
![](https://blogimg.goo.ne.jp/user_image/32/b2/2dd9b981bb608c68b9e1cc18300c0dc1.png)
OPA1モジュールで、入力チャンネルをFVR_Buffer2とします。
![](https://blogimg.goo.ne.jp/user_image/30/51/6b997c32c0e747cc81b2d06d4ba04aab.png)
FVRモジュールは、FVR_Buffer2 Gainの初期値として、1x=1.024Vとしておきます。
![](https://blogimg.goo.ne.jp/user_image/3c/a1/d12848005024a754824dc8930610fe47.png)
プログラムです。
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でした。
![](https://blogimg.goo.ne.jp/user_image/48/e9/710d02f0f0afcd2d795d9750aed585cc.jpg)
SWボタンを一回押すとFVR_Buffer2 Gain=x2となり、2.048Vが出力されます。
実測値は、2.07Vでした。
![](https://blogimg.goo.ne.jp/user_image/4c/6c/1f4c6b03e3cbc429347373a9592df503.jpg)
更にもう一回SWを押すとFVR_Buffer2 Gain=x4となり、4.096Vになります。実測値は、4.11Vでした。
![](https://blogimg.goo.ne.jp/user_image/1e/30/99cb9c3532973754fce72c905edee8fb.jpg)
更に、SWを押すと、Gain=x1となり、最初の状態に戻ります。