概要
今回は、高速OPAMPモジュールの使い方をご紹介します。
dsPIC33AKシリーズのOPAMPは、従来のdsPIC33Cシリーズと比較して利得帯域幅が20MHz→100MHzとより高い周波数(もしくはゲイン)の信号を増幅することが可能となっております。
・ユーザー調整可能なオフセット
・100 MHzの利得帯域幅
・ハイパワー動作モードとローパワー動作モード
・入力の相補的なPチャネルとNチャネルの差動ペア
関連記事
| 記事 | リンク | |
| 第1回 | dsPIC33AKシリーズについて | dsPIC33Aシリーズに関して – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第2回 | 開発ボード、コンフィグレーション設定、クロック設定について | dsPIC33AKシリーズ②開発ボード,コンフィグレーション設定,クロック設定について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第3回 | CPU性能について | dsPIC33AKシリーズ③CPU性能について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第4回 | FPU性能について | dsPIC33AKシリーズ④FPU性能について – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第5回 | DSPについて | dsPIC33AKシリーズ⑤DSPについて – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第6回 | タイマー1割り込みの使い方 | dsPIC33AKシリーズ⑥Timer1割り込みの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第7回 | PMUの使い方 | dsPIC33AKシリーズ⑦PMUの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第8回 | 高速ADCの使い方 | dsPIC33AKシリーズ⑧高速ADCの使い方 – ぴくおの電子工作的な何かWP (electricpico.com) |
| 第9回(本記事) | 高速OPAMPの使い方 |
開発環境
開発環境を以下に示します。
なお、本記事ではEV68M17A CPUボードを使用します。これは、(fig.2-3)のように、CPUボードに24.95倍の差動増幅用の回路が形成されている為です。
| 項目 | 値 | リンク |
| ベースボード | dsPIC33A CURIOSITY PLATFORM DEVELOPMENT BOARD | dsPIC33A Curiosity Platform Development Board User’s Guide (microchip.com) |
| CPUボード(EV68M17A) 本記事で使用 | EV68M17A – dsPIC33AK128MC106 Motor Control DIM | dsPIC33AK128MC106 Motor Control Dual In-Line Module (DIM) Information Sheet (microchip.com) |
| CPUボード(EV02G02A) 本記事で未使用 | dsPIC33AK128MC106 General Purpose Dual In-Line Module (DIM) | dsPIC33AK128MC106 General Purpose Dual In-Line Module (DIM) | Microchip Technology |
| 統合開発環境 | MPLAB X IDE v6.20 | MPLAB® X IDE | Microchip Technology |
| コンパイラ | MPLAB XC DSC v3.10 | MPLAB® XC DSC Compiler | Microchip Technology |


オペアンプオフセット調整
一般的なオペアンプはオフセット誤差を有しています。このオフセット誤差が小さい事がオペアンプを選ぶ一つの指標となっています。
dsPIC33AKシリーズのオペアンプは内部でオフセット電圧を調整することが可能となっております。
入力信号がゼロのときに出力電圧がゼロにならない現象を指します。理想的なオペアンプでは、入力信号がゼロの場合、出力もゼロとなるはずですが、実際のオペアンプでは製造上のばらつきや内部回路の不完全性などにより、わずかな電圧が出力されることがあります。この誤差がオフセット誤差です。

ソースコード
インクルードファイル
コンフィグレーションファイル、クロック設定ファイルは以下のファイルをインクルードしてください。
■コンフィグレーションファイル (config.h)
■クロック設定ソースファイル(Clock_Driver.c)
■クロックヘッダーファイル(clock_driver.h)
オフセット調整手順
オペアンプのオフセット調整時のソースコードを示します。
①まず(fig.3-4)の図のように結線します
②AMP1CON1bits.DIFFCON = 1u; とし、PMOSを無効にして実行します
③u4g_ADC1CH0_CH1_Deltaの値が小さくなるようにAMP1CON2bits.NOFFSETHPの値を調整します④AMP1CON1bits.DIFFCON = 2u; とし、NMOSを無効にして実行します
⑤u4g_ADC1CH0_CH1_Deltaの値が小さくなるようにAMP1CON2bits.POFFSETHPの値を調整します
⑥AMP1CON1bits.DIFFCON = 0u;とし、オフセット調整完了です
ソースコード全体
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "config.h"
#include "clock_driver.h"
uint32_t u4g_ADC1CH0Data;
uint32_t u4g_ADC1CH1Data;
int32_t u4g_ADC1CH0_CH1_Delta;
int main()
{
//*-----------------------------------------------------------------------*/
/*初期化*/
/*-----------------------------------------------------------------------*/
vdg_Clock_Set_Register();
ANSELAbits.ANSELA2 = 1U; //PortA2をアナログピンに設定
ANSELAbits.ANSELA3 = 1U; //PortA3をアナログピンに設定
ANSELAbits.ANSELA4 = 1U; //PortA4をアナログピンに設定
/*-----------------------------------------------------------------------*/
/* AMP1CON1レジスタ */
/*-----------------------------------------------------------------------*/
AMP1CON1 = 0x00000000u;
AMP1CON1bits.OMONEN = 1u; //オペアンプの出力をAD入力に接続
AMP1CON1bits.IMONEN = 1u; //オペアンプの入力をAD入力に接続
AMP1CON1bits.DIFFCON = 2u; //差動調整モード
AMP1CON1bits.UGE = 1u; //ユニティゲイン
AMP1CON1bits.HPEN = 1u; //ハイパワーモード
AMP1CON1bits.AMPEN = 0u;
/*-----------------------------------------------------------------------*/
/* AMP1CON2レジスタ */
/*-----------------------------------------------------------------------*/
AMP1CON2 = 0x00000000u;
AMP1CON2bits.NOFFSETLP = 0u;
AMP1CON2bits.POFFSETLP = 0u;
AMP1CON2bits.NOFFSETHP = 0x4u; //ハイパワー時のNMOSオフセット
AMP1CON2bits.POFFSETHP = 0x2u; //ハイパワー時のPMOSオフセット
AMP1CON1bits.AMPEN = 1u;
/*-----------------------------------------------------------------------*/
/* AD1CH0レジスタ */
/*-----------------------------------------------------------------------*/
AD1CH0CONbits.TRG1SRC = 1u; /AD変換開始はソフトウェアによる
AD1CH0CONbits.TRG2SRC = 2u; //次回以降のAD変換は即時再トリガー
AD1CH0CONbits.PINSEL = 0u; //AD1CH0+入力はAD1AN0
AD1CH0CONbits.SAMC = 3u;
AD1CH0CONbits.MODE = 3u; //変換モードは「オーバサンプリング」
AD1CH0CONbits.ACCNUM = 3u; //256×オーバーサンプリング
/*-----------------------------------------------------------------------*/
/* AD1CH1レジスタ */
/*-----------------------------------------------------------------------*/
AD1CH1CONbits.TRG1SRC = 1u; //AD変換開始はソフトウェアによる
AD1CH1CONbits.TRG2SRC = 2u; //次回以降のAD変換は即時再トリガー
AD1CH1CONbits.PINSEL = 1u; //AD1CH0+入力はAD1AN1
AD1CH0CONbits.SAMC = 3u;
AD1CH1CONbits.MODE = 3u; //変換モードは「オーバサンプリング」
AD1CH1CONbits.ACCNUM = 3u; //256×オーバーサンプリング
AD1CON = 0x00000000U;
AD1CONbits.ON = 1U;
while(AD1CONbits.ADRDY == 0U)
{
;
}
AD1SWTRGbits.CH0TRG = 1U;
AD1SWTRGbits.CH1TRG = 1U;
/*----------------------------------------------------------------------------*/
/*メインルーチン*/
/*----------------------------------------------------------------------------*/
while(1)
{
if (AD1STATbits.CH0RDY == 1U)
{
u4g_ADC1CH0Data= AD1CH0DATA;
AD1SWTRGbits.CH0TRG = 1U;
}
if (AD1STATbits.CH1RDY == 1U)
{
u4g_ADC1CH1Data= AD1CH1DATA;
u4g_ADC1CH0_CH1_Delta = u4g_ADC1CH0Data - u4g_ADC1CH1Data;
AD1SWTRGbits.CH1TRG = 1U;
}
}
}
オペアンプ特性計測
構成
動作確認は、オシロスコープから出力された0.05V±0.05Vのサイン波を使用して行います。
CH1では出力されたサイン波を直接計測し、CH2ではオペアンプの出力(OA1)を計測します。

ソースコード
ソースコード全体
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include "config.h"
#include "clock_driver.h"
int main()
{
/*-----------------------------------------------------------------------*/
/*初期化*/
/*-----------------------------------------------------------------------*/
vdg_Clock_Set_Register();
ANSELAbits.ANSELA2 = 1U; //PortA2をアナログピンに設定
ANSELAbits.ANSELA3 = 1U; //PortA3をアナログピンに設定
ANSELAbits.ANSELA4 = 1U; //PortA4をアナログピンに設定
/*-----------------------------------------------------------------------*/
/* AMP1CON1レジスタ */
/*-----------------------------------------------------------------------*/
AMP1CON1 = 0x00000000u;
AMP1CON1bits.OMONEN = 0u; //オペアンプの出力をAD入力に接続
AMP1CON1bits.IMONEN = 0u; //オペアンプの入力をAD入力に接続
AMP1CON1bits.DIFFCON = 0u; //差動調整モード
AMP1CON1bits.UGE = 0u; //ユニティゲイン
AMP1CON1bits.HPEN = 1u; //ハイパワーモード
AMP1CON1bits.AMPEN = 0u;
/*-----------------------------------------------------------------------*/
/* AMP1CON2レジスタ */
/*-----------------------------------------------------------------------*/
AMP1CON2 = 0x00000000u;
AMP1CON2bits.NOFFSETLP = 0u;
AMP1CON2bits.POFFSETLP = 0u;
AMP1CON2bits.NOFFSETHP = 0x4u; //ハイパワー時のNMOSオフセット
AMP1CON2bits.POFFSETHP = 0x2u; //ハイパワー時のPMOSオフセット
AMP1CON1bits.AMPEN = 1u;
/*----------------------------------------------------------------------------*/
/*メインルーチン*/
/*----------------------------------------------------------------------------*/
while(1)
{
}
}
結果
以下にフィルタとアンプの特性を示します。ただし、計測環境において使用したツールの精度が高くないため、結果は参考程度にご覧ください。
入力信号が1MHzで減衰しているのは、フィルタのカットオフ周波数が約800kHzであるためです。オペアンプ自体の性能としては、もう少し高周波数まで対応できると考えられます。
■入力 0.05±0.05V/1kHz

■入力 0.05±0.05V/10kHz

■入力 0.05±0.05V/100kHz

■入力 0.05±0.05V/1MHz

記事についての注意点
本記事は慎重に内容を検討し正確さに努めておりますが、もし内容に誤りがあったとしても、この記事を参考にして生じた損害等については一切の責任を負いません。

コメント