ただ今の日時:

簡易2相パルス発生器の製作


周波数/デューティ可変 + 180度位相の異なる2パルス発振

 マイコン関連の情報を掲載するのは昨年(2009年度)の8月以来のご無沙汰です。m(_ _;)m ゴメン!! 今回はちょっと忘れ気味の「 C言語」を思い出す意味を込めて、簡単なパルス発生器を製作します。これを製作するに当たり、昇圧型のトランスをドライブする基準となる発生器が欲しかったのですが、ただ発振しているだけでは面白くありません。 プッシュプルドライブができる180度位相が異なる2パルス発振版を製作しました。性能はあまり欲張らず、「簡単なもの」を目指してみました・・・・と言っても主な目的は「 C言語の復習ヾ(--;)ぉぃぉぃ です!!

 目標仕様

可変周波数範囲:    2Hz〜250kHz 設定は1Hz刻み
可変ディーティ範囲:   1%〜99% 設定は1%刻み
出  力  波  形:   方形波のみ
出  力  電  圧:   +5Vp
180度位相が異なる波形を2パルス出力すること

1. 完成年月日
2010年5月24日
2. テーマ
16ビットマイコンを使いPWM機能を駆使し、ワイドレンジに設定できる簡易パルス発生器を製作する
3. 使用したPICマイコン
dsPIC30F2012-30I/SP    500円/@  ※ 2010/05現在  鰹H月電子通商 価格
4. 電源電圧とシステムクロック
電源:CPU:DC5V、クロック:7.372MHz×PLL:16逓倍=117.952MHz
5. 開発環境
ハードウェア:ICD-3(Microchip)、ブレッドボード(鰹H月電子通商)
ソフトウェア:MPLAB C30 Version.3.20b [SW006012] (Microchip)
6. 回路図
ここにあります!
7. プログラム
ソースファイル一式はここにあります。ZIPで圧縮しています。
8. 参照した主な書籍とWebサイト
「C言語ではじめるPIC24F活用ガイドブック」 後閑哲也 著者 葛Z術評論社 発行・・・文献1
「電子制御・信号処理のためのdsPIC活用ガイドブック」 後閑哲也 著者 葛Z術評論社 発行・・・文献2

 相変わらずの汚い開発状況ですが、どうかお許しを!ペコリ(o_ _)o)) 今回の開発の少し前に(今年の1月頃)、ちょっとしたツール を購入しました。まず上の一番左に移っている「ICD-3」のインサーキットデバッガーです。今となっては秋月電子さんに1万円後半の価格で売っていますが、実はちょうど展示会やセミナーなどに行くともらえた「 20%-OFF ディスカウントクーポン」があり、今後は16bitが主流になると見込み、Microchip・Drirectのサイトから「Explorer 16 スタータキット [DV164033]」を思い切って購入しました。またそれとほぼ同時期に「MPLAB C30 C compiler [SW006012 ]」のDownLoad版も購入しました。(; ̄ー ̄A アセアセ・・・ 結構な出費です!
 ICD-3を使う前はICD-2を使っていたのですが、宣伝通り、かなり高速に動作するため非常に快適なツールで喜んでいます。構成は回路図からも分かります通り、dsPIC 以外はX'tal水晶パスコンLED抵抗スイッチLCDだけの最低限の構成です。

 LCD画面構成

 右にLCD画面を載せています。16文字2行のLCDなのでだいたいこんな感じではないでしょうか!?
 電源ONと同時に約3秒間ほどオープニングメッセージを表示して、その後右の画面になります。

 今回LCDライブラリィや表示関連等のプログラムは上記文献のものを一部修正して使用させて頂きました。
ありがたや (^-^)ゞ ポリポリ
 周波数やデューティの変更は「EDITスイッチ」と4つの「左右上下スイッチ」で行います。EDITスイッチを1回押すと周波数1Hz単位位置が ブリンクし、カーソルが点滅します
上下スイッチでその桁の数値を変更でき、左右スイッチで桁移動します。左右スイッチを押し続けると、周波数の桁からデューティの桁に移動します。 もう一度EDITスイッチを押すとカーソルとブリンクは消えます。


 この数値変更プログラムは結構面倒くさいですね!数値範囲内のチェックや、ゼロチェック、矛盾する桁の操作チェックなど盛り込むとそれなりのプログラムになります。(面倒くさいと言っていたらプログラムはできませんね!! (。-人-。) ゴメーン
 出力のON/OFFは「ESCAPEスイッチ」で行います。スイッチを押すごとにONとOFFを繰り返します。先程の数値変更は出力のON/OFFに関わらず行え、出力を発生させながら変更できます。この辺のプログラムは結構厄介で、 割り込みを使う関係で、数値を更新するにあたり、出力をいったん停止させています。まぁ暴走するよりは良いと判断し、「これでよし!」としました。

 プログラムの概要

 とにかく久しぶりの製作で、「C言語」そのものを半分以上忘れている有様です!従って毎度のことですが「汚い」です!スマート性もかけています!・・・・ですがしっかり動作します。 どうかお許しを!ペコリ(o_ _)o))
 さてプログラムは・・・・今回のdsPICには出力コンペア2個搭載されています。この出力コンペア2個をPWMモードとして使用することにしまし。問題はどうして 位相180度ずらすかですが、言葉で言うと単純です。「最初にOC1を動かし、単に設定周波数の1/2 のところでもう一つのOC2をスタートさせれば良い」と言うことになります。
 これならすぐできると思い、Microchip社16ビット・ペリフェラルライブラリィのうち「timer.h」と「outcompare.h」を使い簡単に済むと甘く考えていました。 もう一つの問題点はデューティの「分解能」です。周波数が高いほど分解能は小さくなります。今回はそれほど精度(分解能 を含め)を要求しせん。分解能システムクロック÷設定周波数です(プリスケラは別として)。今回使用したdsPICはシステムクロックの最大周波数はPLLを使って (X'tal:7.5MHz×PLL:16)÷4=30MHzです。目標仕様で決めた周波数最大250kHzです。
 OCxPWMモードにした場合の周期は文献より、(タイマーのPeriod値+1)×プリスケラ ×システムクロックです。Period値16ビットで、設定できる最大値は65535です。システムクロック÷設定周波数65535より大きければプリスケラを上げていきます。65535より小さければそれをタイマーのPeriod値にします。
 例えばシステムクロック30MHz設定周波数250KHzの場合、両者割ると120が得られます。これが デューティ分解能になります。100以上あるので1%刻みの設定が出来ますのでこれで良しとしたわけです!今回、7.5MHz7.5MHz×PLL=16:120MHzの予定だった)クリスタル水晶が入手できなかったので7.372MHzとしました。計算はややこしいですが気にせず使いました。
 ところで最低周波数2Hzなのは・・・タイマーのプリスケラの最大値は256です。30MHz÷256÷2Hz60000で、65535より小さいので2Hzにしています。それ以下にする場合はもう一つタイマーをかまさなければなりませんが、今回はそこまでいらないので省略しました。
一方、180度 の位相をずらすのはTimer1を使用します。Timer1周期設定周波数1/2になるよう設定します。 最初のOC1の動作と同時にTimer1もスタートさせ、Timer1のタイムアップと同時に割り込みをかけ、次のOC2を動作させます。 OC2が動作すればTimer1は停止させます。次の周期、つまりOC1の一致(つまりOC1割り込み )と同時に、再びTimer1を起動させます。これを繰り返しています。

 さてMicrochip社16ビット・ペリフェラルライブラリィは素晴らしいのですが、素早く動作させるには細かな動作設定が出来なければなりません。少しでも精度を上げるため余計なことはしないでレジスタ を直接操作することにしました。従って途中でライブラリィを使うのをやめることにしました。また次の機会で検討したいと思います。

ヘッダーやライブラリィなどは左のように設定を行って下さい。

 今回、周波数を高くしたことによって消費電力が高くなります。実測で、5V時、約90mA流れます。実際のLED等の動作を含めると 100mA近くなります。またPLLの設定値は×4×8×16の3通りがあり、例えば 30MHzのクリスタルを使い、×4 にすれば120MHzいけると思ったのですが、ブレードボードではまともに動作しません。きちんと基板かしなければなりませんので注意して下さい。


 動作の様子

 少し見にくいですが設定と動作波形を下記に載せます。周波数はそれぞれ、10Hz、100Hz、1kHz、10kHz、100kHz、200kHz、250kHz,とし、 デューティはそれぞれの周波数で、10%、50%、90% と設定しました。






















 200kHz付近あたりから、分解能の粗さが出てきて、OC2の波形(つまり下の波形)の立下り部が、次の周期のOC1 の立ち上がりとのずれが目立ち始めています。250kHzデューティ50%の波形をみるとよくわかります。

 総  評

 今回はしばらくC言語から離れていたので、かなり時間を要しました。またプログラムでは、出力キャプチャーの使い方を理解するのにも結構時間を要しました。 とりあえず目標達成と勝手に自分で思っています 。 d(⌒ー⌒) グッ!!
 dsPIC中にはモータ制御用にPWM6個も持っているものがあるそうです。これで6波形出せると結構面白いかもしれません。慣れると MPLAB C30も結構使えそうです。MCU自体、今は少し高いのですが、需要が高まれば価格が下がるように思えます。期待したいです。
 先駆者のサイトの皆さんは私よりもかなりすごいことをしているので、勉強になります。・・・・精進しなければ・・・・おしまい!