PIC12F1822のPWMのテストをしていますが、正しい設定方法が判らず、以下の現象が出ています。
プログラム全体と、MPLIB のシミュレータによるLogic Analyzerの画像を添付しましたので、PICにお詳しい方のアドバイスをよろしくお願いいたします。
◆ テスト内容: 周波数一定でデューティー比を変化させていく
今回の設定は、PR2=127 なので、パルス幅を0 ~ 最大パルス幅の 511 ((PR2+1)*4)で変化させる
●問題点1: デューティー比100%近く(508/512)でPWM出力が突然 50%に変わる。
●問題点2: デューティー比100%以上(512/512以上)を設定するとPWMは100%('H'のまま)となる。
その後デューティ比を下げてもPWMの出力は'H'のままで、PWMの出力が出ない。
● 問題点3: パルス幅の設定で、CCP1CON<5:4>に'00'以外をセットすると、PWMの動作がおかしくなる(出力が'H'のまま) ・・・ これはシミュレータのバグでしょうか?
プログラム全体は、一番下にありますが、メインロジックは以下のように簡単なものです。
while (1) {
for (i = 500; i <= 512; i = i + 1) {
pulse_width = i ;
CCPR1L = pulse_width >> 2; // パルス幅上位8bit
CCP1CON = ((pulse_width & 0x0003) << 4) | 0x0C; // パルス幅下位2bit
// ここで、CCP1CON<5:4>に'00'以外をセットすると、PWMの動作がおかしくなる
__delay_ms(1);
}
}
どうぞよろしくお願いいたします。
K.A.
---------------------------------------------
/*
* File: 周波数一定、ディューティー比連続変化
* Author: K.A.
*
* Created on 2014/07/20
*
*/
#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
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
int main(int argc, char** argv) {
OSCCON = 0b01110010; // 内部クロックは8MHz
ANSELA = 0b00000000; // すべてをデジタルI/Oに割当
TRISA = 0b00001000; // すべてのピンは出力に割当てる(RA3は入力専用)
PORTA = 0b00000000; // 出力ピンの初期化(全て'0'にする)
RA5 = 0; // 動作確認用LED
/* 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; // 0.064ms (プリスケーラが x1 の場合)
T2CKPS0 = 0b0; // プリスケーラ 00:x1, 01:x4, 10:x16, 11:x64
T2CKPS1 = 0b0; //
CCPR1L = 0; // パルス幅上位8bit
CCP1CON = ((0 & 0x0003) << 4) | 0x0C; // パルス幅下位2bit
TMR2ON = 1; // TMR2 カウント開始
while (TMR2IF == 0) { /** / do nothing /**/ }
TRISA2 = 0; // RA2に出力を接続
unsigned int pulse_width;
int i;
while (1) {
// パターン1 : デューティー比を変化させていく
// 今回の設定は、PR2=127 なので、最大パルス幅は 511 ((PR2+1)*4)
// 問題点1: デューティー比100%近く(508/512)でPWM出力が突然 50%に変わる。
// 問題点2: デューティー比100%以上(512/512以上)を設定するとPWMは100%('H'のまま)となる。
// その後デューティ比を下げてもPWMの出力は'H'のままで、PWMの出力が出ない。
// 問題点3: パルス幅の設定で、CCP1CON<5:4>に'00'以外をセットすると、PWMの動作がおかしくなる(出力が'H'のまま)
for (i = 500; i <= 512; i = i + 1) {
pulse_width = i ;
// Pulse width を 設定する PW=(CCPR1L:CCP1CON<5:4>)*125ns(8MHz)*PreScaler(x1-x64)
CCPR1L = pulse_width >> 2;
CCP1CON = ((pulse_width & 0x0003) << 4) | 0x0C;
// CCP1CON<5:4>に'00'以外をセットすると、PWMの動作がおかしくなる
// printf("PR2= %d, PW= %d, CCPR1L= %x, DCIB= %x \n", PR2, pulse_width, CCPR1L, temp2) ;
__delay_ms(1);
if (RA5==1) RA5=0; else RA5=1 ;
}
}
return (EXIT_SUCCESS);
}
----------------------------------------
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
問題点3についてだけ。
私の環境でも同様の現象が起こりましたので、シミュレータのバグだと思います。
(数か月前、MPLAB8,Xのそれぞれ最新バージョンで)
また、PWM出力「P1B」のピン変更も効きませんでした(P1Aは効く。MPLAB8で)。
ところで、もう1つの質問と内容がかぶっているようですので、示しておいた方がよいかと思います。
http://oshiete.goo.ne.jp/qa/8685287.html
回答ありがとうございました。
シミュレータのバグであれば仕方がありませんね。(ロジアナを持っていないので確認できませんが。。。)
大変ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スーパーラジオのIFT調整について
-
タイマ
-
周波数433MHzについて
-
アマチュア無線機の購入について
-
PICマイコンができること
-
エレキギターピックアップ配線
-
アマチュア無線のブースターに...
-
タイミングチャートについてま...
-
反転増幅回路において、周波数...
-
オペアンプの位相差についてで...
-
(*`・ω・)ゞの意味教えてください
-
単振動
-
皆さんおはようございます、み...
-
音声ラインの600Ωは何故60...
-
なぜ20log10(1020)が60になるの...
-
大丈夫?って聞かれて大丈夫じ...
-
発振回路の『正弦波』出力について
-
「明けましておめでとうござい...
-
オペアンプのボルテージフォロ...
-
電子回路 演算増幅器 オペア...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファ・ドライバ・トランシ...
-
周波数433MHzについて
-
スーパーラジオのIFT調整について
-
モーターの定格出力と最大出力...
-
量子コンピュータの動作原理が...
-
74HC00について
-
PIC出力Hi←→Low時、5V←→0Vにな...
-
遅延によるグリッチのずれにつ...
-
PICのPWMの使い方を教えてください
-
純正オーディオの出力端子について
-
カロッツェリア DEH-P700について
-
局発から出力された周波数を455...
-
タイマーIC555を使ってパルス信...
-
7セグメントのディスプレイの...
-
ハイエースディーゼルは出荷停...
-
アマチュア無線機の購入について
-
74HC123で。。。
-
ラジオドラマ、朗読の番組を教...
-
PSPゲームの動画撮影について
-
任天堂スイッチでゲームキャプ...
おすすめ情報