dsPIC33AKシリーズ⑨高速OPAMPの使い方

dsPIC33Aシリーズ

概要

今回は、高速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の使い方
(fig.1-1)各関連記事リンク

開発環境

開発環境を以下に示します。
なお、本記事では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 DIMdsPIC33AK128MC106 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.20MPLAB® X IDE | Microchip Technology
コンパイラMPLAB XC DSC v3.10MPLAB® XC DSC Compiler | Microchip Technology
(fig.2-1)本記事の動作確認環境

(fig.2-2)本記事の動作確認環境
(fig.2-3)オペアンプ周辺の回路

オペアンプオフセット調整

一般的なオペアンプはオフセット誤差を有しています。このオフセット誤差が小さい事がオペアンプを選ぶ一つの指標となっています。
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)を計測します。

(fig.2-4)動作確認構成

ソースコード

ソースコード全体

#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

記事についての注意点

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

コメント

タイトルとURLをコピーしました