今回はコンフィグレーション設定について詳しく解説します。
今回の説明
回路を完成させるために以下の順序で説明しています。このエントリの説明は(3)「プログラムを作る」の部分のプログラムの解説のステップになります。
- LEDを電池と抵抗のみで光らせる回路を組み立てる
PICマイコンの回路を組み立てる前に、まずはブレッドボードに慣れておくことにします。電池、抵抗、LEDのみを使って、ブレッドポード上に回路を組んでLEDを光らせてみます。ここでは電池、抵抗、LEDの回路記号と回路図の説明をして、回路図からブレッドボードに組む方法を説明します。まずはブレッドボードに慣れましょう! - PICマイコンのベース回路を組む
はじめの一歩の回路は、LEDを1秒に1回光らせるだけの回路です。この回路をブレッドボードに組み立てます。 - プログラムを作る
LEDを1秒に1回光らせるプログラムを作成します。 - PICマイコンに書き込んで動作させる
作成したプログラムをPICマイコンに書き込んで動作させてみます。 - ベース回路にスイッチを追加
LEDの点滅をスイッチで開始させるために、ベース回路にスイッチを追加します。これまではLEDを光らせる、という出力制御をしましたが、今度はPICマイコンで外部から信号を入力する方法を確認します。 - ベース回路にブザーを追加
スタートスイッチ付きの、1秒に1回光らせる回路を作りましたので、ブザーを追加してタイマーとして完成させます。
説明するコンフィグレーション設定項目
前回 #pragma config の意味を説明しましたので、あとは各設定項目を説明するだけです。「だけです」と書いてしまいましたが、今回説明するプログラムの中で、このコンフィグレーション設定部分の理解が一番大変だと思います。なるべくわかりやすく説明するよう心がけますが、うまく説明できないところもあると思いますので、わからないことなどありましたらコメントかお問い合わせフォームからご質問いただければと思います。
コンフィグレーション設定は、以下のフォーマットで記述します。
#pragma config [設定項目] = [設定値]
例えば、前回説明しましたクロックに関する設定は、
#pragma config FOSC = [設定値]
のように記述します。[設定値]については、それぞれの設定項目で設定できる値が決まっていますので、これから順に説明していきます。
ところで、各設定項目を詳しく説明すると、かなり長くなりますので、最初に概要を説明します。かなり数が多くてげんなり、って感じもしますが、この段階で全部理解する、というより、まずはざっとどんなものがあるのか、ご確認いただければと思います。
- FOSC
クロック設定を行います。具体的には、PICマイコンを動作させるクロックを外部から供給するのか、内部クロックを使うのか、またそれぞれに対してより詳細な設定を行います。 - WDTE
ウォッチドッグタイマー、というものを設定します。この設定をしておくと、PICマイコンがフリーズしてしまったときにPICマイコンを強制的にリセットしてプログラムのはじめから実行することができます。 - PWRTE
パワーアップタイマ、というものを設定します。電源投入直後やリセット直後は、電源の状態やPIC内部の動作状態が不安定になるケースがありますので、安定するまでPICマイコンの動作を停止させておく、というタイマー設定です。 - MLCRE
PCとかゲーム機ってハード的なリセットボタンがありますよね。PICマイコンも同様に、スイッチなどの外部ハードウエアからリセット信号を与えることができます。その設定を行います。 - CP, CPD
PICマイコンに書き込んだプログラムやデータはPICKit3を使って、MPLABXで読み取ることができます。ただし、製品にする場合など、読み取られないようにしたいことがあります。CPではプログラム、CPDではデータの外部からの読み取りをOKにするか禁止するか設定します。 - BOREN
前回のエントリで説明しましたが、ブラウンアウトが発生したときのPICマイコンの動作設定を行います。 - CLKOUTEN
PICマイコンのクロック信号を外部に出力する設定です。PICマイコンのクロック信号を外部でも使用したい場合に使用します。 - IESO
クロックを2段階で立ち上げる設定します。一般的に、PICマイコンの内部クロックはすぐにクロック信号が安定しますが、外部からクロックを供給する場合、クロック発生する電子部品は信号が安定するまで意外に時間がかかります。PICマイコンの起動をスムーズにするために、電源投入直後は内部クロックを使用して、ある程度時間が経ったら外部クロックに切り替える、という設定をします。なお、ここで言っている「時間」はミリ秒の世界です。 - FCMEN
クロックはPICマイコンを動作させる一番基本的な信号です。この信号がなくなったら動作しなくなります。もし外部クロックが何かの原因で故障したとき、バックアップとして内部クロックに切り替えることが可能です。ここではこの設定を行います。 - WRT
PICマイコンの中にはいろいろな種類のメモリがあります。例えばプログラム実行時にデータ一時的に記憶しておく「RAM」と呼ばれる領域や、電源を切ってもデータが消えない「EEPROM」と呼ばれる領域があります。これらとは別に、プログラムを書き込む領域もあります。「プログラムを書き込む」ということは、このメモリは書き換えが可能ということですので、プログラムが自分自身を書き換え可能、ということになります。でも普通はプログラムが書き換えられたら動作しなくなってしまうので困りますよね。一方で、プログラム実行中にこの領域を変更したいケースもあるんです(詳しくは、この設定項目の時に説明します)。この項目は、プログラム領域を保護するかしないかの設定を行います。 - PLLEN
この設定は、クロック周波数を4倍にする設定です。PIC12F1822の内部にあるクロック発生モジュールの最高周波数は8MHzです。この設定をONにすると4倍の32MHzになります。クロック周波数のターボチャージャーといったところでしょうか。 - STVREN
この項目の説明はなかなか難しいので後ほど詳しく説明します。概要としては、スタック領域が溢れた場合の動作を設定するものです。C言語をある程度学ばれた方であれば、ヒープ領域やスタック領域などという言葉が出てきたと思いますが、ここで設定する「スタック領域」は意味が異なりますので、この項目の説明をお読みいただければと思います。 - BORV
上に出てきた「BOREN」をONに設定した場合のブラウンアウト判断する電圧を設定します。どのくらいまで電圧が下がったらブラウンアウトが発生したと判断するか、その電圧を2段階で設定します。 - LVP
PICマイコンのプログラム記憶領域にプログラムを書き込む瞬間、ちょっと高めの電圧で書き込みを行っています。この電圧制御はPICKIT3が自動的に行っているので普段はあまり気にしなくて問題ありません。ただ、自作のプログラム書き込み装置などを作る場合、この高い電圧が用意できないこともあります。そこで、この設定をONにすると、プログラム書き込み電圧をマイコンの電源電圧(この記事で使用するPIC12F1822では5V)と同じにすることができます。PICKIT3を使用する限り、この設定はOFFにします。
これだけでもなんかげんなりしますよね。ただ、普通に使う分にはお決まりの設定、という感じで毎回悩む必要はありません。以下に典型的な設定例を説明した後、各設定項目の詳細設定の説明をいたします。
典型的なコンフィグレーション設定
これだけの設定を検討するのはなかなか大変そうですが、一般的な使い方であればだいたいこうなるよね、という感じの設定があります。
そこで、PIC12F1822を以下の条件で使用する場合の典型的なコンフィグレーション設定を説明します。
- プログラム書き込みはPICKIT3を使用
- クロックは内部クロックモジュールを使用(外部クロックを使用する場合、使用できるピンが1本か2本減ってしまいます。時間計測や精密なタイミング制御など、精度が必要ない場合は内部クロックで十分です)
- リセットするための外付けスイッチなどのハードウエアは使用しない(外部リセットスイッチをつけると使用できるピンが1本減ってしまいます)
このような使い方であれば、以下の設定内容で問題ありません。
設定項目 | 内容 | 設定値 |
---|---|---|
FOCS | クロック設定 | INTOSC 内部クロック使用 |
WDTE | ウォッチドッグタイマー | OFF 使用しない |
PWRTE | パワーアップタイマー | ON 使用する |
MCLRE | リセット信号設定 | OFF 使用しない |
CP | プログラム読み出しプロテクト | OFF 読み出し可 |
CPD | データ読み出しプロテクト | OFF 読み出し可 |
BOREN | ブラウンアウト時動作設定 | ON ブラウンアウト時リセット |
CLKOUTEN | クロック信号出力 | OFF クロック信号は出力しない |
IESO | 起動時クロック切り替え | OFF 切り替えしない |
FCMEN | 外部クロック故障時切り替え | OFF 切り替えしない |
WRT | プログラムメモリプロテクト | OFF プロテクトしない |
PLLEN | PLL(クロック4倍) | OFF クロックはそのまま使用 |
STVREN | スタックオーバフロー時動作 | OFF 何もしない |
BORV | ブラウンアウト電圧 | LO 低い電圧 |
LVP | 低電圧プログラム書き込み | OFF 使用しない |
この設定を基本形として、必要な機能を実装するときに、このコンフィグレーション設定をどうすべきか、考えてみるのがよいと思います。
それでは、それぞれの項目について詳しく説明します。なお、FOSC(クロック設定)は重要ですのでかなり詳細に説明しますが、その他の項目の説明は入門的な範囲にとどめますのでご了承ください。
FOSC(クロック設定)
今まで何度か説明してきましたが、PICマイコンも含めて、世の中のプロセッサはクロック信号を元に動作します。FOSC設定では、PICマイコンを動作させるためのクロックの種類についての設定を行います。
大きく分けて、外部からクロック信号を供給するか、PICマイコン内部に内蔵しているクロック発生モジュールを使用するか、の設定です。
また、それぞれに対していろいろと細かい設定値が用意されています。今後いろいろなPICマイコンの回路図を見ることになると思います。その際、クロックについてはいろいろな形態がありますので、この設定は一通り読まれておいた方がよいと思います。ちょっと長くなるかもしれませんが、FOSC設定に関しては詳しく説明しておくことにします。
外部からクロック信号を供給する場合、クロック周波数は、そのクロック信号を発生する電子部品により決まります。
例えば、クロックを発生する部品としては「水晶発振子」というものがあります。ネットの通販サイトなどでこの部品を探してみると、「8MHz水晶発振子」「12MHz水晶発振子」などがあります。例えばUSBデバイスを作りたい場合、正確な48MHzの周波数を生成する必要があるので、外部に12MHz水晶発振子をつけ、それを4倍にして(PLLENをONにして)使います。
一方、内部クロックを使う場合は、FOSCでは「内部クロックを使用する」という設定のみ行い、クロック周波数はプログラム(main関数の中など)で設定します。
基礎編では内部クロックを使用しており、そのクロック周波数を1MHzに設定しますが、この設定はmain()関数の中で行っています。すでにプログラムを掲載していますので気づかれた方もいらっしゃるかもしれませんね。
ところで、クロック周波数の設定はマイコンの設定に関わるものなのだから、設定はプログラムの中で設定するというより、コンフィグレーション部分で行うのが妥当ではないか、と思われた方もいるかもしれません。しかしクロック周波数はプログラムで実行途中に変更することができます。この背景を説明します。
クロック周波数が高い(=早く動作する)と、プロセッサの消費電力は大きくなります。
PICマイコンの場合、テレビやエアコンなどのリモコンに使われることもありますが、リモコンはいつも使っているわけではないので、使っていないときは消費電力は抑えたいですよね。このようなときのためにプログラム中で周波数を変更できるようになっています。
例えばリモコンの場合、ボタンが押されていないときは周波数を低くして待機、ボタンが押されたことを検知したら周波数をあげてリモコン信号を発生させる、などという使い方です。PICマイコンを始めとする、マイコンを使って電池動作させる機器を作る場合、このようにクロック周波数を制御して電池を長持ちさせる、というテクニックがあります。
FOSC設定(クロック設定)の具体的な設定値を説明する前に、クロック信号を発生させるための電子部品やクロック信号、PIC12F1822のクロックに関するピンなどを説明します。
PICマイコンの外部からクロック信号を供給する場合、クロック信号を発生させるための電子部品としては「水晶発振子(一般名)」や「セラロック(商品名)」というものがあります。
まず水晶発振子は以下のようなものです。
10個入り400円程度ですので、1個40円ぐらいです。個人で使用する分にはこんなもんか、と思われるかもしれませんが、製品として量産する場合、この金額は結構高いものとなります(大量購入の場合はもっと安くなりますがそれでも高い)。後でコストの観点で違う部品も出てきますので、この値段を参考として頭の隅に置いておいていただければと思います。
水晶発振子の仕組みですが、水晶を薄く削り、その両側に電極をつけて電圧をかけると水晶が振動する性質を利用しています。薄ければ薄いほど高い周波数が得られますが、薄くするには限界があり、また薄くするほど発振周波数を調整するのが難しくなってくるので、あまり高い周波数には向いていません。また、水晶発振子単体では発振せず、コンデンサを外付けする必要があります。
水晶発振子の電子回路記号は以下です。
なんとなく、水晶を電極で挟んだ感じが出ていますよね。発振させるには、コンデンサを以下のように接続します。
もうひとつのクロック信号発生電子部品としてセラロックがあります。
こちらも1個40円程度です。ちょっと高めです。こちらは水晶の代わりにセラミックを使っています。圧電性セラミック、というものに電圧をかけると水晶と同様に振動するため、この性質を利用しています。
また水晶発振子と違って、コンデンサを内蔵しているため、後からコンデンサを外付ける必要はありません。電子回路記号ですが、セラロック専用の回路記号はないようで、以下のような書き方をよく見かけます。ようするに水晶発振子に外付けコンデンサをつけたものと同じで、それらを四角で囲ってあり、回路図に「セラロック」と書かれていることもあります。
ところで、電子工作やコンピュータに興味がある方でしたら、もしかしたらクロック信号について書籍などで見かけたことがあるかもしれません。こんな感じの信号です。
このような形の信号を「矩形波」あるいは「方形波」と呼びます。しかし、先ほど説明した水晶発振子やセラロックが発生する信号はこのような形ではありません。実際には以下のような形です。
このような形の信号を「正弦波」あるいは「サイン波」と呼びます。外部からPICマイコンにクロック信号を水晶発振子やセラロックで供給する場合、このような正弦波を供給することになります。
PICマイコンが動作するには矩形波のクロック信号を必要となるため、内部でこの正弦波を矩形波に整形(変換)しています。この整形(変換)する回路ですが、周波数によって最適な回路特性が異なります(増幅器の利得の値が異なる)。この回路特性が異なる、という点についても設定値の説明にちょっとだけ出てきますので、こちらも頭の片隅に置いておいてください。
次にPIC12F1822のクロックに関するピンを説明します。詳しくはPIC12F1822のデータシートに説明されていますが、クロックに関する機能は、以下のように割り当てられています。
クロックに関するピンは2番ピンと3番ピンになります。
当然ながら、内部クロックを選択した場合はこれらのピンにクロックを発生する部品を接続する必要はなく、入出力ピンなどに利用できます。
外部からクロックを供給する場合は、これらのピンに電子部品を接続することになります。それぞれ、複数の名前が振られていますが、FOSCで設定を行うことにより、各ピンの役割が決まります。それでは、PIC12F1822に外部クロックを接続する形態を一通り説明します。後でFOSCに設定する値を説明するときにわかりやすいように番号をつけておきます。
なお、これらの接続形態はほとんどのPICマイコンに共通ですので、他のマイコンを使われる際にも参考にしてみてください。
それではこれから一通りの接続形態について説明します。
[接続形態1]
まずはじめの接続形態は、水晶発振子あるいはセラロックを接続する方法です。FOSCにこの接続形態を指定した場合、2番ピンはOSC1ピン、3番ピンはOSC2ピンとなります。”OSC”は発振素子、Oscillatorの略です。OSC1とOSC2の数字にあまり意味はなく、要するに発振素子の2本の線をこの2つのピンに接続すればOKです。
接続方法は以下の回路図のようになります。この場合、2番ピンと3番ピンは外部クロック発生素子に占有されてしまいますよね。つまり、2番ピンと3番ピンはそれぞれ入出力ピンなどの用途には使えなくなることになります。
[接続形態2]
次の接続形態は、抵抗とコンデンサを接続する方法です。まずは接続方法について以下の回路図を見てみましょう。
接続形態1と異なり、外部からクロック供給するために2番ピンしか使用していませんよね。3番ピンは余りますので、普通に考えたら、入出力ピンとして使用することができそうですよね。もちろん使用することができます。ただこの接続形態の場合、3番ピンは別の役割のピンに設定することもできます。以下の2通りの設定ができることになります。
・接続形態2-1 (3番ピンを入出力ピンとして使用する場合)
・接続形態2-2 (3番ピンをCLKOUT(クロック出力)として使用する場合)
なおこの接続形態は、水晶発振子より精度(温度による変化など)は劣りますが、コストを抑えたい、ということきに使われます。先ほど、水晶発振子やセラロックは40円ぐらいでした。この回路は、抵抗が1円程度、コンデンサも5円〜10円ですからかなりコストを抑えることができます。
[接続形態3]
次の接続形態は、2番ピンに整形された矩形波を入力する方法です。例えばすでに外部で矩形波の波形のクロック信号がある場合、その信号をこの番ピン(CLKINピン)に入力することができます。
こちらも接続形態2と同様、クロック入力ピンとして2番ピンしか使用しません。接続形態2-2では、3番ピンはクロック信号出力ピンとして設定できましたよね。
でも、この接続形態ではすでに入力しているクロック信号は矩形波で整形されたものですので、それをCLKOUTピンからあえて出力する必要はありません。そのため、この接続形態の場合、3番ピンはRA4として入出力ピンとして使用することになります。
[内部クロック]
以上が外部からクロックを供給するときの接続形態ですが、内部クロックを使用する場合でも、2通りの設定が可能になっています。3番ピンを入出力ピンとして使用するか、クロック信号出力ピンとして使用するかの設定です。
なお、2番ピンはクロックの入力に使用されませんので、入出力ピンとして使用できます。
FOSCの設定値
さて、以上でFOSCに設定する値の必要な情報を説明しましたので、以下にFOSCに設定する値についてまとめます。
設定値 | 設定内容 |
---|---|
INTOSCIO | 内部クロックを使用する場合にこの値を設定します。この値を設定すると、2番ピンと3番ピンは入出力ピンとして使用できます。ただし精度はそれほどよくありません。 |
HS | 接続形態1で外部クロック周波数が4MHz〜20MHzの場合、FOSCにこの値を設定します。接続形態1の場合、HS/XT/LPのいずれかを指定しますが、これは先に説明したように、PICマイコン内部の回路特性の設定を変えるためです。以下、XT/LPについても同じです。 |
XT | 接続形態1で外部クロック周波数が4MHz以下の場合にこの値を設定します。 |
LP | 接続形態1で外部クロック周波数が32.768kHzの場合にこの値を設定します。これは時計用の32.768kHzの水晶発振子を使用するときに設定します。 |
RC | 接続形態2の場合にこの値を設定します。なお、3番ピンを入出力ピンとして使用するか(接続形態2-1)、クロック出力ピンとして使用するか(接続形態2-2)は、コンフィグレーション設定のCLKOUTEN(Clock-out Enable)で設定します。 |
ECH | 接続形態3の場合で、クロック周波数が4MHz〜32MHzの場合にこの値を設定します。 |
ECM | 接続形態3の場合で、クロック周波数が500kHz〜4MHzの場合にこの値を設定します。 |
ECL | 接続形態3の場合で、クロック周波数が500kHzまでの場合にこの値を設定します。 |
基礎編と応用編では、内部クロックを使用します。
#pragma config FOSC = INTOSCIO
と設定を記述することになります。また、他の例としては、12MHzの水晶発振子をを使用して外部からクロックを供給する場合は、
#pragma config FOSC = HS
と設定することになります。
ところで、クロック発生の形態がいろいろと出てきました。どれを選択すればよいのでしょうか。実はベストなものはなく、一長一短ですので、用途に合わせて選択することになります。
一長一短とは、精度を高めると部品コストが高くなったり、という感じです。ただ個人で使用する場合は、10円、20円のものがコストが高くなると言っても50円とかになる程度ですので、あまり関係ないかもしれませんね。
例えば時計などを作る場合、クロック周波数が不正確ですと、時刻も不正確になります。このような時は、内部クロックやRC発振に比較して、精度が高くて温度に対して比較的安定している水晶発振子を使った外部クロックが適しています。
ただしデメリットとしてコストが高いことがあります(といっても30円〜40円程度だったりしますが)。そのため、あまり精度や安定性が必要でない場合は、内部クロックやRC発振を使ったほうがよい、ということになります(といっても10円、20円を節約する程度ですが)。
これから1秒に1回発光ダイオードを点滅させる回路とかタイマー回路など、時間に関する回路を作っていきますが、何十時間も動かすことは想定していないことと、回路を簡単にすることから、内部クロックを使っています。もし1日以上などの長時間を計測する場合は、クロック回路を見直す必要があります。
また補足ですが、FOSCの設定がLPの場合、時計用の水晶発振子で、その発信周波数は32.768kHz、となんだか中途半端な数字に見えますよね。でもこの32.768kHzというのは、マイコンでは非常に扱い易い数字なんです。
32.768kHzは、1kHzが1000Hzですので、32768Hz、ということになります。つまり、1秒間に32768回振動する、ということです。時計を作る場合、クロック信号を32768回数えたら1秒、ということになります。この32768、という数字は、実は2の15乗となっています。16進数で表すと0x8000、2進数では0b1000000000000000になります。
32768まで数えたかどうかは、2バイトの変数、つまりunsigned shortを用意して、最上位ビットが1になったら1秒、ということでとても扱い易い数字(周波数)となっています。実際、この32.768kHzの水晶発振子は、時計用として売られていますし、クオーツ時計にはこの周波数の水晶発振子が内蔵されています。
残りの設定項目は次回の記事で説明します。
更新履歴
日付 | 内容 |
---|---|
日付 | 内容 |
2016.9.18 | 新規投稿 |
2018.11.24 | 誤記訂正 |
こんにちは。今現在、雪崩トランシーバーというものを作製しておりまして、PICマイコンから457kHzのPWM信号を相補モードで出力しようとしています。
結論から言えばできたのですが、PWM信号の周期が計算式と合いません。
マイコンはPIC16F1827を使用し、供給クロックは48MHzの水晶振動子です(若干オーバークロック)
データシートにある計算式によれば、PWM の周期は
(1+34) * 4 * 1 * (1 / 48MHz) = 2.91 * 10 ^-6(s)
≒ 343kHz
になるはずなのですが、実際には457kHzとなっています。
どうしてでしょうか。。。
プログラム全文は以下のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
#include <xc.h>
#include <pic16f1827.h>
// コンフィギュレーション1の設定
#pragma config FOSC = HS
//#pragma config FOSC = INTOSC // 内部クロック使用する(INTOSC)
#pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // データメモリーを保護しない(OFF)
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA4ピンで使用する(OFF)
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(OFF)
// コンフィギュレーション2の設定
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config PLLEN = ON // 動作クロックを32MHzで動作(ON)
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)
#define _XTAL_FREQ 48000000
void PICinit() {
//OSCCON = 0b01110000; // 内部オシレータ使用時
OSCCON = 0b00000000; // 外部オシレータ使用時
ANSELA = 0b00000000;
ANSELB = 0b00000000;
TRISA = 0b00000000;
TRISB = 0b00000000;
PORTA = 0b00000000;
PORTB = 0b00000000;
}
/* PWM initialize */
void PWM(){
CCP2CON = 0b00001101 ; // PWM機能(シングル出力:相補モード)を使用する
CCP2SEL = 0 ; // CCP2(P2A)ピンは12番ピンのRB6を使用する
P2BSEL = 0 ; // P2Bは13番ピンのRB7を使用する
PSTR2CON= 0b00000011 ; // P2AをPWM出力する、P2Bは反転出力
T2CON = 0b00000000 ; // TMR2プリスケーラ値を1倍に設定
CCPR2L = 0 ; // デューティ値は0で初期化
CCPR2H = 0 ;
TMR2 = 0 ; // タイマー2カウンターを初期化
PR2 = 34 ; // PWMの周期を設定
}
int main(void){
PICinit(); // PICを初期化
PWM();
TMR2ON = 11 ; // TMR2(PWM)ON
while(1){
CCPR2L = 20;
RA1 = 1;
__delay_ms(100);
CCPR2L = 0;
RA1 = 0;
__delay_ms(1000);
return 0;
}
}
ご質問どうもありがとうございます!
ご連絡が遅くなってしまい申し訳ございませんでした。
結論としては、すみません、なぜこのプログラムで457kHzになるのか謎です…
16F1827での実機確認はしていないのですが、データシートを確認してみました。
結論としては、プログラムのパラメータ設定では約342.86kHzになるはずですよね。
何かのパラメータを変えると457kHzになるのかと思いましたが、周波数を決定するパラメータは、PR2、Fosc、プリスケール値だけですので、上のプログラムの設定で457kHzになるというのは原因特定が難しいです…
解決できずに申し訳ございません。とりあえず現物あわせで運用するのがいいかもしれませんね…
こんにちは。
その後いろいろ調べまして、とりあえずこれだろうなぁと思える結論を出すことができましたので、共有します。
まず、今回の現象を説明するには水晶の「オーバートーン」について知る必要があります。これは水晶振動子をより高い周波数で共振させる目的で、基本波の3倍や5倍の周波数で共振可能にした構造のことを指します。
・他の方のブログになってしまいますが、こちらが分かりやすいです→http://www.nahitech.com/nahitafu/mame/mame1/xtal.html#ic
今回私が使用した水晶振動子は秋月で購入した48MHzのものですが、これは16MHzを3次オーバートーンにより48MHzで共振可能としています。
さて、PICマイコンの外部振動子を駆動する回路は何MHzまで対応しているのか?ということですが、おそらく公式では20MHzまでかと思われます。
こちらの資料のtable 2-4を参照。
→https://ww1.microchip.com/downloads/en/DeviceDoc/31002a.pdf
PLLを使用した場合についてはちょっと分かりませんでした。
ということで、48MHzの水晶を接続してもPICマイコンの内蔵回路ではオーバートーン駆動をさせることができず、基本波である16MHzで駆動していたものと推測できます。また上記のプログラムではPLLをONにしていたため、最終的なメインクロックは64MHzとなります。
ここでPWM 周波数を計算すると、
(1+34) * 4 * 1 * (1 / 64MHz) = 2.188 * 10 ^-6(s)
≒ 457.14kHz
となり、これが出力されていたようです(写真1)。試しに水晶振動子をオーバートーンなしの16MHzに交換しましたが、出力周波数に変化はありませんでした(写真2、16MHzの水晶を使用した方が、わずかに理想計算値に近い)。
写真2です。
お忙しいところ返信いただきましてどうもありがとうございました!
水晶のオーバートーンですか!
昔、アナログ回路を勉強した時に発振回路のところで出てきた記憶がかすかにあります… 内容はすっかり忘れていました笑
CKW様の推察はその通りという感じですね。理論的に説明できますし、その結果の計算結果もあっていますので、解説いただいた通りですね。
私は以前、PICマイコンでUSB機器を作ったことがあるのですが、その時は外部12MHz、PLLで4倍にして48MHzを作っていました。その時はセラロックの12MHzを使っていましたので問題なくできていたんでしょうね。
水晶発振子は特性がいいですが、使うときはいろいろ知識が必要ですね。アナログ回路は奥深くて面白いです。
今回いただいた内容は本当に勉強になりました。このサイトを運営していてよかったなぁ、とつくづく思います。
本当にどうもありがとうございました!
dsPIC33 でのソフト開発に向けて基礎から PIC の基礎から学習しており、参考にさせていただいております。
基礎か訂正に記事を纏めていただいており、大変有難く拝見させていただいております。
本記事で2点お伺いしたくお願い申し上げます。
1.接続形態3の3番ピンについて
記事では「この接続形態の場合、3番ピンはGP4として入出力ピンとして使用することになります。」と記載されておりますが、「GP4」とはなんでしょうか?
今までの記事では「RA4/OCS2/CLKOUT」で「GP4」は初見です。
2.FOSC の設定値について
記事では「ECH:接続形態3の場合で、クロック周波数が500kHzまでの場合にこの値を設定します。」となっておりますが、正しくは「ECL:接続形態3の場合で、クロック周波数が500kHzまでの場合にこの値を設定します。」ではないでしょうか?
※ECH: 4MHz ~ 32MHz, ECM: 500kHz ~ 4MHz ですので…
詳細なコメントをいただきどうもありがとうございました。
ご質問いただいた2点とも記事が間違っておりました。訂正いたしました。以下、補足になります。
(1) 接続形態3の3番ピン
PIC12F1822のデータシートでは、3番ピンは「RA4」ですので「RA4」が正しいです。ところで記事に書いてありました「GP4」ですが、これは以前の記事の名残りでした…このシリーズの前に、PIC12F683というPICマイコンを使用した記事を書いておりました。PIC12F683は、ピン名が「GP4」など「GP」という名称が使用されていました。「GP」は「General Purpose」の略だと思います。現在のPICマイコンは「RA」で統一されているようです。
(2) FOSCの設定値
すみません、これは単純にミスです。一人ではなかなか気付きませんので、ご指摘いただき本当にどうもありがとうございます。
ところでdsPIC33シリーズはDSPが使えますので、信号処理でいろいろできますよね。ぜひ面白いものを制作いただければと思います。
こんにちは。昔、職業訓練所で組込みソフトウェアを学んだ者です。今はソフトとは異なる道に進んでいるものの、組込みに興味があり、合間を見つけてとても興味深く読ませていただいております。とてもわかりやすく親切に説明されていてスポンジが水を吸収するように理解が進んでいます。大変感謝しています。
このページを読んでいて一点不明点がございましたので、確認させていただきたく投稿させて頂きました。
[接続形態2]は「PICマイコン内部に内蔵しているクロック発生モジュールを使用している」という認識でよいでしょうか。この認識が正しいということであれば、[接続形態2-2 ]ではPICマイコン内部に内蔵してる振動子が発生させたクロックを外部に出力しているという認識でよいでしょうか。
ご回答いただければ幸いです。
このように情熱的でわかりやすいHPを作っていただき本当にありがとうございます。