yusufu が 2020年04月29日18時31分38秒 に編集
コメント無し
タイトルの変更
PSoC4で電圧計を作る話
PSoC4で抵抗計を作る話
タグの変更
ADコンバータ
付録
バッファ回路
本文の変更
# 経緯 電子工作をおうちでも手軽にと思い、トランジスタ技術2019年5月号のTSoC(https://toragi.cqpub.co.jp/tabid/902/Default.aspx) を購入しました。現在手元にはオシロスコープもファンクションジェネレータもないので、TSoCが代わりになればと思い、とりあえず電圧計を作ってみました。
# PSoCとは 一言でいうと「パソコン内でリアルにはんだ付けできるIC」です。パソコンの画面上で設計した回路がそのままICの中に作りこまれて動作します。 IC内にはオペアンプやコンパレータ、ADコンバータなどのアナログコンポーネントが内蔵されており、回路を設計するだけで、内部で結線されIC内で動き出します。まさに自分だけのアナログICです。 - [PSoCについて](https://elchika.com/article/ba2c51ef-4a54-4fa9-bb44-53a42ac316c2/)
# 回路構成 12bitのADコンバータの入力の前段にバッファ回路を挟み、電圧を読み取ります。このようにすることで入力ピンのインピーダンスが大きくなり、測定対象の回路に影響なく電圧を図ることができます。またPSoCのADコンバータの入力インピーダンスが小さいので、正確にデジタル変換するためにはこのようにする必要があります。
この回路のDAコンバータは電圧を正確に読み取りできているか確認するための信号源です。IDAC7で電流を発生させ、外付けの抵抗で電圧降下を作っています。なので電圧計にはI×Rの電圧が現れます。 AD変換からのカウント数をUARTのTXを用いてPCに送信しています。
DAコンバータで既知の電流を出力し、抵抗で生じた電圧を読み取ることで抵抗値を読み取ることができます。 AD変換からのカウント数はUARTのTXを用いてPCに送信しています。
![キャプションを入力できます](https://camo.elchika.com/8b5841c90fe50d2e61bd48cae54dd0b4f5a19e72/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65313235393434392d666531612d343733632d626362372d6263663830656337626139622f34376335373939352d626666352d346463332d386265322d346133633031323265366431/) # 使用するコンポーネント - オペアンプ オペアンプはModeでフォロワーを選択するとボルテージフォロワ(バッファ回路)の配線に自動で変化します。もちろんオペアンプモードのまま自分でボルテージフォロワを組んでも大丈夫です。今回はバッファ回路として利用するのでフォロワを選択します。 またOutputではオペアンプ出力をピンに出力する場合はOutput to pinを選択し、ピンに出力しない場合はInternal onlyを選択します。今回はピンに出力しないのでInternal onlyを選択します。
そのほか位相補償用のコンデンサの容量等を選択できます。
![キャプションを入力できます](https://camo.elchika.com/e2a8ff22f2299be31321b97c3c19bf66ad0a220f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65313235393434392d666531612d343733632d626362372d6263663830656337626139622f35393065303762392d383562342d343764312d383265312d316361656461366236363038/) - 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に設定すると使用できます。
より正確にするためには平均化するといいと思います。
![キャプションを入力できます](https://camo.elchika.com/a02aff6d3c8ff26304079f215e8f88ef46e5c57b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65313235393434392d666531612d343733632d626362372d6263663830656337626139622f38623562346363362d343534372d343536332d626638362d313431616530326630656161/) ![キャプションを入力できます](https://camo.elchika.com/24788157c6513451c329838a796ae28e63c63b11/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65313235393434392d666531612d343733632d626362372d6263663830656337626139622f35313337643465612d326662652d346538642d393738372d343162303732643061373434/) - DAコンバータ
ADコンバータが正確に動作しているかを確認するためにDAコンバータから電流を流します。ValueとRangeで電流量を決めることができます。今回は153.6μAの定電流源としています。
今回は153.6μAの定電流源としています。
![キャプションを入力できます](https://camo.elchika.com/dbf76035bac6adf639473ad44baea0993dadaa6d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65313235393434392d666531612d343733632d626362372d6263663830656337626139622f65396531656262312d643639642d346230622d613565642d323739343965623965393964/) - UART
PCのUSBを通して信号を送信するにはUARTを使用します。送信する際はTXを使用するのでDirectionをTXonlyとしてそのほかのパラメータは画像のように設定します。Baud rateはいくつでもオッケーです。
PCのUSBを通して信号を送信するにはUARTを使用します。送信する際はTXを使用するのでDirectionをTXonlyとしてそのほかのパラメータは画像のように設定します。
![キャプションを入力できます](https://camo.elchika.com/89d04c7c9353daea72369681bfbd77ddadb9d2db/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65313235393434392d666531612d343733632d626362372d6263663830656337626139622f32323131616534342d363730662d343731392d383434332d396662386163333361313363/) # プログラム ```: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が0になるたびにPCに結果を出力
adc--; if (adc == 0){
ai0=ADC_SAR_Seq_1_GetResult16(0); utoa(ai0,aiout,10);
ai0=ADC_SAR_Seq_1_GetResult16(0);//ADCのカウント数をsignedで取得 utoa(ai0,aiout,10);//カウント数を文字列に変換 //文字列をPCに送信
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 */ ``` ## PC側の設定 TXからくる信号はTeraTermを使用しました。TeraTermでPSoCのCOMを選択し、設定→シリアルポートの設定をUARTと同じにすると文字化けせず表示することができます。 ![キャプションを入力できます](https://camo.elchika.com/aa607d9557137da133c8bfd74dbf0e718f771383/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65313235393434392d666531612d343733632d626362372d6263663830656337626139622f62376266313036362d386333662d346335332d613639622d626634313632643739376337/)