2014年9月23日火曜日

PIC16F88とATtiny2313を使った周波数カウンタの製作

PIC16F88とATtiny2313を使った周波数カウンタを作りました。
本当はPICだけで周波数カウンタを作りたかったんだけど、うまく行かなかったのでAVRでゲート時間を制御するようにしました。
PICにはパルスのカウントに専念させ、AVRはゲートの開閉を制御します。
ゲートには74HC08のANDを使用しました。
AVRでゲート時間を生成することで、基準発振器1周期の分解能でゲート時間を設定することを可能としています。また、ソフトウェアディレイとnop命令を組み合わせることで様々な周波数の基準発振器にも簡単に対応できます。
PIC16F88のタイマ1カウンタはPICの動作クロックと非同期に動作することができるので、プリスケーラを使用しなくても40MHz以上までカウントできます。

- とりあえず仕様 -
・AVR: ATtiny2313 (基準発振器を動作クロックとする)
・PIC: PIC16F88(内蔵8MHz発振器で動作)
・測定可能周波数: 0.01Hz ~ 48MHz(48MHz以上の発振器がないので未確認)
・ゲート時間: 0.1s, 1s, 10s, 100s
・測定用カウンタ: 32bit
・周波数確度: 基準発振器次第


回路図


回路はとてもシンプルです。PICがAVRに指示を出す際は、AVRをリセットしてからゲート時間を設定するための2本のラインを制御します。
入力アンプをつけていないのでTTLレベルでの入力となります。

以下写真など
基準クロックを測定して測定結果と基準クロックの周波数が一致するようにAVRのゲート時間を微調整する。

内蔵しているLTC1799モジュールの周波数を測定

48MHzの水晶発振器の周波数を測定


24.576MHzの水晶発振器の周波数を測定


今回使用したTOYOCOM製の8.000MHz水晶発振器ですが、温度補償もされておらず、また、周波数の微調整も出来ないので周波数カウンタの基準発振器として使うのはあまり好ましくありません。BPM標準電波とゼロビートをとった10MHz発振器の出力を測定してみると、9,999,951Hzと表示さたので、8MHzより若干高い周波数で発振していることになります。温度によっても変化します。
TCXOを入手したら換装しようと思います。
標準電波を使った校正方法と10MHz発振器については次回あたりに書きたいと思います。
今回作成したプロジェクトファイル一式です。
https://db.tt/csBQFcvd
開発環境はAtmel Studio 6.2とMPLAB X IDE v1.41です。

LCDの表示処理の部分がごちゃごちゃしてスマートじゃないですが一応動作しています()

~おわり~




2014年7月13日日曜日

気温、気圧つぶやきBOTの試作

台風がよく現れる季節なので気圧が気になる時がありますよね??
ってことで自室の気温と気圧をつぶやくBOT的なものを作ってみました。


機能
・LPS331APから毎秒気圧、気温を取得→UARTでPCに伝送→C#のアプリで受信→つぶやく
・指定間隔、正時に自動投稿
・リプライに反応(多分


センサが入った計測部は定番のフリスクケースに格納しました。
主な内容物
・PIC12F683
・LPS331AP
・2桁8文字 i2c液晶
・CR2032電池、ホルダ
・タクトスイッチ
・3.3Vレギュレータ
・6PINソケット

6PINソケットにはPICのプログラムを書き換える際に必要なピンと、シリアル出力、電源を出しています。ピンヘッダで直接PicKitに刺せるように配置は揃えています。
シリアル出力は1200bps パリティ無し ストップビット1bit データ8bit
外部5V電源と内部のCR2032の両方で動作し、スタンドアローンでも使用可能です。









~ 終わり ~



2014年7月1日火曜日

RIGOLのデジタルオシロ(DS1074Z)が届いた!

日本時間の6/26日夜にeBayで購入したRIGOL社のデジタルオシロスコープ DS1074Zが本日手元に来ました。EMS便(特快)で上海から送られてきたのですが、割と早いですね。2週間位かかるかなーと予想していたのですが...
eBayの支払いはいつものPayPalで行いました。送料込み¥65,050JPYでした。

DS1074Zの主なスペックは以下のような感じです。
・アナログ4ch 70MHz (改100MHz)
・サンプリングレート1GS/s(1ch) 500MS/s(2ch) 250MS/s(4ch)
・メモリ 12Mpts(オプションで24Mpts)
・波形更新速度 最大30,000wfms/s
・ディスプレイ解像度 800×480
・波形の輝度調整可能
・USBコネクタ(前面、背面)、LANコネクタ搭載

4ch 12Mpts、輝度階調表示対応でこの価格はとてもコスパ良い感じ。
以前購入したOWON社のオシロスコープよりは作りがしっかりしている。
本体を持ち比べてもRIGOL社のが中身が詰まっててずっしり重い。ボタン類は軽いプッシュで操作できる。ツマミ(ロータリエンコーダ)類がとても滑らか。いい匂いがする。などなど

とりあえず写真をいくつか撮ったので貼っていきます。

安定の黄色テープ

RIGOLのダンボール。少し凹んでるけど中は問題なし。
オシロは梱包材で浮かして入っており、箱とは直接触れていなかった。

 内容物。 電源ケーブルが中国仕様なので変換アダプタが付属していた。
プローブ4本、USBケーブル、CD-ROM、保証書(3年)、クイックリファレンスなど
保証書には本体のシリアル番号が書かれたシールが貼ってある。

クイックリファレンスとCD-ROM 中国語分かりませんw

起動画面 なお、起動後は言語設定が中国語になっている。
画面中の設定から各国の言語に切り替え可能

日本語も搭載されてた!

追加の有料オプション機能が試用できるみたい。
使い勝手などを試して気に入ったら購入を考えよう。
購入前に試せるってのはとてもありがたい。
試用期間短い......

プローブは安っぽいがRIGOL純正のRP2200

スペックなど

ファームウェアバージョン

セルフキャリブレーション後、プローブの位相補償をしてテスト波形を観測。
セルフキャリブレーションには15分くらい時間がかかった。
OWONのオシロは2分くらいで終わったので、とても長く感じたが、まじめに調節すればこのくらい掛かるのだろう(多分)
なお、セルフキャリブレーションを行う前には全てのプローブを取り外しておく。

別角度から
液晶の視野角も問題なし。
下の足を立てると斜めに置くことも出来る。

OWONのオシロ(SDS7102V)とツーショット。
画面はOWONのが大きい。

波形の輝度を最小にしたらこんな感じになる。立ち上がりの線が見えなくなっている。
垂直軸調整ツマミや、時間軸調整ツマミはプッシュすると原点に波形を移動できるので便利。

PC上でWaveGeneというソフトを使って発生させたAM変調波を観測した様子。
キャリア周波数10kHz 変調周波数40Hz。
階調表示の無いOWONのオシロと比較すると一目瞭然。
解像度はそこまで高くないが、波形の頻度が輝度として観測できるのでとても分りやすい。


とりあえず以上のような感じです。
ざっとメニュー類をOWONオシロと比較しても多機能な事がわかります。
操作に慣れてきたら画像を追加するかもしれません。
なおこのオシロ、いろいろと改造(?)出来るみたいで海外のフォーラムで話題になっています。
勿論保証外ですが(そもそも正規ルートで購入していないので保証があるのかすら怪しい....



2014年6月14日土曜日

Puppy Linuxでsamba鯖を立てる時のメモ

Puppy LinuxでSamba鯖を構築するときに忘れないようにメモっておく

使用したPCのスペック
・型番: PC-MT1-H1 (SHARP Mebius)
・CPU: Intel PentiumⅢ 500MHz
・RAM: 128MB
・HDD: 20GB

使用したOS
・パピーリナックス 431JP2012

~基本的な流れ~
0. Puppy Linuxをインストール後、ネットワークウィザードよりLANの設定を行う。IPアドレスは固定しておく。
1. Puppy LinuxにSambaは同梱されていないので"Puppyパッケージマネージャ"から"samba"で検索してインストールする。
2. smb.confの設定。ファイルは/etc/opt/sambaにある。
3. 設定完了後、端末から"/opt/samba/sbin/smbd start" "/opt/samba/sbin/nmbd start"をタイプし、デーモンを起動させる。これでネットワーク上に鯖機のアイコンが見えるようになると思う。

OSを再起動するたびにコマンドを入力するのが面倒なので、コマンド類を記述したファイルに実行権限を与えてホームディレクトリのStartupフォルダに入れておく。
これで次回起動時から自動的にデーモンが起動するようになる。

ファイアウォールを設定する際はSambaで使用するポートを塞がないように注意する。
"nmap localhost"で使用しているポートを調べることができる。 ※nmapコマンドを使用するにはnmapのインストールが必要。

設定後のスクショなど

ネットワークドライブとして追加

ポート開放設定 5900番はVNC用


クライアント側からファイルをアップロード出来ても、消せないという問題が発生して困っていたが、以下の項目を追記することで解決した。
[global]
  acl check permissions = no

あと、同じ鯖内の共有フォルダに同時にセクションを張れない模様? guestアカウントでログイン中に別の共有フォルダにログインしようとするとエラーが出る。

2014/06/24追記
再ログイン後にネットワークドライブの再接続に失敗するときは、「コントロールパネル」→「資格情報マネージャー」よりWindows 資格情報を追加することで解決した。
現状設定ファイルスクショ



~ おわり ~


2014年6月1日日曜日

ATxmega32D4 タイマメモ

秋月電子で販売されてるATxmega32D4のタイマーの使い方メモ

xmega32D4には4つの16bitタイマーが搭載されている。
うち3つは4つの比較チャネルを持っていて、残りの1つは2つの比較チャネルを持っている。
TCxx.CCA, TCxx.CCB, TCxx.CCC, TCxx.CCDで比較対象となる値を設定する。
これらを使って4通りの周波数で14本のPWMを出力できる。
xmegaは入出力ポートがとても高機能になっていて、ピン再割当機能を使ってPWM出力をOR変調できたり、ピンn形態設定レジスタ(PORTx.PINnCTRL)を使ってIOピンの出力形態をデフォルトのコンプリメンタリからワイヤードOR、ANDに切り替えれたりもする。これは2和音矩形波出力を行う時に便利に使えそう(๑╹ڡ╹๑)

以下ソースコード
/*
 * ATxmega32D4_test.c
 *
 * Created: 2013/10/13 14:06:52
 *  Author: kingyo
 *
 * ライタの接続
 * Vcc:   Vcc
 * GND:   GND
 * MISO:  PDI_DATA(34pin)
 * RESET: PDI_CLK(35pin)
 *
 */ 

#include <avr/io.h>
#define F_CPU 32000000UL // 32 MHz
#include <util/delay.h>

int main(void)
{
 /* IOポート設定 */
 PORTC.DIR = 0xff;       // ポートCを出力に
 PORTD.DIR = 0xff;       // ポートDを出力に
 PORTE.DIR = 0x0f;       // ポートEを出力に


 /* クロック設定 内蔵CR32MHz */
 OSC.CTRL |= OSC_RC32MEN_bm;        // 32MHz内部発振を許可
 while(!(OSC.STATUS & 0b00000010)); // 安定化待ち
 CPU_CCP = CCP_IOREG_gc;            // 設定変更許可
 CLK.CTRL = CLK_SCLKSEL_RC32M_gc;   // 32MHzに設定
 //DFLLRC32M.CALA = 0xff;           // DFLL校正レジスタ弄り
 //DFLLRC32M.CALB = 0xff;
 
 
 /* 16bitタイマC0 (CCA, CCB, CCC, CCDの4本) */
 TCC0.PER = 10000;                  // カウンタ上限値
 TCC0.CCA = 5000;                   // (出力はPORTC.0)
 TCC0.CTRLB = 0b00010011;           // CCAEN, 単一傾斜PWM
 TCC0.CTRLA = 0b00000001;           // 前置分周器: clkPER
 
 /* 16bitタイマC1 (CCA, CCBの2本) */
 TCC1.PER = 500;                    // カウンタ上限値
 TCC1.CCA = 200;                    // (出力はPORTC.4)
 TCC1.CTRLB = 0b00010011;           // CCAEN, 単一傾斜PWM  
 TCC1.CTRLA = 0b00000001;           // 前置分周器: clkPER
 
 /* 16bitタイマD0 (CCA, CCB, CCC, CCDの4本) */
 TCD0.PER = 500;                    // カウンタ上限値
 TCD0.CCA = 200;                    // (出力はPORTD.0)
 TCD0.CTRLB = 0b00010011;           // CCAEN, 単一傾斜PWM  
 TCD0.CTRLA = 0b00000001;           // 前置分周器: clkPER
 
 /* 16bitタイマE0 (CCA, CCB, CCC, CCDの4本) */
 TCE0.PER = 10001;                  // カウンタ上限値
 TCE0.CCA = 5000;                   // (出力はPORTE.0)
 TCE0.CTRLB = 0b00010011;           // CCAEN, 単一傾斜PWM  
 TCE0.CTRLA = 0b00000001;           // 前置分周器: clkPER

}
今回はじめてソースコードをハイライト表示するSyntaxHighlighterってのを使ってみた。
割と良さげ。
~ おわり ~

2014年3月7日金曜日

PIC18F14K50で簡易4chアナログロガーを作ってみた

USB内蔵マイコンを使って何か実用的なものを作ろうと思い、簡単に出来て役に立ちそうなアナログロガーを作りました。

アナログロガーがあれば二次電池の充放電特性を見たり、太陽光発電で使われている蓄電池の電圧推移を記録できるので何かと便利ですよね?

使用したマイコンは、秋月電子で販売されている「PICマイコンPIC18F14K50T-I/SS(USB内蔵)」ってやつです。 USB内臓で150円って安い! 
過去にAVRでロガーを作ったことがありますが、そいつはATmega88のUSART出力をFT232系のシリアル変換ICで受けてPCに送信していました。今回のはPIC内部にUSBインタフェースが内蔵されており、(バッファ用のオペアンプ等を除くと)1チップで完結するのでとても楽です。

といっても、PICでUSBを使うとなると、どうやって開発していけば良いのかよく分からんわけで。。。
イロイロ調べてみると、「microchip社のWEBサイトにUSB機能を使ったデモプログラムがある」とのことなので早速DLしてきました。中にはAudioデバイスのデモだったりCDC,HIDなどたくさん入ってました。
デモプログラムをコンパイルする際、ヘッダファイルのパスを通すのに結構苦労しましたがww

デモプログラムの「Device - CDC - Serial Emulator」ってのを雛形にして改造していきます。
これをコンパイルしてPICに書き込んでUSBに接続すると、PC側からは仮想シリアルポート(COMポート)として認識されます。


PICで行う処理はとても単純です。
1、シリアルデータが送られてくるまでポーリングしながら待ちます。
1、データが送られてきたら、受け取った文字を確認し、"I"であればAN5,6,7,8をAD変換してPCに送信します。
以上です。

AD変換を1回行うだけでは偶然混入したノイズの影響を受けそうなのと、分解能が1024(10bit)になってしまうので、64回変換を行ってその合計をPCに送信しています。
理論上は、入力電圧が固定でADリファレンスも固定なら何回AD変換をしても分解能は1024のままです。
しかし、現実では周辺ノイズやリファレンス電圧の微小なふらつきが有り、閾値付近の電圧を変換する際は、変換値がパタパタ行ったり来たりします。
64回変換を行っている間に閾値のどちらに多く傾くかで結果が変わってくるわけです。
これで見た目の分解能を上げることが出来ます。(多分....)

次にPC側です。こちらも単純です。
1、AD変換値を得たいときにCOMポートへ"I"を送信する。
2、受信データをCHごとに分離して表示する(電圧への換算を行う)。
3、ログの記録やグラフを表示する。
以上です。

汎用のシリアルターミナルからCOMポートを直接叩いても構いません。
ただ、送られてくるデータがそのままだと見づらいのと、受信した日時が記録できないので専用のソフトを作りました。
C#で開発したので、簡易グラフやテキストログの記憶&吐き出し機能も割と簡単に実装できました。

動作中の画面



~ 以下写真など ~

ロガー本体。
フリスクのケースに入れてます。

ANポートに配線前。

プローブ差込口。

分圧基板はクッキングシートで転写する方法でやってみました。

生基板に転写後。

エッチング後。
一回だけだけの転写だとトナーが薄すぎるのか、ピンホールが出来てしまいました。残念。
なんとか使えそう。

部品実装後の分圧基板。
ダイオードは過電圧保護用。
(漏れ電流で逆に悪さをしている感w)

TL431の基準電圧源。

リチウムイオン電池の充電電圧のログを取ってる様子。

 12V12Ahのシールド鉛蓄電池を定電流放電した時の電圧変化をログ取ってる様子。

リチウムイオン電池の充電電圧ログ例

シールド型鉛蓄電池の放電電圧ログ例


周波数カウンタ機能を追加するともっと便利だったかな?
例えば、ハイサイドで電流検出した値を周波数に変換して、フォトカプラで受けるなど。

入力インピーダンスを高く保ちつつ、精度を上げるには入力のバッファアンプも必要ですね!

~ おわり ~




2014年2月15日土曜日

電源装置のプチ改良

先日ヤフオクで落としたKENWOODのCVCC電源(PR30-6P)に、CV/CC状態表示LEDが付いてなかったので追加した。



↑こいつ


電子負荷で動作確認。


とりあえず分解時の写真をいくつか。



半固定抵抗の実装方法が面白い。





電圧、電流を制御しているオペアンプの出力を観測してみる。


CV動作しているときは、黄色い波形が赤い波形より上に来てる。


オペアンプ周辺の回路を少しだけ書き出してみると、よく見かけるダイオードORを使った制御方法だった。
2つのオペアンプで電圧と電流を監視し、いずれかでも設定値を超えると電流を吸い込む方式。
ちなみに自作のCVCC電源でもこの方式を使っている。

この方法では片方のオペアンプが制御状態に入ると、もう片方のオペアンプの出力が飽和状態になるので2つのオペアンプの出力電圧を比較すればCV/CCのどちらのモードで動いているかが分かる。

今回はLM358をこの電圧の比較器として使った。
追加回路はとてもシンプル。


前面パネルのアルミ板に直径5mmの穴を開けてLEDを差し込む。

追加回路はパネルメータの取り付けネジに共締め。

完成!
これで使い勝手が少し良くなったかと思う。
全面のプッシュスイッチは電圧のプリセット用。
スイッチの下に穴が見えるが、そこにドライバーを突っ込んで半固定抵抗を回すと、電圧を設定することが出来る。

~  おわり ~