yusufu が 2020年04月28日23時36分25秒 に編集
初版
タイトルの変更
PSoC4で電圧計を作る話
タグの変更
PSoC
PSoC4
トランジスタ技術
付録
TSoC
ADコンバータ
バッファ回路
Leafonyプレゼントキャンペーン
本文の変更
# 1. 経緯 電子工作をおうちでも手軽にと思い、トランジスタ技術2019年5月号のTSoC(https://toragi.cqpub.co.jp/tabid/902/Default.aspx) を購入しました。現在手元にはオシロスコープもファンクションジェネレータもないので、TSoCが代わりになればと思い、とりあえず電圧計を作ってみました。 # 2. 回路構成 12bitのADコンバータの入力の前段にバッファ回路を挟み、電圧を読み取ります。このようにすることで入力ピンのインピーダンスが大きくなり、測定対象の回路に影響なく電圧を図ることができます。またPSoCのADコンバータの入力インピーダンスが小さいので、正確にデジタル変換するためにはこのようにする必要があります。 この回路のDAコンバータは電圧を正確に読み取りできているか確認するための信号源です。IDAC7で電流を発生させ、外付けの抵抗で電圧降下を作っています。なので電圧計にはI×Rの電圧が現れます。 AD変換からのカウント数をUARTのTXを用いてPCに送信しています。  # 3. 使用するコンポーネント - オペアンプ オペアンプはModeでフォロワーを選択するとボルテージフォロワ(バッファ回路)の配線に自動で変化します。もちろんオペアンプモードのまま自分でボルテージフォロワを組んでも大丈夫です。今回はバッファ回路として利用するのでフォロワを選択します。 またOutputではオペアンプ出力をピンに出力する場合はOutput to pinを選択し、ピンに出力しない場合はInternal onlyを選択します。今回はピンに出力しないのでInternal onlyを選択します。 そのほか位相補償用のコンデンサの容量等を選択できます。  - ADコンバータ --Timing サンプリングレートを設定できます。今回は直流を試験的に計測するので最遅の1Mサンプリングに設定しています。 --Clock source ADコンバータのクロックの信号源を内部のものを利用するか外部から与えるか選択できます。外部から与える利点がよくわからないのでInternal(内部)を選択します。 --Sample mode ADコンバータのサンプリングが常に動き続ける(Free running)かトリガで作動する(Hardware trigger)かを選択できます。今回はトリガをかけて使用しないのでFreerunningを選択します。 --Input range 参照電圧やシングルエンドモードで使用するときの基準電圧を選択できます。 Vrefは外付けのコンデンサを実装しないと選べないものがあるため、今回はコンデンサなしで使用できるVDDAかVDDA/2を選択します。VDDAはPSoCの電源電圧です。 ADコンバータを差動で使用する場合は端子間の電圧がVDDA(またはVDDA/2)となり、シングルエンドで使用する場合は入力電圧範囲が0-VDDA(または0-VDDA/2)となります。 入力電圧範囲を小さくとると12bit(2048等分)の1目盛りが小さくなるので分解能が向上します。 ※供給電圧が5Vでもconfigureでは3.3Vと表示されます。しかし内部ではちゃんと5Vと認識しているようです。 --Result data format ADコンバータの出力結果の様式を設定することができます。差動モードの場合は出力をunsignedかsignedを選ぶことができますが、シングルエンドモードの場合はsignedで固定です。 Sample avaragedはサンプルの平均をいくつのデータで行うかを設定できます。ConfigureのChannelsでAVGにチェックを入れると使用できます。 Alternate resolutionは初期の12bitで使用しない場合のbit数を設定できます。ConfigureのChannelsでResolutionをALTに設定すると使用できます。   - DAコンバータ ADコンバータが正確に動作しているかを確認するためにDAコンバータから電流を流します。ValueとRangeで電流量を決めることができます。今回は153.6μAの定電流源としています。  - UART PCのUSBを通して信号を送信するにはUARTを使用します。送信する際はTXを使用するのでDirectionをTXonlyとしてそのほかのパラメータは画像のように設定します。Baud rateはいくつでもオッケーです。  # 4.プログラム ```:main.c /* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "project.h" #include <stdlib.h> int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ /* Place your initialization/startup code here (e.g. MyInst_Start()) */ uint32 adc = 100000; int16 ai0 = 0; char aistr[] = " "; char *aiout; aiout = aistr; ADC_SAR_Seq_1_Start(); UART_1_Start(); ADC_SAR_Seq_1_IRQ_Enable(); ADC_SAR_Seq_1_StartConvert(); IDAC7_1_Start(); Opamp_1_Start(); for(;;) { adc--; if (adc == 0){ ai0=ADC_SAR_Seq_1_GetResult16(0); utoa(ai0,aiout,10); UART_1_UartPutString("Count::"); UART_1_UartPutString(aiout); UART_1_UartPutCRLF(1); //UART_1_UartPutString("\r\n"); adc = 100000; } /* Place your application code here. */ } } /* [] END OF FILE */ ``` ## 5.PC側の設定 TXからくる信号はTeraTermを使用しました。TeraTermでPSoCのCOMを選択し、設定→シリアルポートの設定をUARTと同じにすると文字化けせず表示することができます。 