[戻る]
過去ログ [ 0001 ]
過去ログ:     ワード検索: 条件: 表示:

タイトル
記事No
投稿日
投稿者
参照先
96MHz PLLブロックの動作
93
: 15/01/21-20:17
matsuhandy <srprc100@yahoo.co.jp>

PIC24Fのプログラミングをしていますが,どうしても96MHz PLLブロックの動作が
思い通りになってくれません。アドバイスいただけないでしょうか。

Configurationで,
#pragma config FNOSC = FRCPLL
// Initial Oscillator Select (Fast RC Oscillator with Postscaler and PLL module (FRCPLL))
として,ポストスケーラ付のFRCとPLLを使って,システムクロックを作っています。

「PIC24F ファミリ リファレンス マニュアル、セクション 06. オシレータ」
http://ww1.microchip.com/downloads/jp/DeviceDoc/39700C_JP.pdf
のマニュアルの2,19ページに

「図 6-1: PIC24F 全般のシステム クロック回路図」
「図 6-8: 96 MHz PLL ブロック」

があります。

<図 6-1>について
ポストスケーラを1分周としました。PLL Blockに8MHzが入力するはず。


<図 6-8>について
PLLブロックで,PLL Prescalerで1/2にして4MHz Branchを作り,96MHzPLLの出力,
96MHz BranchをUSB Clockで1/2されることで,48MHzを作っています。
これで,USBの通信はできていますので,48MHzで間違いないと思います。

System Clockでは,CPDIVレジスタの設定で,1/1分周とし,その後1/3されて,
PLL Output for System Clockとしています。
つまり,システムクロックは,32MHzとなることを期待しています。
しかし,実際にタイマーでキャプチャしてみると,16MHzとなっています。
割込み無しで,__delay_ms(xxx);の動作を試すと,やはり16MHzで動作して
いるようです。

PLL Prescalerを1/1分周とすると,タイマーキャプチャも__delay_msも32MHzで
動作していることが確認できました。しかしこの場合はUSB通信ができなく
なるばかりでなく,キャプチャの値が5%少なくなります。
(16MHzの時は,キャプチャの値の誤差はほとんどありません)

おそらく,96MHz Branchが2倍の192MHzになって,タイマが間に合わなく
なったのではないかと推測しています。(ありえるのかわかりませんが)

__delay_ms(xxx);の動作,USBの動作,タイマーキャプチャの動作をすべて
説明をつけるためには,System Clockの1/3固定分周が
1/6でないと説明がつきません。

いくら何でも,図 6-8が間違っているとは思えないのですが,どうしても
1/6としないとつじつまが合わない状況です。

USBも動作させた上で,マイコンを32MHz駆動したいのですが,
アドバイスいただけませんでしょうか?
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: 96MHz PLLブロックの動作
96
: 15/01/22-13:41
Gokan <gokan@picfun.com>

PIC24Fの場合2クロックで1命令サイクルですから16MIPSになります。
タイマの入力も命令サイクルなのでクロックの1/2になります。


> PIC24Fのプログラミングをしていますが,どうしても96MHz PLLブロックの動作が
> 思い通りになってくれません。アドバイスいただけないでしょうか。
>
> Configurationで,
> #pragma config FNOSC = FRCPLL
> // Initial Oscillator Select (Fast RC Oscillator with Postscaler and PLL module (FRCPLL))
> として,ポストスケーラ付のFRCとPLLを使って,システムクロックを作っています。
>
> 「PIC24F ファミリ リファレンス マニュアル、セクション 06. オシレータ」
> http://ww1.microchip.com/downloads/jp/DeviceDoc/39700C_JP.pdf
> のマニュアルの2,19ページに
>
> 「図 6-1: PIC24F 全般のシステム クロック回路図」
> 「図 6-8: 96 MHz PLL ブロック」
>
> があります。
>
> <図 6-1>について
> ポストスケーラを1分周としました。PLL Blockに8MHzが入力するはず。
>
>
> <図 6-8>について
> PLLブロックで,PLL Prescalerで1/2にして4MHz Branchを作り,96MHzPLLの出力,
> 96MHz BranchをUSB Clockで1/2されることで,48MHzを作っています。
> これで,USBの通信はできていますので,48MHzで間違いないと思います。
>
> System Clockでは,CPDIVレジスタの設定で,1/1分周とし,その後1/3されて,
> PLL Output for System Clockとしています。
> つまり,システムクロックは,32MHzとなることを期待しています。
> しかし,実際にタイマーでキャプチャしてみると,16MHzとなっています。
> 割込み無しで,__delay_ms(xxx);の動作を試すと,やはり16MHzで動作して
> いるようです。
>
> PLL Prescalerを1/1分周とすると,タイマーキャプチャも__delay_msも32MHzで
> 動作していることが確認できました。しかしこの場合はUSB通信ができなく
> なるばかりでなく,キャプチャの値が5%少なくなります。
> (16MHzの時は,キャプチャの値の誤差はほとんどありません)
>
> おそらく,96MHz Branchが2倍の192MHzになって,タイマが間に合わなく
> なったのではないかと推測しています。(ありえるのかわかりませんが)
>
> __delay_ms(xxx);の動作,USBの動作,タイマーキャプチャの動作をすべて
> 説明をつけるためには,System Clockの1/3固定分周が
> 1/6でないと説明がつきません。
>
> いくら何でも,図 6-8が間違っているとは思えないのですが,どうしても
> 1/6としないとつじつまが合わない状況です。
>
> USBも動作させた上で,マイコンを32MHz駆動したいのですが,
> アドバイスいただけませんでしょうか?
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: 96MHz PLLブロックの動作
97
: 15/01/22-14:13
matsuhandy <srprc100@yahoo.co.jp>

> PIC24Fの場合2クロックで1命令サイクルですから16MIPSになります。
> タイマの入力も命令サイクルなのでクロックの1/2になります。

Gokanさん,
ありがとうございます。こういう情報,初心者にはとても助かります。

まさにその通りで,
リファレンスマニュアルに次のように書かれていました。

The processor clock
source is divided by two to produce the internal instruction
cycle clock, FCY.

そこで,

#ifndef FOSC
#define FOSC 32000000L
#endif
#ifndef FCY
#define FCY FOSC/2
#endif

としました。また,
リファレンスマニュアル 専用タイマ付き入力キャプチャ
に,

タイマのクロック源の選択は,ICTSEL制御ビット(ICxCON<12:10>)を介して行います。
タイマは内部クロック源(FOSC/2)も使用できますし,TxCKピンに入力される
外部クロック源をタイマ内で同期モードを有効にしても使用できます。

とかかれていたので,すべて整合性がとれました!
おかげさまで,すっきりしました。

ありがとうございました!!

いろいろ勉強になります。実行できる命令の個数で速度を表すと,
32MHzでCPUを駆動しても,16MIPSということですね。

作成しているプログラムの動作がすべてすっきりさせることができました!
▲pagetop

- WebForum -