今回はPICマイコンのコンフィグレーション設定について詳しく解説します。
今回の説明
PICマイコン電子工作入門の基礎編は、次のステップで説明しています。
この記事の説明は「❸ プログラムを作る」のうち、「PICマイコンのコンフィグレーション設定」を説明します。
- LEDを電池と抵抗のみで光らせる回路を組み立てる
PICマイコンの回路を組み立てる前に、ブレッドボードの取り扱いに慣れておくことにします。電池、抵抗、LEDのみを使って、ブレッドボード上に回路を組み立ててLEDを光らせてみます。ここでは電池、抵抗、発光ダイオードの回路記号と回路図の説明をして、回路図からブレッドボードに組む方法を説明します。まずはブレッドボードに慣れましょう! - PICマイコンのベース回路を組む
PICマイコンのはじめの一歩の回路は、LEDを1秒に1回光らせるだけの回路です。
この回路をブレッドボードに組み立てます。 - プログラムを作る ⬅︎ 今回
LEDを1秒に1回光らせるプログラムを作成します。 - PICマイコンに書き込んで動作させる
作成したプログラムをPICマイコンに書き込んで動作させてみます。 - ベース回路にスイッチを追加
LEDの点滅をスイッチで開始させるために、ベース回路にスイッチを追加します。
これまではLEDを光らせる、という出力制御をしましたが、今度はPICマイコンで外部からスイッチの信号を入力する方法を習得します。 - ベース回路にブザーを追加
スタートスイッチ付きの、1秒に1回光らせる回路を作りましたので、ブザーを追加してタイマーとして完成させます。
説明するコンフィグレーション設定項目
前回の記事で、PICマイコンのコンフィグレーション設定の書き方を説明しました。
#pragma config [設定項目] = [設定値]
あとは各設定項目を説明するだけです!
「だけです」と書いてしまいましたが、実はPICマイコンのプログラムの中で、このコンフィグレーション設定部分の理解が一番大変だと思います。
なるべくわかりやすく説明するよう心がけますが、うまく説明できないところもあると思いますので、わからないことなどありましたらコメントかお問い合わせフォームからご質問いただければと思います。
設定項目一覧
各設定項目を詳しく説明するとかなり長くなりますので、最初に設定項目の一覧を確認しておきたいと思います。それぞれの項目で詳しく説明しますので、この一覧はざっと確認いただくだけで大丈夫です。
設定項目 | 設定内容 |
---|---|
FOSC | PICマイコンを動作させるクロック信号を外部から供給するのか、マイコン内部で発生した信号を使うのかの設定をします。 |
WDTE | ウォッチドッグタイマーを設定します。ウォッチドッグタイマーを使用すると、PICマイコンがフリーズしてしまったときにPICマイコンを強制的にリセットしてプログラムのはじめから実行することができます。 |
PWRTE | パワーアップタイマを設定します。電源投入直後やリセット直後は、電源の状態やPIC内部の動作状態が不安定になるケースがあります。安定するまでPICマイコンの動作を一度停止させておく、というタイマーの設定です。 |
MCLRE | PCとかゲーム機って「リセットボタン」がありますよね。PICマイコンも同様に、スイッチを接続してリセットすることができます。ここではそのリセットの設定を行います。 |
CP・CPD | PICマイコンに書き込んだプログラムやデータはPICKitを使って、MPLAB X IDEで読み取ることができます。ただし、企業が製品にする場合など、読み取られないようにしたいことがあります。CPはプログラム、CPDはデータの外部からの読み取りをOKにするか禁止するか設定します。 |
BOREN | 電源電圧が低下したとき、PICマイコンの動作を停止する設定です。 |
BORV | 「BOREN」をONに設定したとき、電圧低下として判断する電圧を設定します。どのくらいまで電圧が下がったら電圧低下が発生したと判断するか、その電圧を2段階で設定します。 |
CLKOUTEN | PICマイコンのクロック信号を外部に出力する設定です。PICマイコンのクロック信号を外部でも使用したい場合に使用します。 |
IESO | クロックを2段階で立ち上げる設定します。一般的に、PICマイコンの内部クロックはすぐにクロック信号が安定しますが、外部からクロックを供給する場合、クロック信号を発生する電子回路によっては信号が安定するまで少し時間がかかります。PICマイコンの起動をスムーズにするために、電源投入直後は内部クロックを使用して、ある程度時間が経ったら外部クロックに切り替える、という設定をします。なお、ここで言っている「時間」はミリ秒の世界です。 |
FCMEN | クロック信号はPICマイコンを動作させる一番基本的な信号です。この信号がなくなったら動作しなくなります。もし外部クロックが何らかの原因で故障したとき、バックアップとして内部クロックに切り替えることが可能です。ここではこの設定を行います。 |
WRT | PICマイコンの中にはいろいろな種類のメモリがあります。例えばプログラム実行時にデータ一時的に記憶しておく「RAM」と呼ばれる領域や、電源を切ってもデータが消えない「EEPROM」と呼ばれる領域があります。これらとは別に、プログラムを書き込む領域もあります。「プログラムを書き込む」ということは、このメモリは書き換えが可能ということですので、プログラムが自分自身を書き換え可能、ということになります。でも普通はプログラムが書き換えられたら動作しなくなってしまうので困りますよね。一方で、プログラム実行中にこの領域を変更したいケースもあるんです。この項目は、プログラム領域を保護するかしないかの設定を行います。 |
PLLEN | この設定は、クロック周波数を4倍にする設定です。PIC12F1822の内部にあるクロック発生モジュールの最高周波数は8MHzです。この設定をONにすると4倍の32MHzになります。クロック周波数のターボチャージャーといったところでしょうか。 |
STVREN | この項目の説明はなかなか難しいのですが、概要としては、スタック領域が溢れた場合の動作を設定するものです。次回の記事で詳しく説明します。 |
LVP | PICマイコンにプログラムを書き込むとき、PICkitはPICマイコンのピンに少し高めの電圧を加えています。この信号を元にPICマイコンはプログラム書き込みモードになります。 この仕組みとは別に、PICマイコンをプログラム書き込みモードにするために、「書き込みますよ」という信号を与える方法もあります。この場合は高い電圧は不要となります。 この高い電圧が不要の書き込み方法を「低電圧プログラミング(Low Voltage Programming)」と呼んでいます。 LVPはどちらの書き込み方法かを指定する設定です。 なお、「PICkit5・PICkit4」は高い電圧の書き込み方法をサポートしていますが、「MPLAB PICkit Basic・MPLAB Snap」はサポートしていませんので注意が必要です。また、低電圧プログラミングを使用する場合、PICマイコンの1ピンが使用できなくなる点にも注意が必要です。 |
なんだかこれだけでもなんかげんなりしてしますね。
ただ、普通に使う分にはお決まりの設定、という感じのテンプレ設定がありますので、毎回プログラムを作成するたびに悩む必要はありません。
これから、典型的な設定例を説明した後、各設定項目の詳細設定の説明をしていきます。
典型的なコンフィグレーション設定
これだけの設定を検討するのはなかなか大変そうですが、一般的な使い方であればだいたいこうなるよね、という感じの設定があります。
そこで、PIC12F1822を次の条件で使用する場合の典型的なコンフィグレーション設定を説明します。
- クロックは内部クロックモジュールを使用
外部クロックを使用する場合、使用できるピンが1本か2本減ってしまいます。時間計測や精密なタイミング制御など、精度が必要ない場合は内部クロックで十分です。 - リセット用の外部スイッチなし
外付けのリセットスイッチを使用すると、使用できるピンが1本減ってしまいます。リセットは電源のOFF/ONで対応します。
このような使い方であれば、コンフィグレーション設定は次のようになります。
設定項目 | 設定値 |
---|---|
FOCS | 内部クロックを使用 |
WDTE | ウォッチドッグタイマーは使用しない |
PWRTE | パワーアップタイマーは使用する |
MCLRE | 外部リセットは使用しない |
CP・CPD | プログラム・データともに読み出し可能 |
BOREN | 電圧低下時はPICマイコンを一時停止 |
BORV | 低めの電圧に設定 |
CLKOUTEN | クロック信号は外部に出力しない |
IESO | 起動時、クロックの内部外部切り替えはしない |
FCMEN | 外部クロック故障時の切り替え処理はしない |
WRT | プログラムメモリの保護はしない |
PLLEN | クロックはそのまま使用する(4倍にしない) |
STVREN | スタックオーバーフロー時は何もしない |
LVP | 高い電圧の書き込みを使用する (MPLAB PICkit Basic・MPLAB Snapは高い電圧の書き込みに対応していない) |
プログラムを作成する場合はこの設定を基本形として、必要な機能を実装するときに、該当する設定項目をどうすべきか、考えてみるのがよいと思います。
それでは、それぞれの項目について詳しく説明します。
なお、FOSC(クロック設定)は重要ですので詳細に説明しますが、その他の項目の説明は入門的な範囲にとどめますのでご了承ください。
FOSC(クロック設定)
FOSC設定(クロック設定)は、大きく分けて「外部からクロック信号を供給するか」「PICマイコン内部のクロック発生モジュールを使用するか」の設定を行います。
また、「外部からクロック信号を供給する」場合、さらに細かい設定値が用意されています。
PICマイコンの製作例を見ると、クロック信号発生についてはいろいろな形態があります。そこで、クロックの設定についてはちょっと長くなるかもしれませんが、すべての設定値について詳しく説明しします。(このシリーズ記事では内部のクロックしか使用しませんが…)
クロック信号の周波数
FOSCでは、クロック信号をどこから供給するか、という設定だけです。
クロック信号は周波数の設定も必要になりますが、この設定はどうするのか説明します。
外部クロック信号の周波数
外部からクロック信号を供給する場合、クロック周波数は、そのクロック信号を発生する電子部品により決まります。(プログラムで設定することはできません)
例えば、クロックを発生する部品としては「水晶発振子」というものがあります。
ネットの通販サイトなどでこの部品を探してみると、「8MHz水晶発振子」「12MHz水晶発振子」などがあります。例えばUSBデバイスを作りたい場合、正確な48MHzの周波数を生成する必要があるので、推奨発振子を使います。
他にもクロック信号を発生する電子部品がありますが、周波数はその部品により決まります。
内部クロック信号の周波数
一方、内部クロックを使う場合は、FOSCでは「内部のクロック信号を使用する」という設定のみ行い、クロックの周波数はプログラムの処理の中(main関数の中など)で設定します。
基礎編では内部クロックを使用しており、そのクロック周波数を1MHzに設定しますが、この設定はmain関数の中で行っています。
すでに動作確認の時にプログラムが出てきましたので、プログラム中のコメントで気づかれた方もいらっしゃるかもしれませんね。
ところで、クロック周波数はマイコンの基本動作の設定に関わるものなので、設定はプログラムの中で設定するというより、コンフィグレーション部分で行うのが妥当ではないか、と思われた方もいるかもしれません。でも、クロック周波数はプログラムで実行途中に変更することができます。この背景を説明します。
クロック周波数を高くする(=早く動作する)と、プロセッサの消費電力は大きくなります。
PICマイコンは、テレビやエアコンなどのリモコンに使われることもありますが、リモコンはいつも使っているわけではないので、使っていないときは消費電力は抑えたいですよね。
このようなときは、例えばボタンが押されていないときは周波数を低くして待機、ボタンが押されたことを検知したら周波数をあげてリモコン信号を発生させる、などという使い方ができます。
PICマイコンを始めとする、マイコンを使って電池動作させる機器を作る場合、このようにクロック周波数を制御して電池を長持ちさせる、というテクニックがあります。
外部クロック信号発生の電子部品
次に、外部でクロック信号を発生するときの、電子部品を確認します。
PICマイコンの外部からクロック信号を供給する場合、クロック信号を発生させるための電子部品としては「水晶発振子」や「セラロック」というものがあります。
水晶発振子
水晶発振子は以下のようなものです。1個40〜50円程度の部品です。
水晶発振子の仕組みですが、水晶を薄く削り、その両側に電極をつけて電圧をかけると水晶が振動する性質を利用しています。
薄ければ薄いほど高い周波数が得られますが、薄くするには限界があり、また薄くするほど周波数を調整するのが難しくなってくるので、あまり高い周波数には向いていません。また、水晶発振子単体では発振せず、コンデンサを外付けする必要があります。
水晶発振子の電子回路記号は以下です。
なんとなく、水晶を電極で挟んだ感じが出ていますよね。発振させるには、コンデンサを以下のように接続します。
セラロック
クロック信号発生電子部品として「セラロック」というものもあります。
こちらも1個40円程度です。この部品は水晶の代わりにセラミックを使っています。圧電性セラミック、というものに電圧をかけると水晶と同様に振動するため、この性質を利用しています。
また水晶発振子と違って、セラロック内部にコンデンサを内蔵しているため、後からコンデンサを外付ける必要はありません。電子回路記号ですが、セラロック専用の回路記号はないようで、次のような書き方をよく見かけます。水晶発振子に外付けコンデンサをつけたものと同じで、それらを四角で囲ってあり、回路図に「セラロック」と書かれていることもあります。
クロックの信号の形
ところで、電子工作やコンピュータに興味がある方でしたら、もしかしたらクロック信号について書籍などで見かけたことがあるかもしれません。こんな感じの信号です。
このような形の信号を「矩形波」あるいは「方形波」と呼びます。しかし、先ほど説明した水晶発振子やセラロックが発生する信号はこのような形ではありません。実際には以下のような形です。
このような形の信号を「正弦波」あるいは「サイン波」と呼びます。外部からPICマイコンにクロック信号を水晶発振子やセラロックで供給する場合、このような正弦波を供給することになります。
PICマイコンが動作するには矩形波のクロック信号を必要となるため、PICマイコン内部でこの正弦波を矩形波に整形しています。
この整形する回路は、周波数によって最適な回路特性が異なります。
この回路特性が異なる、という点についても設定値の説明にちょっとだけ出てきますので、こちらも頭の片隅に置いておいてください。
外部クロック回路の接続ピン
次に外部でクロック信号を発生する場合に使用するPIC12F1822のピンを説明します。
クロックに関する機能は、2番ピンと3番ピンに割り当てられています。
当然ながら、内部クロックを選択した場合はこれらのピンにクロックを発生する部品を接続する必要はなく、入出力ピンなどに利用できます。
外部からクロックを供給する場合は、これらのピンに電子部品を接続することになります。
それぞれのピンでは、複数の機能名が割り当てられていますが、FOSCで設定を行うことにより、各ピンの役割が決まります。
それではこれから一通りの接続形態について説明します。(これらの接続形態はほとんどのPICマイコンに共通ですので、他のマイコンを使われる際にも参考にしてみてください)
最後のFOSCの設定値を説明するときに、接続形態の情報が必要になりますので、「接続形態1」などのように番号をつけておきます。
接続形態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までの場合にこの値を設定します。 |
基礎編と応用編では、内部クロックを使用しますので、FOSCの設定は次のようになります。
#pragma config FOSC = INTOSCIO
参考として、12MHzの水晶発振子をを使用して外部からクロックを供給する場合は、次のようになります。
#pragma config FOSC = HS
ところで、クロック発生の形態がいろいろと出てきました。どれを選択すればよいのか悩みますよね。
クロック信号はどれでも当てはまるベストなものはなく、一長一短ですので用途に合わせて選択することになります。
例えば時計を作る場合、クロック周波数がは正確である必要があります。このような時は、内部クロックやRC発振に比較して、精度が高くて温度に対して比較的安定している水晶発振子を使った外部クロックが適しています。
一方で、このシリーズで製作するタイマー回路では、何十時間も動かすことは想定していませんので、そこまでの精度は必要ありません。このようなケースで外部クロックを使用すると、コストもかかりますし、回路も必要になります。このようなときは内部クロックで十分かな、と思います。
補足ですが、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 | 誤記訂正 |
2025.4.7 | 説明内容整理 |
こんにちは。今現在、雪崩トランシーバーというものを作製しておりまして、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を作っていただき本当にありがとうございます。