PIC12F1822用のPWMの基本動作テストプログラムを作りましたが、PWM出力が意図どおりに得られません。
(XC8のテストプログラムを下に添付。テストパターン1/2の切り替えはコメントアウトをお願いします。
アナライザの出力を画像で添付しました。)
テスト目的: タイマー0の周期割り込みに合わせて、PWMのデューティー比(または周期)を変更するプログラム
テストパターン 1 : パルスのデューティー比を変えるテスト
質問1: パルスのデューティー比を変えるテストは、PWM設定の一回おきにCCPからのPWMの出力が出ません
テストパターン 2 : パルスの周波数を変えるテスト
質問2: 周波数を変えるテストはOKに見えるものの、1回目のPWMがHighとなるのと、割り込みの11回目、13回目あたりでPWM出力が欠落する
【回答のお願い】
どうも、PWMのレジスタ設定に手順、またはタイミングがあるのではないかと思いますが、原因がわからず困っております。
PICに詳しい方からのご指導をよろしくお願いいたします。
K.A.
------------------------------------------------------
/*
* File: PIC12F1822 PWC
* Author: K.A.
*
* Created on 2014/07/20
*
* タイマー0の周期割り込みに合わせて、PWMのデューティー比(または周期)を変更するプログラム
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=ON, BOREN=ON, MCLRE=OFF
#define _XTAL_FREQ 8000000 // クロック8MHz
/*
*
*/
// タイマー割込みの処理
int TMR0_Count = 0; // タイマーの割込み発生回数をカウントする変数
void interrupt Timer0(void) {
// タイマー0の割込み発生か? Timer0 は 8bitの オーバーフロー・カウンタ
if (TMR0IF == 1) {
TMR0_Count++;
if (TMR0_Count > 5) {
TMR0_Count = 0;
if (RA5 == 0) RA5 = 1; else RA5 = 0; // RA5は、動作表示用LED
}
TMR0IF = 0; // タイマー0割込フラグをリセット
}
}
int main(int argc, char** argv) {
unsigned int pulse_width = 5;
OSCCON = 0b01110010; // 内部クロックは8MHz
ANSELA = 0b00000000; // すべてをデジタルI/Oに割当
TRISA = 0b00001000; // すべてのピンは出力に割当てる(RA3は入力専用)
PORTA = 0b00000000; // 出力ピンの初期化(全て'0'にする)
RA5 = 0; // 動作確認用LED
// Timer0 Timer0 は 8bitの オーバーフロー・カウンタ
OPTION_REG = 0b00000001; // 内部クロックでTIMER0を使用、プリスケーラカウント値 1:2
// bit5:0=Fosc/4, bit3:0=PreScaler_ON, bit2-0:PreScaler
TMR0 = 0; // タイマー0の初期化 (+2cycle)
TMR0IF = 0; // タイマー0割込フラグを0にする
TMR0_Count = 0; // 割込み発生の回数カウンターを0にする
TMR0IE = 1; // タイマー0割込みを許可する
GIE = 1; // 1: 全割込み処理を許可する
/* PWM */
TRISA2 = 1; // RA2 出力をサスペンド
TMR2IF = 0; // TMR2 フラグをクリア
CCP1SEL = 0b0; // CCP1/P1Aの機能をRA2に割り当てる
CCP1CON = 0x0C; // PWM モード
// Period を 設定する xx ms=((PR2)+1)*4*125ns(8MHz)* PreScaler(x1-x64)
PR2 = 127; // 4.096ms (プリスケーラが x64 の場合)
T2CKPS0 = 0b1; // プリスケーラ 00:x1, 01:x4, 10:x16, 11:x64
T2CKPS1 = 0b1; //
CCPR1L = pulse_width >> 2; // パルス幅上位8bit
CCP1CON = ((pulse_width & 0x0003) << 4) | 0x0C; // パルは幅下位2bit
TMR2ON = 1; // TMR2 カウント開始
while (TMR2IF == 0) { /** / do nothing /**/ }
TRISA2 = 0; // RA2に出力を接続
while (1) {
if (TMR0_Count == 0) {
/**** テストパターン 1 : パルスのデューティー比を変えるテスト ****/
// パルスのデューティー比を変えるテストは、PWM設定の一回おきにCCPがPWMの出力が出ません。 なぜ?
pulse_width = pulse_width + 10;
if (pulse_width > 500) pulse_width = 5;
/**/
/**** テストパターン 2 : パルスの周波数を変えるテスト **** /
// 周波数を変えるテストはOKに見えるが、
// 1回目のPWMがHighとなるのと、割り込みの11回目、13回目あたりでPWM出力が欠落する
PR2 = PR2 - 8 ;
if (PR2 < 8) PR2 = 127;
pulse_width = PR2 ; // Duty 25% に相当
/**/
CCPR1L = pulse_width >> 2;
CCP1CON = ((pulse_width & 0x0003) << 4) | 0x0C;
TMR0_Count++; // 続けて PWMの設定変更をしないためのフラグ代わり
}
}
return (EXIT_SUCCESS);
}
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
質問2だけ。
PICのPWM機能は、デューティー比と違い、周波数をいつでも変えられるようには出来ていません。
タイミングによってはタイマーが1周するまで次の変化が起こりません。
この仕様を理解していないため問題が起こっているのではないかと思います。
ところで、もう1つの質問と内容がかぶっているようですので、示しておいた方がよいかと思います。
http://oshiete.goo.ne.jp/qa/8685497.html
回答ありがとうございます。
アセンブラでなくC言語で書いていますので、書き換えのタイミングはお任せになってしまいます。
これは、もっとスピードの速いCPUを使うしかなさそうですね。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
つい集めてしまうものはなんですか?
人間誰もは1つ「やたらこればかり集めてしまう」というものがあるもの。 あなたにとって、つい集めてしまうものはなんですか?
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
PICのPWMの使い方を教えてください
その他(コンピューター・テクノロジー)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スーパーのレジで並んでいたら...
-
スーパーのレジ待ち
-
定周期での割り込み
-
CPU負荷率の安全な上限と計...
-
USJでの割り込み
-
Macターミナルで実行中のプログ...
-
家電製品の電力周波数を変える機械
-
アセンブラ言語の数字を数値に...
-
緯度、経度の 10進法と 60進法...
-
Mac 乗数の入力方法
-
バックグラウンドのプロセスの...
-
怪しいプロセス教えてください。
-
C言語で、メモリを解放しないで...
-
VBSからbat実行(WMI)して戻り値...
-
VBAを使って二進法計算
-
Trend Micro Anti-Malware Solu...
-
フレームワーク「4.8.1」で、[S...
-
pthread_attr_tへの値の代入に...
-
組み込みマイコンでのソフトウ...
-
C/C++→JAVAに変換するツール
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
電車で待機列の割り込みについ...
-
スーパーのレジで並んでいたら...
-
このレジの並び方は間違ってま...
-
【組込み】割り込み中のstatic...
-
USJでの割り込み
-
VB6でSendKeyを利用したTab移動...
-
CPU負荷率の安全な上限と計...
-
CPUの処理量を減らすコーデ...
-
pic 複数の割り込み関数 切り分...
-
Excelでタイマーの一時停止する...
-
VB.NET スレッドからのイベント...
-
H8SX/1655のタイマー割り込みに...
-
マイコン C言語 割り込み処理...
-
H8マイコンでの割り込み(シリ...
-
割り込みのカウントの仕方
-
一定時間操作がなかったら、と...
-
PICマイコンでエンコーダパルス...
-
STATUSのZフラグについて
-
Z80の割り込みについて
-
(H8マイコン)タイマ割込で変更...
おすすめ情報