PSoCで電圧・電流計(2)
2015-01-20
だいぶ前に作ったままで放置していた電圧・電流計をケース(?)に収めてみました。

ケースというのは名ばかりで百均で売っていたアクリル製のカードスタンドを使いました。
曲げてある部分を電気ストーブで暖め、ゆっくりと広げていきました。かなり熱い思いをしましたが^^;;
うまいぐあいに角度が付いて机の上に置くと見やすいです。

ISSP用の穴もあけました。これを機にソースコードの見直しを行いました。

恥ずかしながらの裏面、見にくいのですが電流検出抵抗はデジットで買った0.1オームチップ抵抗です。

ちょっとした小物にはちょうどいいです、安いし。
問題は密閉できないのでそのうち埃だらけになることです。
ここのところArduinoばかりでしたので久しぶりのPSoCを楽しみました。
使い慣れた環境はいい、たとえArduinoみたいな豊富なライブラリーがなくても。(と強がり)

ケースというのは名ばかりで百均で売っていたアクリル製のカードスタンドを使いました。
曲げてある部分を電気ストーブで暖め、ゆっくりと広げていきました。かなり熱い思いをしましたが^^;;
うまいぐあいに角度が付いて机の上に置くと見やすいです。

ISSP用の穴もあけました。これを機にソースコードの見直しを行いました。

恥ずかしながらの裏面、見にくいのですが電流検出抵抗はデジットで買った0.1オームチップ抵抗です。

ちょっとした小物にはちょうどいいです、安いし。
問題は密閉できないのでそのうち埃だらけになることです。
ここのところArduinoばかりでしたので久しぶりのPSoCを楽しみました。
使い慣れた環境はいい、たとえArduinoみたいな豊富なライブラリーがなくても。(と強がり)
スポンサーサイト
デジットの7セグメントLCDをArduinoで動かす
2015-01-19
オシロで謹賀新年(3)drawToを書き直す
2015-01-15
1月も半ばだというのに、いまだに正月ネタかと言われそうですが^^;;
前の実験では描画速度が30.9mSでしたが、drawToルーチンを書き直すことによって高速化できました。
ラジオペンチさんのdrawToルーチンは巧妙かつシンプルなのですが、計算量が多くなります。
そこで泥臭く条件分けして計算量を減らしました。私の苦手なif-elseの入れ子状態(^^;;)なので頭が混乱してしまいます。
結果、描画速度は17.5mSになりました。これなら画面のちらつきはありません。

数字の”1”の字体をちょっと変えてます。
74HC595を手に入れたのでR-2Rラダーで8BitDACを作ってもうちょっと高速化を試してみます。
前の実験では描画速度が30.9mSでしたが、drawToルーチンを書き直すことによって高速化できました。
ラジオペンチさんのdrawToルーチンは巧妙かつシンプルなのですが、計算量が多くなります。
そこで泥臭く条件分けして計算量を減らしました。私の苦手なif-elseの入れ子状態(^^;;)なので頭が混乱してしまいます。
結果、描画速度は17.5mSになりました。これなら画面のちらつきはありません。

数字の”1”の字体をちょっと変えてます。
74HC595を手に入れたのでR-2Rラダーで8BitDACを作ってもうちょっと高速化を試してみます。
24ビットADコンバータモジュールを試す(2)
2015-01-10
Bチャンネルで実験をすることにし、部品を追加しました。
AVDDを分圧し、その中点電圧を入力のグランドとし、BチャンネルのINNBに。入力電圧を分圧してINPBにつないでおきます。

まずはオフセットの測定。
気休めですがノイズの影響を減らすため、金属のケース(お菓子の入れ物)に押し込み、回路の最低電圧をケースと接続しておきます。
白いミノムシクリップがそれです、こういうときは黒でしょう・・・そうなんですが、手持ちにこれしかなかったんです^^;;

入力は無接続、ソフトによる平均化はせず、ADコンバータの値をシリアル接続でTera Termで読み込み、エクセルでグラフ化しました。データ数は約6000個です。

グラフの黄線はエクセルによる100回の移動平均です。
入力には無接続なのでADコンバータの出力はゼロになるはずですが、実際はオフセットがあります。
-5180ほどですが、24bitADコンバータなのでフルスケール2^24=16777216に対して0.03%程度となります。
それよりも変換値のばたつきが大きいので何らかの平均化が必要です。
ソフトである程度平均化しておいてから下位数ビットを切り捨てる方向で考えてます。
AVDDを分圧し、その中点電圧を入力のグランドとし、BチャンネルのINNBに。入力電圧を分圧してINPBにつないでおきます。

まずはオフセットの測定。
気休めですがノイズの影響を減らすため、金属のケース(お菓子の入れ物)に押し込み、回路の最低電圧をケースと接続しておきます。
白いミノムシクリップがそれです、こういうときは黒でしょう・・・そうなんですが、手持ちにこれしかなかったんです^^;;

入力は無接続、ソフトによる平均化はせず、ADコンバータの値をシリアル接続でTera Termで読み込み、エクセルでグラフ化しました。データ数は約6000個です。

グラフの黄線はエクセルによる100回の移動平均です。
入力には無接続なのでADコンバータの出力はゼロになるはずですが、実際はオフセットがあります。
-5180ほどですが、24bitADコンバータなのでフルスケール2^24=16777216に対して0.03%程度となります。
それよりも変換値のばたつきが大きいので何らかの平均化が必要です。
ソフトである程度平均化しておいてから下位数ビットを切り捨てる方向で考えてます。
24ビットADコンバータモジュールを試す(1)
2015-01-09

数ヶ月前にアマゾンで買った24ビットADコンバータモジュールです。
当初、これを見つけたときに商品説明を読んでもよくわからなかったのですが、商品の写真からHX711というICが使われているのがわかり、データシートを入手して検討したところ、使えそうだと判断して購入しました。
私の場合、注文から商品到着まで数週間を要しました。
それにしてももうちょっとわかりやすい説明文がほしいものです、アマゾンさん。
モジュールの回路図です。
データシートのFig.4 Reference PCB board schematicを参考にして、目視と導通テスターで調べました。
ただし、これに間違いがないとは保証できませんので、念のため。

データシートに
designed for weigh scales and industrial control applications to interface directly with a bridge sensor.
とあるように、電子秤などに使うのが目的のようですが、高感度の電圧計として使えないかと目論見ました。
当初、PSoCにつないであれこれ実験していたのですが、他に面白そうなデバイスを見つけたので、興味がそちらに行ってしまい、しばらく放置したままでした。
今まで何度もこういうことを繰り返しています、こうやって部屋の中はろくに使わないパーツで埋まってくのです^^;;
それはさておき、「びんぼうでいいの」を使い出したので、Arduinoの勉強を兼ねて「びんぼうでいいの」につないでみました。
まずはHX711について。
AチャンネルとBチャンネルの二つの入力があります。
Aチャンネルはゲインが128倍と64倍に切り替えが出来ます。
Bチャンネルはゲイン32倍固定です。
この切り替え方法がユニークです。
シリアル接続のADコンバータなのでクロックを送ってデータを1ビットずつ読み出します、24bitADコンバータなので24クロック送りますが、チャンネル/ゲイン切り替えに追加クロックを送るのです。
1クロック追加でAチャンネル、ゲイン128倍
2クロック追加でBチャンネル、ゲイン32倍
3クロック追加でAチャンネル、ゲイン64倍
となり、以後のAD変換がこの設定で行われます。
トータルで25~27クロック送ることになります。この範囲外だとデータシートによれば変換がおかしくなるようです。
オシロで謹賀新年(2)シリアル接続DAコンバータを試す(2)
2015-01-07
ArduinoとMCP4811の接続回路です。デュアルタイプのMCP4822なら簡単になります。
デジットでも扱っているようです。
秋月ならMCP4922が使えるでしょう、ただしレファレンス電圧は外付けになりますが。

オシロへの出力をanalogWrite()からシリアル接続DACに変えての周期は約125mSですが、DACの制御をDigitalWrite()から直接ポート制御に変えても10mS程度しか短くなりません。
そこでスケッチを見直すとメインループ内でdelay()が多用されています。
arudinoのanalogWrite()はPWMなのでフィルタが必要で、出力の変化には応答時間を要します。
そのためのdelay()ですが、シリアルDAコンバータなら不要なので、スケッチ内の全delay()およびdelayMicroseconds()をコメントアウトしました。
その結果周期は30.9mSになりました。

左上に写っているのはヤフオクで落札したロジックアナライザです、今回の測定に活躍してくれました。
デジットでも扱っているようです。
秋月ならMCP4922が使えるでしょう、ただしレファレンス電圧は外付けになりますが。

オシロへの出力をanalogWrite()からシリアル接続DACに変えての周期は約125mSですが、DACの制御をDigitalWrite()から直接ポート制御に変えても10mS程度しか短くなりません。
そこでスケッチを見直すとメインループ内でdelay()が多用されています。
arudinoのanalogWrite()はPWMなのでフィルタが必要で、出力の変化には応答時間を要します。
そのためのdelay()ですが、シリアルDAコンバータなら不要なので、スケッチ内の全delay()およびdelayMicroseconds()をコメントアウトしました。
その結果周期は30.9mSになりました。

左上に写っているのはヤフオクで落札したロジックアナライザです、今回の測定に活躍してくれました。
aitendoでお買い物
2015-01-07
年末に振込んだのですが、やっと今日来ました。
びんぼうでいいの [U3R]と抵抗パック。

ICソケットとUSBコネクタは手持ちを使いました。
これに以前買ったスイッチサイエンスさんのArduinoブートローダ書き込み済みATMega328をのせたらあっさり動きました。

ただいまLチカ中。
びんぼうでいいの [U3R]と抵抗パック。

ICソケットとUSBコネクタは手持ちを使いました。
これに以前買ったスイッチサイエンスさんのArduinoブートローダ書き込み済みATMega328をのせたらあっさり動きました。

ただいまLチカ中。
オシロで謹賀新年(2)シリアル接続DAコンバータを試す
2015-01-03
パーツボックスからSPI接続10bitDAコンバータMCP4811が出てきたので、さきのオシロで謹賀新年にこれを使ってみました。
1チャンネルのDAコンバータなので2個使ってます。

arduinoでのSPI接続は初めてですが、PSoCでやったことがあったのでさほど苦労なく動かすことが出来ました。

ブランキングするのをまたしても忘れました(汗)。フィルタを入れてないのでドットが目立ちます。
それより描画が前と比べてさほど早くないのです。どれぐらいかまだ測ってませんが。
1点に付きポートの上げ下げにdigitalWrite()を6回使ってますが、digitalWrite()はどうも遅いらしいです。
ポートを直接いじる方法があるようで、調べてやってみます。
1チャンネルのDAコンバータなので2個使ってます。

arduinoでのSPI接続は初めてですが、PSoCでやったことがあったのでさほど苦労なく動かすことが出来ました。

ブランキングするのをまたしても忘れました(汗)。フィルタを入れてないのでドットが目立ちます。
それより描画が前と比べてさほど早くないのです。どれぐらいかまだ測ってませんが。
1点に付きポートの上げ下げにdigitalWrite()を6回使ってますが、digitalWrite()はどうも遅いらしいです。
ポートを直接いじる方法があるようで、調べてやってみます。
オシロで謹賀新年
2015-01-02
ラジオペンチさんのブログでオシロの画面から謹賀新年という面白い記事があったので早速試してみた。
Arduinoを使ってオシロスコープにベクトル文字を描くというもの。

ブランキングをしていないとこうなる。
私のオシロのZ軸は背面にあり、引っ張り出すのがめんどうだから。

何とか引っ張り出し、ブランキング信号をつないだ。
文字がラジオペンチさんのと比べて太いが、これはフィルタのカットオフの違いである。
ラジオペンチさんが使ったCRは10KΩと0.1μFだが、わたしは手近にあった2KΩと0.22μFを使った。

実験の様子、たったこれだけ。(黒いDIPは集積抵抗)
描画には0.2秒ほどかかるのだが、DAコンバータを外付けにすればもっと速くなるそうで、いずれやってみたい。
Arduinoを使ってオシロスコープにベクトル文字を描くというもの。

ブランキングをしていないとこうなる。
私のオシロのZ軸は背面にあり、引っ張り出すのがめんどうだから。

何とか引っ張り出し、ブランキング信号をつないだ。
文字がラジオペンチさんのと比べて太いが、これはフィルタのカットオフの違いである。
ラジオペンチさんが使ったCRは10KΩと0.1μFだが、わたしは手近にあった2KΩと0.22μFを使った。

実験の様子、たったこれだけ。(黒いDIPは集積抵抗)
描画には0.2秒ほどかかるのだが、DAコンバータを外付けにすればもっと速くなるそうで、いずれやってみたい。
arduinoでサーミスタ温度計を試す(2)表示を右詰にする
2015-01-02
先のスケッチでは温度表示が右詰にならない。
検索すると逆引きArduinoに答えが見つかった。
dtostrf()という関数を使えばいいようだ。
ついでに
tempSum+=
の計算式も変更。
スケッチをのせておく。
// サーミスタ103JTを使った温度計
// 近似式の違いを見るためのテスト
// 2015/01/01 edy
// 2015/01/02 dtostrfを使って表示を右詰めにした。
// http://garretlab.web.fc2.com/arduino/reverse_lookup/index.html
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
void setup() {
lcd.begin(16, 2);
lcd.print("Start");
delay(1000);
}
void loop() {
char s[16];
int average=1000;
float divRatio , tempSum , tempSum2 ;
tempSum= 0 ;
tempSum2= 0 ;
for(int n=0; n < average; n++){
divRatio=analogRead(A2) / 1023.0 ;
tempSum+=((174.63 * divRatio - 224.97) * divRatio + 199.61) * divRatio - 40.425 ;
tempSum2+= 107.62 * divRatio - 28.578;
}
tempSum/=average ;
tempSum2/=average ;
dtostrf(tempSum, 6, 1, s);
lcd.setCursor(0, 0) ;
lcd.print(s) ;
lcd.print("c") ;
dtostrf(tempSum2, 6, 1, s);
lcd.setCursor(0, 1) ;
lcd.print(s) ;
lcd.print("c") ;
}
検索すると逆引きArduinoに答えが見つかった。
dtostrf()という関数を使えばいいようだ。
ついでに
tempSum+=
の計算式も変更。
スケッチをのせておく。
// サーミスタ103JTを使った温度計
// 近似式の違いを見るためのテスト
// 2015/01/01 edy
// 2015/01/02 dtostrfを使って表示を右詰めにした。
// http://garretlab.web.fc2.com/arduino/reverse_lookup/index.html
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
void setup() {
lcd.begin(16, 2);
lcd.print("Start");
delay(1000);
}
void loop() {
char s[16];
int average=1000;
float divRatio , tempSum , tempSum2 ;
tempSum= 0 ;
tempSum2= 0 ;
for(int n=0; n < average; n++){
divRatio=analogRead(A2) / 1023.0 ;
tempSum+=((174.63 * divRatio - 224.97) * divRatio + 199.61) * divRatio - 40.425 ;
tempSum2+= 107.62 * divRatio - 28.578;
}
tempSum/=average ;
tempSum2/=average ;
dtostrf(tempSum, 6, 1, s);
lcd.setCursor(0, 0) ;
lcd.print(s) ;
lcd.print("c") ;
dtostrf(tempSum2, 6, 1, s);
lcd.setCursor(0, 1) ;
lcd.print(s) ;
lcd.print("c") ;
}
arduinoでサーミスタ温度計を試す
2015-01-01
ACS712電流センサーをいじっていたのだが、ちょっと脱線する。まぁ、いつものことだが。
温度補償用のサーミスタ103JT。これに10Kオームの抵抗を直列にしてVccを分圧し、ADCで測って温度を求めている。

最初は簡単な近似曲線(というか直線)で近似していたのだが、両端で誤差が大きくなる。

ならば近似式の次数を上げたらどうなるか、やってみた。

3次式にするとほぼどんぴしゃ。
計算上はプラスマイナス0.05℃以内に収まっている、あくまで計算上だが。
そこでこの二つの計算式をもとに温度表示させてみた。

上が三次式による表示、下が直線近似による表示。
たいした違いは出ていないが、熱した半田ごてをサーミスタに近づけてやると、50度ぐらいで数度の差が出た。
まぁそういう計算式なのだから当たり前なんだが。
このサーミスタ、熱時定数が小さいので指で触っただけでめまぐるしく温度が変化する。
温度補償用のサーミスタ103JT。これに10Kオームの抵抗を直列にしてVccを分圧し、ADCで測って温度を求めている。

最初は簡単な近似曲線(というか直線)で近似していたのだが、両端で誤差が大きくなる。

ならば近似式の次数を上げたらどうなるか、やってみた。

3次式にするとほぼどんぴしゃ。
計算上はプラスマイナス0.05℃以内に収まっている、あくまで計算上だが。
そこでこの二つの計算式をもとに温度表示させてみた。

上が三次式による表示、下が直線近似による表示。
たいした違いは出ていないが、熱した半田ごてをサーミスタに近づけてやると、50度ぐらいで数度の差が出た。
まぁそういう計算式なのだから当たり前なんだが。
このサーミスタ、熱時定数が小さいので指で触っただけでめまぐるしく温度が変化する。