RoboCup Junior Japan Rescue Kanto OB
2005~2013
2005~2013
という訳で、全く脈略もないままに16F19XX、HITECコンパイラでのPWMの作動方法について書くことになりました。
PWMについての説明やらなんやらはもう以前の記事で再々やっているような気がいたしますので、
ここでは省略させて頂きます。
という訳で今回はプログラムのお話を。
因みに今回の記事はデータシートが手元にあることを前提としていますので、レジスタの中の詳しい紹介等は行いません。
まず、PWMを行なうにはタイマーの設定が必要です。
これは要するに波の周期を決定するために使われるもので、一般には慣例としてタイマー2が使われるようですね。
別に1でなければどのタイマーでも大丈夫なはずです。
タイマーの設定をするレジスタはT2CONレジスタ。
今回は特に何か指定することもなかったのでEnable、つまりタイマーを有効にする設定のみを行なっています。
あと重要なのが、PR2レジスタで、この値でPWMの周期を決めます。
この値はある計算値を基にして求められるのですが、わざわざ求めなくても、
データシートにPRレジスタの値と主なPWM周期の表が載っていたりします。
ということで今回はこの表に基づいて0xFFとしました。これだと周波数は31.25kHzになりますね。
因みに計算式もその表の付近に載っています。
こんな感じであっけなくタイマーの設定は終了。タイマーのレジスタについてはまた別途の記事で詳しく説明します。
そして今度はPWMの設定。PICではPWMはCCPとかECCPというモジュール内に含まれている機能ですので、
このCCPのレジスタを利用してPWMの設定を行います。
まずは、CCP2CON、今回はCCP2を使うのでこのレジスタを使います。
このレジスタは
ビット7-6:拡張PWMの設定
ビット5-4:デューティ比の最下位2ビット
ビット3-0:モードの選択
となっています。
今回は拡張に興味が無いので7-6は00、
デューティ比はこのPICの場合、最高10ビットで設定出来るようなので、下位ビット分がこんなところで設定できます。
でも、下位ビットっていうと1か2の違いですから、正直どうでもいい。どっちも00でいいでしょう。
3-0は当然PWMの設定になりますね。ECCPの場合はアクティブハイがどうたらと書いてありますが、
どちらもアクティブハイでないと後々面倒なので全部アクティブハイになる1100でいいでしょう。
こんな感じでPWMの初期設定は終了です。
あとはCCPR2Lレジスタで上位8ビット分のデューティ比をプログラム内で設定してやれば
後は勝手にモジュールの方が波形を出力してくれます。
因みにデューティ比は実際には、 設定した値/4(PR+1) になります。
なのでそのあたりはちょっと注意が必要です。
でもこの値ってよく考えるとPRがFFだと分母は10進数で1024になりますよね。
だから単純に1024段階と思って頂ければ何も考えることは無いかと思います。
とまぁPWMのプログラムはこんな感じ。
細かいレジスタ等の紹介はまた別途で行いたいと思います。
という訳で今日は最後に適当なプログラムを乗っけて終了です。このプログラム動いたっけかなぁ・・・?
もしかしたらPICのヘッダをhtcかそこら辺にしないと動かないかもしれません。
PWMについての説明やらなんやらはもう以前の記事で再々やっているような気がいたしますので、
ここでは省略させて頂きます。
という訳で今回はプログラムのお話を。
因みに今回の記事はデータシートが手元にあることを前提としていますので、レジスタの中の詳しい紹介等は行いません。
まず、PWMを行なうにはタイマーの設定が必要です。
これは要するに波の周期を決定するために使われるもので、一般には慣例としてタイマー2が使われるようですね。
別に1でなければどのタイマーでも大丈夫なはずです。
タイマーの設定をするレジスタはT2CONレジスタ。
今回は特に何か指定することもなかったのでEnable、つまりタイマーを有効にする設定のみを行なっています。
あと重要なのが、PR2レジスタで、この値でPWMの周期を決めます。
この値はある計算値を基にして求められるのですが、わざわざ求めなくても、
データシートにPRレジスタの値と主なPWM周期の表が載っていたりします。
ということで今回はこの表に基づいて0xFFとしました。これだと周波数は31.25kHzになりますね。
因みに計算式もその表の付近に載っています。
こんな感じであっけなくタイマーの設定は終了。タイマーのレジスタについてはまた別途の記事で詳しく説明します。
そして今度はPWMの設定。PICではPWMはCCPとかECCPというモジュール内に含まれている機能ですので、
このCCPのレジスタを利用してPWMの設定を行います。
まずは、CCP2CON、今回はCCP2を使うのでこのレジスタを使います。
このレジスタは
ビット7-6:拡張PWMの設定
ビット5-4:デューティ比の最下位2ビット
ビット3-0:モードの選択
となっています。
今回は拡張に興味が無いので7-6は00、
デューティ比はこのPICの場合、最高10ビットで設定出来るようなので、下位ビット分がこんなところで設定できます。
でも、下位ビットっていうと1か2の違いですから、正直どうでもいい。どっちも00でいいでしょう。
3-0は当然PWMの設定になりますね。ECCPの場合はアクティブハイがどうたらと書いてありますが、
どちらもアクティブハイでないと後々面倒なので全部アクティブハイになる1100でいいでしょう。
こんな感じでPWMの初期設定は終了です。
あとはCCPR2Lレジスタで上位8ビット分のデューティ比をプログラム内で設定してやれば
後は勝手にモジュールの方が波形を出力してくれます。
因みにデューティ比は実際には、 設定した値/4(PR+1) になります。
なのでそのあたりはちょっと注意が必要です。
でもこの値ってよく考えるとPRがFFだと分母は10進数で1024になりますよね。
だから単純に1024段階と思って頂ければ何も考えることは無いかと思います。
とまぁPWMのプログラムはこんな感じ。
細かいレジスタ等の紹介はまた別途で行いたいと思います。
という訳で今日は最後に適当なプログラムを乗っけて終了です。このプログラム動いたっけかなぁ・・・?
もしかしたらPICのヘッダをhtcかそこら辺にしないと動かないかもしれません。
#include "pic16f1939.h"
#define _XTAL_FREQ 32000000
__CONFIG(
FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF
& CPD_OFF & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF
);
__CONFIG(
WRT_OFF & PLLEN_ON & STVREN_ON & LVP_OFF
);
int main(void)
{
PORTA = 0b00000000;
PORTB = 0b00000000;
PORTC = 0b00000000;
PORTD = 0b00000000;
ANSELA=0;
ANSELB=0;
ANSELD=0;
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b00011000;
TRISD = 0b00000000;
OSCCON=0b01110000;
CCP2CON = 0b00001100; //PWMモードにする
PR2 = 0xFF;
T2CON = 0b00000100; //Timer2 Enable
while(1)
{
CCPR2L = 0x80;
}
}
(^・ω・)ノ RadiumProduction in RoboCup Junior
(^・ω・)ノ RadiumProduction in RoboCup Junior
カレンダー
最新CM
カテゴリー
らじぷろ目次
らじぷろ検索機
最新記事
(01/01)
(01/03)
(08/27)
(04/29)
(01/01)
(11/20)
(09/06)
(09/04)
(08/09)
(08/06)
(07/27)
(05/29)
(03/15)
(01/01)
(05/07)
プロフィール
HN:
Luz
性別:
男性
アーカイブ