PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第110回]
●PICUSBIO−03(59)Timer2(8)シングルPWMモード(4)パルス出力プログラム(3)CCP1CON<5:4>
前々回、前回に続いて今回もシングルPWMモードのテストをします。
今回はパルス幅の式にあるCCP1CON<5:4>について確認をしてみます。
前回は式に与える値をいろいろ変えてテストを行いました。
今回はCCP1CON<5:4>について注目するため一旦式の値を最初の[第108回]に戻します。
[周期]
Period=4*Tosc*(PR2+1)*(TMR2 Prescale Value)
Tosc=1/48(μsec)
プリスケール 1:1
PR2+1=120
周期=4*120/48=10(μsec)
[パルス幅]
Pulse Width=4*Tosc*(CCPR1L<7:0>:CCP1CON<5:4>)*(TMR2 Prescale Value)
Tosc=1/48(μsec)
プリスケール 1:1
CCP1CON<5:4> 00
CCPR1L=$0C(10進数 12)
パルス幅=4*12/48=1(μsec)
上記のうちCCP1CON<5:4>の値のみを変えて波形を確認してみます。
こちらは[第108回]のプログラムです。
周期は10μsec、パルス幅は1μsecです。
上のプログラムの30行のみを変更します。
30行のCCP1CONの値を$0Dから$2Dにしました。
CCP1CONのbit5=1、bit4=0です。
Data SheetではCCP1CON<5:4>はCCPR1L(8bit)の下に連結される下位2bitと説明されています。
つまりCCPR1L+CCP1CON<5:4>で10bitのレジスタになるということのようです。
CCP1CONについては([第107回]を参照してください)。
しかしそういうことだとするとここで疑問が生じます。
前回までのテストではCCP1CON<5:4>=00にしてCCP1CONに値を設定しました。
上のプログラムではCCPR1L=$0Cです。
そのプログラムを実行した結果はCCPR1L=$0C(10進数では12)として計算した通りの結果になりました。
Data Sheetの通りならパルス幅の式に与えられる値は8bitの値の$0C(=12)ではなくてその下位に2bitを追加した10bitの値0000110000($30、=48)になるはずです。
ところが実際にプログラムを実行してみるとそのような結果にはならず8bitの値00001100(=12)として計算した結果になりました。
一体どういうことでしょう?
上のプログラムはそれを確かめるために「下位2bit」を10にしてみました。
比較ができるようにまずは[第108回]のプログラム(CCP1CON<5:4>=00)を実行しました。
水平時間軸は200nsec/divです。
パルス幅は1μsecちょうどです。
今回のプログラム(CCP1CON<5:4>=10)を実行しました。
違いがわかりますでしょうか。
1040nsecぐらいです
CCP1CON<5:4>=00のときよりも40nsecぐらいパルス幅が広いようです。
わずかな違いです。
この40nsecをパルス幅の式に当てはめてみました。
0.04=CCP1CON<5:4>/12
CCP1CON<5:4>=0.48
CCP1CON<5:4>の単位は何でしょう?
CCP1CON<5:4>はパルス幅を決める10ビットカウンタの下位2ビットです。
その値としてCCP1CON<5:4>=10にしました。
それは2進数ですからもしも10ビットのうちの下位2ビットならば10進数では2になります。
パルス幅は10進数の計算です。
0.48も10進数です。
CCP1CON<5:4>=10(2進数)が10進数の2ではなくて0.48ということは???
0.48≒0.5と考えてそれを2進数にすれば?
おお。
2−1=0.5です。
どうやらパルス幅の式のCCPR1L<7:0>:CCP1CON<5:4>は
CCPR1L<7:0>(8ビット) [ここに小数点] CCP1CON<5:4>(2ビット)
ということのようです。
そのように考えてパルス幅を計算してみました。
$0C+1/2(bit)=12.5
パルス幅=4*12.5/48=1.0417(μsec)
計算結果とオシロの波形が一致しました。
念のためにCCP1CON<5:4>=01にしてみました。
30行のCCP1CONの値を$1Dにしました。
CCP1CONのbit5=0、bit4=1です。
さきほどの考えでいくとそれは2進数の小数点以下第2位が1ということになります(小数点以下第1位は0)。
2−2=0.25です。
$0C+1/4(bit)=12.25
パルス幅=4*12.25/48=1.0208(μsec)
という計算家結果になります。
プログラムを実行しました。
うーん。
ちょっとよくわかりませんね。
さきほどの結果よりは少しパルス幅が狭いように見えますが…。
これはやや判別不能ということにしておきます。
今度はCCP1CON<5:4>=11にしてみました。
30行のCCP1CONの値を$3Dにしました。
CCP1CONのbit5=1、bit4=1です。
2進数の小数点以下第1位と第2位が1ということになります。
2−1+2−2=0.75です。
$0C+1/2(bit)+1/4(bit)=12.75
パルス幅=4*12.75/48=1.0625(μsec)
という計算家結果になります。
プログラムを実行しました。
1080nsecぐらいに見えます。
ほぼ計算通りの値になりました。
PIC−USBIO using BASIC[第110回]
2022.11.25upload
前へ
次へ
ホームページトップへ戻る