ワンチップマイコン・PICでC言語を使った学習報告6
はじめて16ビットマイコンを使う!
遅延パルサーの製作
ちょっと気合いの入った報告になります。今まで8ビットでのCPUを使用してきましたが、16ビットCPU
にチャレンジしようと無謀な計画(8ビットも完全マスターしていないのに) (;^_^A アセアセ・・・を立てました。今回のテーマの「遅延パルサー」は、やはり以前会社勤めていた時に使われていたもので、設定したタイミング(時間)でトリガーをかけたい時などに使用し、
複数台使ってタイミングを生成するモジュールです。
最近の小型ワンチップマイコンの開発には目を見張るものがあり、チャレンジしたいと思っていた時にぴったりのテーマだったので触ることにしました。・・・ところが・・・結構理解するのに時間がかかってしまい、おまけに性能の欲を追い求め、さらに上のCPUに取り換えるはめになってしまいました。
これまで勉強していた「C言語」も、Microchip社が無償で出している「MPLAB C30」を使わなければならず、今まで使ってきたCCS-Cとはちょっと慣れないと無理があるようです。
(〃´o`)=3 フゥ
今回は性能を追い求めたことと、新しいハードウェアのアーキティクチャーやペリフェラルの使い方やMPLAB C30のC言語の癖などハードウェアとソフトウェアの両面で苦労しました。(℃_゚)...ン!?
なお今回も、アップした回路図やソースなどに間違いや無駄などがあるかもしれません。そのあたりは勉強中と言うことでご容赦願います。できればご指摘やアドバイスを頂ければ幸いです。(メールなど直接でもOKです)
お決まりの条文ですが、ここに紹介するものは私個人が勝手に製作したもので、万一製作されて事故などの被害にあわれても当方は一切責任を持ちませんので、ご理解とご了解のうえで、ご利用ください。できれば勉強用として利用して頂ければ幸いです。
なにせ私もまったくの素人ですから!
はじめて「遅延パルス発生器」を見た時は、数十個のロジックICで作られており(当時(もう20年くらい前?)にしては、なかなかなものだった!)、4桁のサムホイールスイッチで
遅延時間を設定するものでした。私が会社勤めを辞める数年前にはモデルチェンジしてCPLD1個(100nS〜9.999S)でバージョンアップされていました。
性能(仕様)として、高速タイプ(100nS〜9.999mS)が分解能100nS、ジッター20nS以内、出力20Vp-p(50Ω)、パルス幅2uS、遅延時間100nS〜9秒(低速タイプ(10us〜999.9mS)の紹介は割愛)・・・と言う仕様でした。今時の
CPLDの世界では、それほど難しいものではないと認識しています。
最近の小型マイコンの性能向上には驚かされ、これくらいの性能であればCPLDを使わなくても出来そうな???なんて勘違いをしている私なのかもしれませんが、とにかく作ってみようと思い立ち、四苦八苦してようやく紹介できるものが出来ましたので、アップすることになりました。なお、ソフトウェアは初めて使うもので、かなり乱雑になっていて、大半は
文献1と2より拝借しています。あらためて、後閑 様ありがとうございます。<(_ _*)> アリガトォ
一応、予定の製品に近い性能が出たのである意味満足しています。但し、出力はロジックレベルです。最近の高速バッファやIGBTドライバーバッファ(フォトカプラ式)などを使えば、
20Vp-p(50Ω)はドライブできると思っております。従って今回は割愛させていただております。
まずは全容と詳細を写真で紹介します。相変わらずの汚い机の上での作業です。((^┰^))ゞ テヘヘ
@↓ | A↓ | B↓ |
---|---|---|
C↓ | D↓ | |
相変わらずの「ブレードボードでの配線です。今回は少しは整理するために良く使う「Cのスイッチ部」と「DのLCD表示部」を別の基板に作り、ブレードボードで使えるようなコネクタを作りました。
従ってブレードボードに乗っているのは、「@のCPUとクロック発振モジュール」と「Aの波形整形部」だけの回路部品です。
CPUは16ビットMPU、dsPIC30F4012を使いました。実は、このCPUを使う前に「PIC24FJ64GA002」と言うやはり16ビットのCPUを使っていました。このCPUも外に発信器を付けて(内蔵発信器もあります
)内部で4逓倍でき、最大32MHzで動作するものでしたが、唯一残念だったのが、「1サイクル2クロックかかること」、「電源が最大3.6V」の条件でした。逆に良かったのが「ピン割り付け機能
」があり、プログラムで1ピン毎に多彩な機能を割り付けることができ、結構便利なものでした。CPUを取り換えた決め手はやはり動作クロックです。dsPIC30F4012は最大120MHzで動作します。実にPIC24FJ64GA002の約4倍
が魅力的でした。クロック発振モジュールは10MHzのものです。この10MHzはCPU内部で4逓倍され(dsPIC30F4012は4倍、8倍、16倍の逓倍が可能)、システムクロックは事実上、80MHzで動作させています。
70%ほどプログラムが出来た段階でCPUを変えましたが、アーキティクチャが結構異なっていて、ペリフェラル設定や割り込みなど、記述の仕方が違い、その修正に結構時間がかかりました。
動作については内部の16ビットタイマーモジュールを2個使い、32ビットタイマーとして、さらにコンペア(比較器)モジュールも16ビットなのでこれも2個連結して、32ビット構成で出来ると甘く考えていました。
ところが、コンペアモジュールが32ビットとしては働かないことが判明し、それらの検証にかなりの日数がかかってしまいました。σ(^_^;)アセアセ...結局、タイマーモジュールだけを使うことにして、コーティングしました。
内部のタイマーモジュールのカウントアップは、20MHz(50nS)で動作しています。従って最少分解能は本来なら50nSになりますが最小値の設定時、カウンター開始からすぐ割り込み処理に入るが、絶対遅れが増すことと、そんなに欲張らないことで、
最少分解能を100nSとしました。ちなみに遅延時間の設定値を最小値(つまり=1)にセットした時、タイマーの動作開しから割り込みルーチンに飛び、出力を切り替えるまでにおよそ、800nSほどかかっています。
これをサイクルに直すと、32ステート?になります。恐らく内部で割り込みアドレスへのジャンプや、レジスターの保存などに時間を要していると思われます。(あえてコンパイル後のアセンブラは見ませんでした)。それゆえ、当初のパルスシーケンスを実現するため、
波形整形回路を追加した次第です。この回路は単純なモノマルチです。(回路図参照)
外部入力は、INT端子を使いトリガーし、割り込み優先を上げて処理しています。マニュアルトリガーは「UPスイッチ」で行います。設定はEDITスイッチを押して、
左右のスイッチで変更した桁を選びます(桁はブリンクします)。上下スイッチで数値を上げたり下げたりします。数値の下に単位が表示されているので、どの桁を触れば良いのか直感的にわかると思います。設定値は
0以上、99s999ms999us
9 まで行えます。出来上がった仕様は以下の表の通りです。
出来上がった遅延パルサーの仕様
SIGNAL-PULSE幅 | 2μS (+5Vp TTL) |
DELAY-PULSE幅 | 2μS (+5Vp TTL) |
EXT-TRIGGER入力 | +5Vp(TTL) 立ち上がりでスタート |
EXT-TRIGGERと SIGNALの絶対遅れ |
2μS |
EXT-TRIGGERと SIGNALのジッター |
50nS (簡易実測値) |
SIGNALとDELAYの ジッター |
10nS< (簡易実測値) |
DELAY時間設定範囲 | 100nS〜99.9999999秒 |
最小設定時間 | 100nS |
↑ 遅延時間を20秒に設定した時
※ 回路図の液晶は2行16文字になっていますが、秋月電子通商から販売されている4行20文字のものをお使い下さい。接続端子などは2行16文字と同じになっていますが、電源端子だけは気を付けて下さい。
動作説明
動作原理としてはすでに上で述べた通りです。起動後、スイッチにて遅延時間を設定します。設定値が「0」の時は出力しません。このバージョンでは設定値をEEP-ROM内に保存していません。(手抜き! ヾ(ーー )ォィ)従って100nSが最小値になります。
動作波形
↑ SIGNAL-PULSEとDELAY-PULSE ↑ SIGNAL-PULSEとDELAY-PULSEのディレイ時間拡大
↑ EXIT-PULSEとSIGNAL-PULSE ↑ EXIT-PULSEとSIGNAL-PULSEの簡易ジッター測定
↑ 遅延時間設定100nS、200nS、300nS ↑ 遅延時間設定1uS、2uS、3uS
↑ 遅延時間設定10uS、20uS、30uS ↑ 遅延時間設定100uS、200uS、300uS
↑ 遅延時間設定1mS、2mS、3mS ↑ 遅延時間設定10mS、20mS、30mS
↑ 遅延時間設定100mS、200mS、300mS ↑ 遅延時間設定1S、2S、3S
※ オシロスコープ設定
CH1:SIGNAL-PULSE
CH2:DELAY-PULSE
↑ 遅延時間設定10S、20S、30S
苦労したこと/その他 上でも言いましたが今回は最初のCPUの選択段階で、欲を出してしまい、一つ上のものを選択したのは良かったのですが、若干ですが苦労するはめになりました。仕方ありません。こればかりは避けて通れませんから・・・
(TmT)ウゥゥ・・・
dsPIC30F4012のCPUは結構使えるペリフェラルが入っています。例えば6個のPWMや1Mspsの10bitのA/Dコンバータなども入っていて、
値段が750円と手頃です。私はどうしてもスイッチと液晶LCDを使いますので、18PinのPICを使うのを控えています。決して使えないわけではありあませんが、
よく先駆者の御仁の方はI/O信号が不足する時、ピンを兼用することをされている方がおられますが、トラブルが出る可能性をあらかじめ作りたくないことと、ソフトウェアの負担を抑えられ、さらにCPUの価格がこれほどで、量産個数が例えば数百個程度であれば思い切ってピン数の多い方を選択し方が良いと考えています。
それにしてもCPUの向上には驚かされます。これを機にもうちょっと複雑なことにチャレンジしたいと考えています。
p(´∇`)q ファイトォ~♪
はじめての16ビットマイコンの感想は、「結構使えるかも」・・・しかし、私の知る16ビットコンパイラーが「MPLAB C30」しかなく(あとで分かりましたが、お金を出せば結構あるようです・・・)、何せ 10万円以上することがネックです。すでに持っている PCWHD Compiler も16ビットが書けるようですが、詳細が分かりません。今後はこの PCWHD Compiler を使えるよう勉強していきたいと思います。