AVRで処理したデータ(アナログ入力等)をパソコン取,り込んだり、逆に制御指令等をAVRにデータとして送り込みたく
なることがあります。そこで、パソコンのRS−232Cを使った通信基本についてchanさんのホームページ等を参考にやってみました。
USARTというシリアル通信機能を利用しました。
特徴 非同期動作または、同期動作通信
ボーレートが広範囲に設定可 ボーレート=システムクロック/[16x(1+UBRR)] UBRR:0-4095
多様な伝送フォーマット設定 データ長5−9ビット、ストップビット1−2、パリティビット 無・偶数・奇数
インターフェイス
今回非同期動作としたので、RXD(2ピン)−>TD、TXD(3ピン)−>RDに接続する。
信号のレベル変換はchanさんの簡易方式です。
ケーブルは、家にあった携帯電話用のケーブルを流用し、下の回路図のようなケーブル(PC側9ピン)
を作成しました。
初期設定処理
ボーレート設定 UBRRH:UBRRL によって設定
38400ボーの場合
12.8M/(16x38400)−1≒19.8 よって 12.8M/(16x(20+1))≒38095
(38095/38400-1)x100=Δ0.8% 許容誤差1.5%以下OK
UBRRH:UBRRL=0:20
115200ボーの場合
12.8M/(16x115200)−1≒5.9 よって 12.8M/(16x(6+1))≒114,286
(114286/115200-1)x100=Δ0.8% 許容誤差1.5%以下OK
UBRRH:UBRRL=0:6
フレームフォーマット N81 データ長:8ビット、(スタートビット:1ビット)、ストップビット:1ビット
パリティ:なし
UCSRC:(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)
送受信許可
UCSRB:(1<<RXEN)|(1<<TXEN)
送信ルーチン(R16にデータをセットし、Txをcall)
Tx: SBIS UCSRA,UDRE
;送信バッファ空きでスキップ
RJMP
Tx ;送信バッファ空き待機
OUT UDR,R16
;データ送信(送信開始)
RET
;呼び出し元へ復帰
受信ルーチン(Rxをcallし、R16にデータ取得)
Rx: SBIS UCSRA,RXC
;受信完了でスキップ
RJMP Rx
;受信完了待機
IN R16,UDR
;受信データ取得
RET ;呼び出し元へ復帰
実験動作として、パソコンに”ATmega8 good”の文字列を送信、およびキーボードから入力した文字列を受けLCDに
表示させました。 (”I love you”と入力すると’Me too’と返事が帰ってくるように組んでみました。)
これで一応、基本的な通信法が理解できました。
(I love you を受信表示したところ) (”ATmega8 good”、”Me too”は受信データ)
バイナリ通信
続いてバイナリ通信をやってみました。
内容はAVRでAD変換したデータをPCのエクセルに転送し数値処理・グラフ化させます。(簡単なメモリレコーダ)
サンプリング周波数(1ch取込の場合)
@データを随時PC送信すると転送速度(115.2kBPS)がネック
AD変換データが2バイトなので (8+2)×2/115.2k≒174us+α ∴最大5.7kHz程度
AデータをSRAMにためておいて、後から一括送信する場合、AD変換時間がネック
AD変換クロックを最大の200kHz、変換時間を14サイクルとすると 14/200k=70us+α ∴最大14kHz程度
(atmega8の場合SRAMは1024バイトのなで、1データで2バイト使用すると500データ程度しか保存できない)
今回は、商用周波数(60Hz)を取込むのでサンプリングの定理・デジタルフィルタ処理や演算処理も考慮して、電気角の
15°つまり1440Hz(60×360/15)として@の方法で行いました。
ソフト処理
AVR側は、タイマカウンタ1の一致割込処理(CTC動作)にて1440HzごとにAD変換を行い、結果をホストPC
送っているだけです。(回数1000回)
PC側は、エクセルVBA(木下氏作EasyCommを利用 http://activecell.jp)でシリアル通信を行いデータを取り込みます。
取込んだデータを適当(スケーリング等)に処理しグラフ表示させます。
実行結果
EasyCommの取り扱いにもあるように、一部RS232C/USB変換ケーブルを使うと、comポートオープン後の最初の
1バイトが受信できないことがあります。私も、RS232CのないパソコンなのでエレコムのUC−SGTを用いてUSB接続
をしましたが、やはりだめでした。(半分くらい確立で失敗)しかたがないので、ソフト処理で逃げました。
アナログ入力(ch0)にAC100Vを変成して約2Vp-pを作り入力して取り込んだところです。
赤線は元データで、青線はフィルタ処理(180°前データ差引)によりDC分および偶数調波を除去し、基本波は2倍の振幅
を得てます。
ほぼきれいな正弦波です。(AC100V波形は結構歪んでますがアナログフィルタで、高調波が除去されてます)
(入力変換回路、outputをVRで分圧しch0へ入力)
追加:前記Aの方法(サンプリング周波数変更可能 最大10kHz)
(10kHzでサンプリング)