==PWMモード==
理屈の理解がいまいちでしたが、サンプルプログラムの変数
を変えて、PWMモードで、パルスを発生させてみました。
/*****************************
STEP20_PWMMode.c
*****************************/
#define _LEGACY_HEADERS//以前のヘッダーファイルにするための宣言これがないと古いのではエラーに
// インクルードファイルの読み込み
#include
__CONFIG(UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);
//#pragma config CPD=OFF , LVP=OFF , BOREN=ON , MCLRE=ON , PWRTE=ON , WDTE=OFF , FOSC=INTOSCIO
(この宣言は、新しいコンパイラ用。古いのでは、エラーになるので、コメントアウト)
// プロトタイプ宣言
void InitPWM (void);
void InitTimer2 (void);
// メイン関数
void main (void)
{
// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;
// 電圧レベルの初期設定
PORTA = 0xFF;
PORTB = 0xFF;
// 入出力設定
TRISA = 0x20;
TRISB = 0x00;
// PWMモード設定関数の呼び出し
InitPWM();
// タイマ2設定関数の呼び出し
InitTimer2();
// 永久ループ(これがないとプログラムが終わって
パルスが持続しない。)
while(1)
{
}
}
// PWMモード設定関数
void InitPWM (void)
{
// RB3端子を出力端子に設定
TRISB3 = 0;
// CCPのモードをPWMモードに設定
CCP1M3 = 1;
CCP1M2 = 1;
CCP1M1 = 0;
CCP1M0 = 0;
// 周期を100μ秒に設定(99 + 1μ秒)
//PR2 = 0b01100011;//99μ+ 1μ秒(10khz)
//PR2 = 0b11000111;//199μ+ 1μ秒(5khz)
PR2 = 0b11111110;//254μ+ 1μ秒(985hz プリスケラー4)
// Hの時間を99μ秒に設定(396 × 0.25μ秒)
//CCPR1L = 0b01100011;99μ
//CCPR1L = 0b00110010;//50μ
//CCPR1L = 0b000011001;//25μ
//CCPR1L = 0b000000101;//10μ
CCPR1L = 0b00000101;//5μ
CCP1X = 0;
CCP1Y = 0;
}
// タイマ2設定関数
void InitTimer2 (void)
{
// プリスケーラ値を1に設定
//T2CKPS1 = 0;
//T2CKPS0 = 0;
// プリスケーラ値を4に設定
T2CKPS1 = 0;
T2CKPS0 = 1;
// TMR2レジスタをクリア
TMR2 = 0;
// タイマ2起動
TMR2ON = 1;
}
パルス幅5μsにして、周期を変えてみました。
PR2レジスタ・・・・・・・周期(周波数)の設定
CCPR1Lレジスタ・・・・・・・・パルスの時間を設定
目的の周波数にするのに、段階的にPR2レジスタの数値
を大きくしていきましたが、すんなりと周波数を大きくは
できませんでした。「255」の壁がありました。256にする
とこのまでは不具合が起きます。このままでは分からない
のですが、2進数にすると一目瞭然です。
255・・・・・ 11111111
256・・・・・ 100000000
10進数で、9から10に変わるのとおなじように、桁数が
ふえてしまうのです。PR2レジスタは、8桁の2進数しか
収納できないので、これだけでは、256以上の数値は、
収納できません。しかし、便利な機能があって、プリスケラ-
という数え方を何分の一かにする機能があります。
これと組み合わせると、周期(周波数)をさらに何分の一
かにできます。
PR2に254(実際は+1されるので、255を格納)
CCPR1Lで5μs幅のパルスに設定
T2CKPS1 = 0;T2CKPS0 = 1;でプリスケラ-を4に設定
プリスケラ-は1,4,16の設定しかないようですので、4
に設定して、数え方を1/4にして、
やっと目的が果たせます。