2012-04-02
LPC1343 ADC データ測定 リアルタイムグラフ表示
1. フォトダイオードのアナログ出力をADCで10ms毎に取得
2. UARTで取得データをPCに送信
3. フリーソフトCPLTでデータログ&ほぼリアルタイムグラフ表示
開発Listへ戻る
ちょっと前にネット検索をしていると面白いソフトの紹介記事を見つけたので
使ってみることにしました。
ソフトはデータテクノという会社さんのCPLTというものです。
リンク先の「その他」の4番です。
これを使うとUARTで送ったデータを、下の図のようにほぼリアルタイムにグラフにしてくれます。
データはフォトダイオードの出力をA/D変換したものです。
フォトダイオードを手で覆うと出力が下がることをほぼリアルタイムで確認できます。
ほぼというのは少しディレイがあるということです。
また、データもCSVファイルにログしてくれるという優れたフリーソフトです。
グラフの数も増やすことが出来ます(同時に8本までのデータを引くことが出来る模様)
xp用ですがwin7でも動作はします。(この図はwin7でとりました)
ただしwin7ではhelpが見えません。
helpで動作条件を知るためにもxpが必要です。
回路
準備物
FT232RL USBシリアル変換モジュール
フォトダイオードS9648-100 秋月電子 120円
このフォトダイオードはアンプも不要で大きな出力が出たのでちょうど良かったです。
接続図
コード main.c
#ifdef __USE_CMSIS
#include "LPC13xx.h"
#endif
#include <cr_section_macros.h>
#include <NXP/crp.h>
#include "adc0.h"
#include "uart.h"
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;
#include <string.h>
#include <stdlib.h> //int-> char変換 itoi
// Main loop
int main(void) {
// Variable declaration
char p[4]; // AD0 value
int ad0data;
// Initialize UART
uart_init(9600);
adc0_init();
LPC_SYSCON->SYSAHBCLKCTRL |=0x100; // Timer16B1 Turn ON
LPC_TMR16B1->PR = 7200-1; // 10kHz (Max 16bit dec:65535)
LPC_TMR16B1->MR0 = 100; // 0.01S
LPC_TMR16B1->MCR = 0x04; // Stop timer on MR0
// Enter an infinite loop, just echo lines
while (1) {
LPC_TMR16B1->TCR = 0x02; // TCR Reset
LPC_TMR16B1->TCR = 1; // TCR Start
ad0data=adc0read();
itoa(ad0data, p, 10);
uart_puts(p);
uart_puts("\r\n");
while (LPC_TMR16B1->TCR & 0x01);
}
}
コード解説
・まずインクルードです。
以前のエントリ LPC1343 UARTでADCを制御する 2/2を参照です。
adc0.c, adc0.h, uart.c, uart.hはリンク先からコピーしてプロジェクトに追加してください。
#include "adc0.h"
#include "uart.h"
・次はmain内です。これも基本的に以前のエントリのmain.cのモディファイです。
LPC1343 UARTでADCを制御する 2/2
変更部分だけ説明します。
・10ms毎にADCをするようにタイマーをイニシャライズします。
LPC_SYSCON->SYSAHBCLKCTRL |=0x100; // Timer16B1 Turn ON
LPC_TMR16B1->PR = 7200-1; // 10kHz (Max 16bit dec:65535)
LPC_TMR16B1->MR0 = 100; // 0.01S
LPC_TMR16B1->MCR = 0x04; // Stop timer on MR0
・永遠ループ内です
タイマーをリセットする(TCカウンタを0にする) & カウントアップスタートする
LPC_TMR16B1->TCR = 0x02; // TCR Reset
LPC_TMR16B1->TCR = 1; // TCR Start
・ADCの値を読む、charに変換する, Uartでcharデータ送信, CR+LFを送信
ad0data=adc0read();
itoa(ad0data, p, 10);
uart_puts(p);
uart_puts("\r\n");
・TCRが設定カウント値になるまで待つ
(TCRが設定カウント値(今回はMR0=100)になるとTCRのbit0が"0"になる。その状態になるまで待つ)
while (LPC_TMR16B1->TCR & 0x01);
結構使えるソフトだと思います!!
- 5 http://www.google.co.jp/url?sa=t&rct=j&q=lpc_iocon->&source=web&cd=3&ved=0CDIQFjAC&url=http://d.hatena.ne.jp/hira-rin/20120219/1329628763&ei=Ekd9T7-oM8jhrAf8-9XcDA&usg=AFQjCNHpWqpv1OkusrIRSwA0Cuv4OE9Y6g
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=c言語 マイコン uart lf -> cr+lf 変換&source=web&cd=1&ved=0CC8QFjAA&url=http://d.hatena.ne.jp/hira-rin/20120307/1
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=4&sqi=2&ved=0CEAQFjAD&url=http://d.hatena.ne.jp/hira-rin/20120313/1331654875&ei=9Pt8T8CyGYGtiAfciajHCQ&usg=AFQjCNEe00pj9cCQjlV7LLaF6rF8oPYkgw&sig2=8MDxPriR9QQwiUvWYdtnIw
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=15&ved=0CFUQFjAEOAo&url=http://d.hatena.ne.jp/hira-rin/20120303/1330778501&ei=s596T8r2DZCXmQX90YnhAw&usg=AFQjCNHmHpuO1DVC6T7UFRq1dPLaHNgSig
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=32bitタイマー&source=web&cd=2&ved=0CCwQFjAB&url=http://d.hatena.ne.jp/hira-rin/20120226/1330259323&ei=EUB5T8iFAoHumAXgn73pDw&usg=AFQjCNHlhFD-Eq28LiuqYAED7Rl6ECmRBg
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=LPC1343+ADC&source=web&cd=1&ved=0CCwQFjAA&url=http://d.hatena.ne.jp/hira-rin/20120402/1333378730&ei=bGx6T5O0M8LxmAXlr_nJAw&usg=AFQjCNGhh0f_Z_nTABwIpJGwLqxNoMk27Q
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=uart 送信確認&source=web&cd=1&ved=0CDEQFjAA&url=http://d.hatena.ne.jp/hira-rin/20120130/1327932244&ei=tUR9T6mKMOK5iQfFipW4CQ&usg=AFQjCNGziHdBvA6lxRjjj8EsuTsE6P_rbQ&cad=rja
- 2 https://www.google.co.jp/
- 1 http://cgi.search.biglobe.ne.jp/cgi-bin/search7-nb?q=USB+serial+マイコン
- 1 http://d.hatena.ne.jp/keyword/書き順