過去に製作したものですが、この製作内容を当時のトラ技のPSoC製作コンテストに応募したら「準グランプリ」になったのでネタしてまとめておきます。
製作概要はトラ技2009年1月のp161に掲載されていますが、ここではもう少し詳細に解説していこうかと思います。
1. 序論
1.1 体脂肪計の原理
測定したインピーダンスが実際の人体の体成分値を表すためには、体成分に影響を及ぼす多様な因子の適切な影響力の評価(常数決定)を行う。周波数50kHz以下の電流は細胞外部を100kHz以上の電流は細胞の組織を通過します。1~1000kHzの多周波を利用するらしい。
中には「リアクタンス測定」といってインピーダンス本来の虚数成分を測定するものもあるみたいだが、人体の場合ほとんど容量成分(コンデンサ)と見なせる。その他準抵抗成分もあるが、数MΩと高い値なので、交流測定法を用いた場合、純抵抗分はほとんど無視できる。
1.2 体脂肪をより正しく測定するためのコツ
これは某体脂肪Tメーカーで説明されていたものです。
より安定した体脂肪のデータを得るために、体脂肪測定の原理を是非ご理解下さい。
- 脂(脂肪)は電気を通しにくいという特性を利用しています。
- 電気を通しやすい水(細胞外液すなわち血液やリンパ液)の影響も大変重要で、決して無視することはできません。
- 腹部(体幹部)の電気抵抗(Ω)は手足(抹消部)間の中の5~10%に過ぎないため、腹部の変化は殆ど表れません。逆に手足部の変化は大きく表れます。
- ちなみに1日24時間の脂の増減はほんのわずかで、ダイエット中の場合、1日数10gから多くとも200g程度です。しかも脂のついている場所が1日の内で移動することはありません。
- 逆に水の変化は大変大きく、1日24時間の間で1kgぐらいは簡単に変動します。(体重が100kgを超えた方には、1日5kgも変動する方がいます。)しかも水のある場所が1日の生活リズムで簡単に移動していきます。
- 特に足の部分は、心臓から遠いため、寝ている時と立っている時とでは水の量が1日の内で大きく変動します。立ち仕事で夕方足がむくみやすい方、あるいは下半身が太いという方の場合、特に注意深くこの変化を観察する必要があるでしょう。
1.3 インピーダンスと体脂肪との関係
この関係は正直、各測定メーカのノウハウがあるので、一般的に入手は困難である。ただ、一部の文献では「ルカスキー( L u k a s k i .H . C) 」の体脂肪を求める式があり、それを参考にしてみる。
ただし、オムロンヘルスケアから数種類出ている体脂肪計でも、正しい姿勢で測定しないと大きな誤差となるらしいので、持ち方や接触部によって算出する式の係数あるいはパラメータテーブルを最適化する必要があると思われる。
男性と女性とでは式①のa,b,c,dのパラメータを変更する必要があります。
一方、測定インピーダンスの変化(誤差)が体脂肪率測定値に与える影響は式①をインピーダンスZに対して微分することにより求められ、以下のように試算される。
従来、ルカスキー(Lukaski.H.C)らの研究に基づいて、生体インピーダンス(BI)法による推定式として次式が用いられている。
2. PSoCを使って体脂肪計をつくってみよう
2.1 直流電圧計で交流電圧を測定
Vin=1(v)としたとき、コンデンサ容量に対するVcの値は図2のようになる。
今回は4端子法で測定するため、電流、電圧をそれぞれ独立して求めるようにする。
つまり、電流はRの両端に発生する電圧よりもとめ、電圧は被測定物の両端に発生する電圧(Vc)より求める。交流の電流は既知の抵抗Rの両端に発生する電圧から求め、電圧はすべていったん直流に変換することから、単に電圧比と抵抗値Rから算出でき、以下のようになる。
2.2 電圧測定精度と検出感度
検波電圧をADコンバータでデータに変換するわけだが、ここで、容量変化における電圧の変化および感度を考察してみる。平均的な人体インピーダンスからそのコンデンサ容量を求めるとだいたい300Ω~900Ω(16000pF~7500pF)程度と推測される。基準抵抗Rをその範囲で一番いい特性になるような諸元を考えると540Ω程度が適度によいことがわかる。その後、実際に実験を行ったところ接触抵抗の影響で1.5kΩ程度がちょうどいいことがわかった。
100mVあたりの電圧変化量は式③を容量に対して微分を行いそれに100pをかけることによりもめられる。その結果を容量C(pF)を横軸にグラフにしたものが以下である。
ADコンバータは14bitΔΣタイプを使用するが、測定範囲は1.5V±BnadGap(1.3V)であり、つまり2.6V幅を14bitで分解するので、約159uV/LSBとなる。
たとえば図 3から7000pFのところをみると100pFあたりの変化量が5.6mVであり、このADコンバータでは35digit相当になる。この分解能で十分かというと、ノイズのことなども考慮するとぎりぎりといった感触。
2.3 測定には4端子法
電圧検出ケーブルを独立して設けることで、ケーブルの直列インピーダンスによる電圧降下や接触抵抗の影響をなくし、低インピーダンスの測定誤差を低減する方法です。ケーブル間の相互インダクタンス (M) による影響を考慮する必要があります。
1つのクリップに絶縁された2つの電極を持つケルビンクリップを使うと、2つのクリップで容易に4端子接続ができます。
実際、接触抵抗の影響は大きく、2端子法では2.7k~9.3kΩにばらついたように見えます(加減によりいくらでも変わる)。
一方、4端子法では電圧、電流は常に比として捕らえられ、触れる強弱によってその関係は維持されています。「恐るべし4端子法」っていうところですね。
【コラム1】
一方、4端子法では電圧、電流は常に比として捕らえられ、触れる強弱によってその関係は維持されています。「恐るべし4端子法」っていうところですね。
3. PSoCで実現する方法
3.1 全体ブロック図
- 4端子法をベースにし、LCD表示、簡易UI、外部IF(UART)を備える。
- インピーダンス測定範囲は300Ω~2000Ω程度を想定
- LCD IFを外せばI2C IFを追加することも可能となる。
- 測定周波数は50kHzを基本とするが、他の周波数での測定が可能となれば別の生体要素も可能となるかもしれない。
- 外付け部品をなるべく少なくする。今回はダイオード1個、抵抗3個、コンデンサ2個の合計6個の部品で構成する。(→後で、測定を安定化させるにはOPAMPを使用した全波整流回路を採用した。)
「図 5:PSoCを用いた体脂肪計のブロック図」に示すブロック構成案はPSoC(CY8C29446)の使用できるリソースを考慮して測定方法を検討したものであり、全て満足できるものにはなっていない。
従って以下の懸念項目がある。
①キャリブレーション(ノイズ成分をどのように除去するのか?)
②検波回路の方式(アクティブ型 or パッシブ型)
③本来はA/D コンバータの前にGAIN,Offset調整用のOPAMPが必要と考えていたが、PSoCの接続リソース不足のため配置できなかった。→後にA/Dコンバータの前にOPAMPバッファを入れることで緩和した。
図 5:PSoCを用いた体脂肪計のブロック図
3.2 オシレータ部
ユーザーモジュール「PWM16」により24MHzを480で分周し、50kHzの方形波を生成し、それをPSoC内部のスイッチトキャパシタ・バンドパスフィルタを用い、正弦波を生成する。
正弦波出力レベルは前段のPGAにて調整可能。
PWM16およびBPFのパラメータを設定することにより1kHz,5kHz,10kHz,50kHz,100kHzの出力も可能。
・BPF設計パラメータ
中心周波数を50kHzとし、1ポールのスイッチトキャパシタフィルタは以下のような特性になるようにパラメータを決める。(参考資料:BPF4 Design.pdf「4 Pole Band Pass Filters using PSoC」)
各周波数設定時のユーザーモジュールパラメータ(SysClk = 24MHz,Vcc=3.3V, VC1=1)
[PWM16(GEN用)] [BPF2※1]
発信周 波数(Hz) | Period | Pusl Width | C1 | C2 | C3 | C4 | Bandwidth (Hz) ※2 | Gain ※2 | GAIN | Period | Pusl Width |
---|---|---|---|---|---|---|---|---|---|---|---|
1k | 23999 | 11999 | 1 | 10 | 7 | 5 | 130 | 0 | 0.750 | 253 | 126 |
5k | 4799 | 2399 | 1 | 10 | 7 | 5 | 600 | 0 | 0.750 | 50 | 25 |
10k | 2399 | 1199 | 2 | 25 | 19 | 4 | 1300 | 0 | 0.750 | 70 | 36 |
50k | 479 | 239 | 1 | 12 | 8 | 5 | 7000 | -1 | 0.750 | 5 | 2 |
100k | 239 | 119 | 2 | 23 | 15 | 5 | 13000 | 0 | 0.750 | 5 | 2 |
※2) この値は計算上だけの値であり、デバイスへの設定パラメータではない。
3.3 アナログ差動アンプ部
3.4 検波回路
ここでは交流を検波し、直流電位に変換する。本来は全波整流回路を使用して安定度と精度を高める方がいいのだが、OPAMPでの絶対値回路はPSoCで構成することができない。また、外部にOPAMPを用いたとしても負電源電圧ソースが必要となり、回路規模も大きくなる。そこで、今回は半端整流回路を用い、周辺回路をなるべく簡単にした。
3.1.1 検波電圧範囲と各諸元
測定精度をなるべく高めるため、後段へのADコンバータの測定レンジにうまく入るようにしなくてはならない。まず検波電圧に要求される。ADの入力レンジはVdd/2±BandGap(1.3V)となっている。従ってこの範囲になり、且つ、電圧可変幅が大きくなるような検波回路となる必要がある。
そのあたりを考慮し検討したものを「図 11:検波部回路」に示す。差動アンプの出力はもともと1.5V(Vdd/2)のオフセット電圧で出力されており、ダイオードD1のバイアス電流としても活かせる。
R2,C2でローパスフィルタを形成する。本来はDCバイアスのために抵抗を介して接地すべきであるが、後段のADコンバータの入力インピーダンスが約55kΩとなることからこれを利用する。
3.4.2 検波特性(シミュレーション)
次にシミュレーションの確度を確認する意味でも実際の実機での出力特性の比較および確認を行った。試験には在庫部品の関係で、設計値とは若干異なる諸元を用いてるが、シミュレータの方の諸元を実際の部品とあわせた。 下記、左がシミュレーション、右がその実測波形の結果である。
検波器入力信号にoffset=1.5V,振幅=1.8Vppとなる信号を入れた。(図 12の「IN」ポイント)
検波出力の平滑された電圧(図 12の「IN」ポイント)は両者とも約1.9Vであった。
次に検波器入力信号にoffset=1.5V,振幅=0Vppとなる信号を入れた。(図 12の「IN」ポイント)
検波出力の平滑された電圧(図 12の「IN」ポイント)では、SIMの1.5Vに対して実測では1.7Vと200mV程度高かった。これは使用したダイオードのモデルが合っていなかった可能性もあるが、けいこうとしては、ほぼ合っていると思われる。
使用するダイオードについてVfの低いショットキーダイオードを使用することを推奨するが、特別に低いVfのものを使用する必要はないようだ。なぜなら、Vfが変わることによりMin-Max値はほぼ同じでオフセットするだけの動きとなるからである。
3.4.3 実測(S/W制御+調整)
当初、交流電流を測定するためのシャント抵抗として560Ωを入れていたのですが、この条件って接触抵抗が0Ωに近いときの話であって、実際に測定してみると皮膚との接触抵抗って結構高いし、ばらつくらしい。 ということで、電流測定用の抵抗を2.2KΩに変更。 あまり高くすると今度は電圧の変化幅がとれなくなります。 今回のこの検波回路が測定の精度に大きく影響する部分でもあります。
1つの計装アンプで電流・電圧を測定するため切り替えるが、その際に、検波回路後段のローパスフィルタが入っているので、その時定数を考慮する必要あり。
←電流最小、電圧ほぼ最大時の状態。また、ADコンバータの動作タイミングを示す。
(デバッグ用にPIOでタイミングを取り出し測定、POLLING_INTERVAL_SHORT = 0x10)
純抵抗器(578Ω)を測定してみましたが、この装置で測定したら594Ωとなった。(誤差2.8%、@R1=560Ω時)
3.5 ADコンバータ部
ここからはプロトタイプとして実際に動作するボードを作る必要がある。
なぜなら、CypressのEvalボードではP2[x]をLCD IFに割り当てており、今回はそのポートをADの入力として使用する。
GlobalParameterのRefMuxの(Vdd/2) ± BandGap設定では0.35 < Vin < 2.95(@3.3V)範囲がAD変換の対象電圧。
3.6 キャリブレーション
3.6.1 考え方
今回の目的としては生体インピーダンスを求めそこから体脂肪率を算出するので、Cの容量を知る必要はない。(容量が知りたい場合、前述の式③でCについて求めればいい)
容量リアクタンスは以下の式⑤から求められ、VC,VRを正確に求める必要がある。
まず、0電位のADコンバータの値を取得することを考える。
ここで各種電圧は図 18に示すようにSELによって切り替えて時分割で測定する。 シングルエンドのOPAMPを使用する場合はAGNDを基準電位として使用できるため、0Vキャリブレーションは必要ないが、今回は4端子法の測定方法を用いるため差動入力となる。この差動アンプ「INSTAMP」は、差動入力0V時には①のポイントにおいてAGND(vdd/2)が出力されるが、INSTAMPの入力オフセットおよび後段の検波回路(ダイオードのVf)、LPFなどによりΔΣADコンバータの入力ポイントでは多少のズレが生じる。
特に検波用のダイオードのVfは温度依存性があるため、差動入力0Vオフセット調整(キャリブレーション)が必要となってくる。今回は図 18の朱書きラインで示すようにキャリブレーション時にP0[4]の出力バッファを一時的にAGND電位に切り替えセレクタの設定によりINSTAMPの±入力をAGNDにして差動入力電位を0Vにする。DCオフセットとしてAGND(vdd/2)を使用することでINSTAMPにとって安定した領域を使用することができる。
一方、フルスケールの電位の構成についてですが、現在のままでは測定して構成することはできません。今回はPSoC内部の高精度な電圧基準(BandoGap:1.3V)を使用しているので、これを信用することにします。従って、ΔΣ14ビットのADコンバータの1LSBあたりの電圧は約160uVとなります。
3.6.2 方法
P0[4]の出力はAnalogOutBuf_2を介しており、このバッファの出力を一時的にAGNDに設定する。
3.6.3 基準抵抗の誤差の影響
今回の測定方法では式⑤で示しているように、ADコンバータの絶対電位よりもむしろ基準抵抗となる1.5kΩの抵抗の精度の方が支配的です。電圧値は同じADコンバータを使用し、それ結果を比として使用しているため、0電位の補正(オフセット調整)がうまくできていれば大きな問題にはなりません。(直線性は必要ですが・・・)
右の表に示すように1.5kΩの基準抵抗を使用したとき、電圧比によって抵抗値の誤差が測定値に影響を与えます。
たとえば2%誤差の抵抗を使用すると電圧比0.7の場合「表 3 1」から21Ωの誤差となります
21×0.1=2.1%の体脂肪率誤差につながります。従って、なるべく精度の高い抵抗を使用する必要があり、1%品を推奨します。
電圧比 | 5%誤差(Ω) | 2%誤差(Ω) | 1%誤差(Ω) |
---|---|---|---|
0.05 | 3.8 | 1.5 | 0.8 |
0.10 | 7.5 | 3.0 | 1.5 |
0.15 | 11.3 | 4.5 | 2.3 |
0.20 | 15.0 | 6.0 | 3.0 |
0.25 | 18.8 | 7.5 | 3.8 |
0.30 | 22.5 | 9.0 | 4.5 |
0.35 | 26.3 | 10.5 | 5.3 |
0.40 | 30.0 | 12.0 | 6.0 |
0.45 | 33.8 | 13.5 | 6.8 |
0.50 | 37.5 | 15.0 | 7.5 |
0.55 | 41.3 | 16.5 | 8.3 |
0.60 | 45.0 | 18.0 | 9.0 |
0.65 | 48.8 | 19.5 | 9.8 |
0.70 | 52.5 | 21.0 | 10.5 |
0.75 | 56.3 | 22.5 | 11.3 |
0.80 | 60.0 | 24.0 | 12.0 |
0.85 | 63.8 | 25.5 | 12.8 |
0.90 | 67.5 | 27.0 | 13.5 |
0.95 | 71.3 | 28.5 | 14.3 |
1.00 | 75.0 | 30.0 | 15.0 |
3.7操作方法
PSoCによる体脂肪計の使い方
・体脂肪率計算に必要な身長・体重・性別のデータはEEPROM(virtual EEPROM)に保存できるようにする。
測定姿勢概要
- 両手で握るまたは両指で摘む。
- 腕と身体は角度90°になるようひじをまっすぐ伸ばす。背筋を伸ばし足を少し開き、直立する。
- 足の内側(内もも)の皮膚同士が触れない。
- 評価比較の時と測定環境が異なるため若干低めに表示される。生体インピーダンスはほぼ安定しているため、計算係数を調整すればよい。(時間がなかったため、この測定系では詳細調整できていない。)
- 検波回路によって特性(安定性、再現性)が大きく影響されているようだ。この辺の細かなチューニングを行えばもう少しシンプルな構成になりそう。
3.8.2 実際の表示サンプル
3.9外部インターフェース部
3.9.1 UART
主に外部のPCなどでデータを収集し、解析を目的とする。従って、本装置からインピーダンス値(Ω)のみを垂れ流しで出すことにする。フォーマットは調歩同期方式,115200bps, 8bit, NoParity。
データはインピーダンス値をテキスト形式でデータの後には<CR>を付加する。本装置で受信するコマンドは存在しない。(たぶん・・・)
出力データは最小0~最大50kΩの範囲で飽和処理を行う。
<出力例> 780.1<CR><LF> 780.2<CR><LF> 790.3<CR><LF> 800.6<CR><LF> :
ここで<CR> = 0x0d,<LF> = 0x0a
3.9.2 I2C
本装置はI2Cスレーブデバイスの扱いとなる。ただし、CY8C29466を使用したプロトタイプの場合、LCDモジュールにIOが振り当てられているため、LCD非対応版でないとI2C IFで接続することはできない。(PSoCのIOの制約)
モード | Slave |
通信速度 | 400kbps |
I2Cアドレス | 1 |
- 体脂肪計測定部は上位にあるMCUと情報のやり取りをおこなう。
- 上位MCUとのIFはI2Cを使用し、「体脂肪測定部」はI2CのSlaveとなる。
- MCUからは測定開始、停止、結果の取得のみを行う。
- 「体脂肪測定部」は身長・体重・性別を設定し、インピーダンスを取得する。
- 拡張UARTとしてI2Cとのブリッジ機能を持つ(MAX UART 4系統)
UARTブリッジ部はそれぞれに送受信それぞれに16byteのバッファ(FIFO)を持つ。
UARTの送信動作
①一度に送信できるデータ数は最大16byteとし、データ数をTXNUM、データの内容をTXDAT1から書き込む。実際にPSoCからシリアルデータを送出中はSTATUSレジスタのbit1=BUSY(1)となる。
UARTの受信動作
①UARTの受信が行われたとき、HOST(M16C)に対して割り込みを発生させる。
②PSoC側では割り込みと発生と同時にINTENABLE=1(禁止)になる。
③受信したデータ長RXNUMに格納され、RXDATA(1~16)に格納される。
④HOSTでは読み込んだ後はINTENABLE=0(許可)にする。
I2C IF仕様 | ||||
address | NAME | 属性 | 内容 | フォーマット |
00 | CMDF | W/R | コマンドフラグ | bit0: 体脂肪計動作(0:OFF,1:ON) |
01 | INTENABLE | W/R | 受信割り込み許可 | 0:受信許可、1:受信禁止 |
02 | HEIHT1 | W/R | 身長データ(MSB) | IEEE745形式(MSB) |
03 | HEIHT2 | W/R | 身長データ | IEEE745形式 |
04 | HEIHT3 | W/R | 身長データ | IEEE745形式 |
05 | HEIHT4 | W/R | 身長データ(LSB) | IEEE745形式(LSB) |
06 | WEGHT1 | W/R | 体重データ(MSB) | IEEE745形式(MSB) |
07 | WEGHT2 | W/R | 体重データ | IEEE745形式 |
08 | WEGHT3 | W/R | 体重データ | IEEE745形式 |
09 | WEGHT4 | W/R | 体重データ(LSB) | IEEE745形式(LSB) |
0A | SEX | W/R | 性別 | 0:男、1:女 |
0B | AVEBUM | W/R | 体脂測定肪平均回数 | |
0C | TXNUM | W/R | UART1送信データ数 | 1~16 |
0D | TXDAT1 | W/R | シリアル送信データ(1) | |
0E | TXDAT2 | W/R | シリアル送信データ(2) | |
0F | TXDAT3 | W/R | シリアル送信データ(3) | |
10 | TXDAT4 | W/R | シリアル送信データ(4) | |
11 | TXDAT5 | W/R | シリアル送信データ(5) | |
12 | TXDAT6 | W/R | シリアル送信データ(6) | |
13 | TXDAT7 | W/R | シリアル送信データ(7) | |
14 | TXDAT8 | W/R | シリアル送信データ(8) | |
15 | TXDAT9 | W/R | シリアル送信データ(9) | |
16 | TXDAT10 | W/R | シリアル送信データ(10) | |
17 | TXDAT11 | W/R | シリアル送信データ(11) | |
18 | TXDAT12 | W/R | シリアル送信データ(12) | |
19 | TXDAT13 | W/R | シリアル送信データ(13) | |
1A | TXDAT14 | W/R | シリアル送信データ(14) | |
1B | TXDAT15 | W/R | シリアル送信データ(15) | |
1C | TXDAT16 | W/R | シリアル送信データ(16) | |
1D | STATUS | R | ステータスフラグ | bit0: UART1 SEND(0:IDLE,1:BUSY) bit1: UART1 RECIVE(0:IDLE,1:BUSY) |
1E | FATVAL1 | R | 体脂肪率(%) (MSB) | IEEE745形式(MSB) |
1F | FATVAL2 | R | 体脂肪率(%) | IEEE745形式 |
20 | FATVAL3 | R | 体脂肪率(%) | IEEE745形式 |
21 | FATVAL4 | R | 体脂肪率(%) (LSB) | IEEE745形式(LSB) |
22 | CUADH | R | 電流測定AD値(MSB) | bit5~bit0:上位6bitデータ |
23 | CUADL | R | 電流測定AD値(LSB) | bit7~bit0:下位8bitデータ |
24 | VLADH | R | 電圧測定AD値(MSB) | bit5~bit0:上位6bitデータ |
25 | VLADL | R | 電圧測定AD値(LSB) | bit7~bit0:下位8bitデータ |
26 | RXNUM | R | UART1受信データ数 | 1~16 |
27 | RXDAT1 | R | シリアル受信データ(1) | |
28 | RXDAT2 | R | シリアル受信データ(2) | |
29 | RXDAT3 | R | シリアル受信データ(3) | |
2A | RXDAT4 | R | シリアル受信データ(4) | |
2B | RXDAT5 | R | シリアル受信データ(5) | |
2C | RXDAT6 | R | シリアル受信データ(6) | |
2D | RXDAT7 | R | シリアル受信データ(7) | |
2E | RXDAT8 | R | シリアル受信データ(8) | |
2F | RXDAT9 | R | シリアル受信データ(9) | |
30 | RXDAT10 | R | シリアル受信データ(10) | |
31 | RXDAT11 | R | シリアル受信データ(11) | |
32 | RXDAT12 | R | シリアル受信データ(12) | |
33 | RXDAT13 | R | シリアル受信データ(13) | |
34 | RXDAT14 | R | シリアル受信データ(14) | |
35 | RXDAT15 | R | シリアル受信データ(15) | |
36 | RXDAT16 | R | シリアル受信データ(16) |
3.10 生体インピーダンスから体脂肪率へ
3.10.1 測定タイミング
図 19に電圧・電流取得タイミングおよびインピーダンス計算&体脂肪率計算の演算タイミングを示す。算出に使用するインピーダンス値はLONG_PERIOD_COUNTLIMIT÷2回の平均となる。測定開始から約4.1秒間、ユーザーはHOLDして安定するまでの時間であり、その後約4.1秒かけて実際の電流・電圧を測定する。
3.10.2 変換演算処理
「1.3章 インピーダンスと体脂肪との関係」に示す「式①」および「式②」をベースにして実測データと比較を行い、それぞれの係数を調整してみるが、他に最適な算出方法がれば試してみる。
【考察】
整流回路としてはアクティブ型の全波整流回路を使用すると一見ばらつきの小さいデータが得られるような気がする。ただ、それよりも前述にしたように電極の大きさ、持ち方、測定するときの姿勢などが測定値に対するばらつきの大きな要因になっているのも事実で、今回の評価ではどこまで切り分けできたかが不安なところもある。
4. 処理パフォーマンス
4.1 Column ClockによるINSAMPの出力特性
4.2 S/W処理のパフォーマンス評価
4.2.1 DelSigADコンバータの処理
Buff = 0; for(i=0;i < 0x20;i++) Buff += GetAddata(); VoltRes = Buff >> 5; //32回平均 VoltRes -= CalDat; ActiveMesFlg = CURRENT; int GetAddata(void){ //ΔΣ14bit ADコンバータ値取得 while (1) { if ( DelSig_fIsDataAvailable() ) { return DelSig_iGetDataClearFlag(); } } return 0; }
上記の処理時間を測定してみた。
条件 | 処理時間 |
1: 3.3V CPU Clock = 12MHz | 約4.3msec |
2: 3.3V CPU Clock = 6MHz | 約4.3msec |
結果:DelSigモジュール(ΔΣAD)は量子化について専用のデジメーターを備えており、他のAD方式のインクリメンタル方式よりもCPUの負荷が低。そのため、CPUクロックを変えてもほとんど変換時間には影響を及ぼさない。
4.2.2 浮動小数点演算
① retio = (float)VoltRes / (float)CurrentRes * 1500.0; ② chbuff = ftoa(retio, &stat);
上記の処理時間を測定してみた。
条件 | 処理時間 |
1: 3.3V CPU Clock = 12MHz | 約6.1msec |
2: 3.3V CPU Clock = 6MHz | 約13.0msec |
結果:この処理はCPUですべて行うため、負荷が高い。特に浮動小数点計算はライブラリで処理を行うため、時間がかかる。CPU Clock=12MHzの時、①の処理は約740usec、②の処理は約5.36msecとなり、上記の処理の約90%はほとんど浮動小数点から文字列への変換に時間がかかっていることがわかる。このことに留意すると、測定周期は100msec程度を考えておいた方がよさそうだ。ちなみに、3.3VではCPUを24MHzで動作させることはできない。試しでやってみたけど、やはり動かなかった。
5. まとめ
5.1 測定条件による測定結果
市販されている体脂肪計との測定比較を行ってみた。数人の被験者で試してみたところ下記のような良好な測定結果を得ることができた。
PSoCを使用した利点として以下の点が上げられる。
- これまで大きなL、Cのフィルタ部品を使うことなく、50KHzと比較的低い周波数の正弦波を生成することがでた。
- 今回の4端子法のような複雑な測定経路に対しても内蔵アナログスイッチをうまく組み合わせることで外付けのアナログスイッチを使用せずに済んだ。
- 体脂肪計は4端子法インピーダンス値から体脂肪率に変換する計算処理が1つのデバイスの中で行うことができるため、「インピーダンス→体脂肪(%)」のような各メーカーのIPをうまく隠蔽することができ、完結した機能を持つデバイスとして拡販することに対して優位なカタチとすることが可能となる。
一方、課題を挙げてみると
- 現在100%でないキャリブレーション方法や、測定ばらつきを小さくする方法
- 測定安定度を確保しつつ検波回路をもう少しシンプルな回路を使った測定方法