PIC12F629でPWM制御をする方法

このQ&Aのポイント
  • PIC12F629を使用してPWM制御をする方法を教えてください
  • PWM制御の手順や設定について詳しく教えてください
  • PIC12F629におけるPWM制御の応用例や注意点について知りたいです
回答を見る
  • ベストアンサー

PIC12F629でPWM

PIC12F629でPWM制御をしたいのですができますか できるなら方法を教えてください。

noname#230358
noname#230358

質問者が選んだベストアンサー

  • ベストアンサー
noname#230359
noname#230359
回答No.1

PIC12F629にはPWMの出力機能はありません。(確か・・・?) もっと足の数が多いやつでないと無理です。 何に使うのかわかりませんが、もし擬似的にパルスを発生させて 一定間隔で出力すればそれもPWMと言えると思います。 また、出力を滑らかに変化させることが目的なら 例えば、下図(Web上で正しく表現できるかな:等幅ならOK)のように 1m秒のタイマを使ってポートから順次出力すれば 滑らかに出力が上がっていきます。(実用的にはもう一ひねり) 当然逆もできます。 例 OFF 1/5┌┐____┌┐____┌┐____┌┐____┌┐____ 2/5┌─┐___┌─┐___┌─┐___┌─┐___┌─┐___ 3/5┌┐__┌─┐__┌─┐__┌─┐__┌─┐__ 4/5┌┐_┌─┐_┌─┐_┌─┐_┌─┐_ on:┐ ...┝┥:1msec ...┝───┥:5msec ...┝─25msec─┥

noname#230358
質問者

お礼

なるほど 使用目的は、LEDランプの調光です。 すぐにやってみます。

関連するQ&A

  • PIC18でのPWM制御について

    PICで充放電の制御をしているのですが、PICのPWMモードで12V、1kHzの信号を出す必要が出てきました。 PWMモードは触ったことがなく、調べながら作る時間も余りないので、厚かましいとは思いますが、 どなたかアセンブラまたはc言語でのプログラムを教えていただけませんでしょうか。 使用チップはPIC18F2580です。 よろしくお願いします。

  • PICによるPWM出力の周期について

    PIC(16f873)を用いて、モータをPWM制御しようと思っています。 そこでいくつか質問なんですが、PWMの周期は下記の式で与えられるとありますが、 PWM周期 = (PR2の値+1)x4x発振器周期xタイマー2のプリスケーラ値 この周期は、自分で適当に決めていいのでしょうか?それともモータによって決まっているんでしょうか?  そもそもPWMは、デューティ比で出力が変わると思うんですが、周期が違うとどのような違いが出るのでしょうか?周波数が高くなると細かい制御が出来るって感じでしょうか? 初歩的な質問ですが、よろしくお願いします。m(_ _)m

  • PICの相補PWMについて

    PICの相補PWMについて タイトルのとおりPICの相補PWMというのがさっぱり分かりません。 PICのデータシートやプログラムの参考にと購入した本を読むと、相補PWMというのはPWMの1周期の中でペアになっているピンが、それぞれ逆位相の波形を出力する機能だと思うんですが合っているでしょうか? また合っている場合、PICのデータシートに乗っていた回路(添付画像)、多分これはモータ駆動の回路だと思うんですが、これだとモータはPWM1周期の間に正転と逆転を繰り返して動かないような気がするんですがどうなのでしょうか? どなたか教えていただけないでしょうか。 よろしくお願いします。

  • picのpwmの周期について

    pic16f690にccsのコンパイラでコードを書いています。 pwmで60Hzの周波数を作成したいのですが、可能なのでしょうか?(dutyは50%) また、可能なら、その時はどのようなコードで実現できますでしょうか? クロックは20MHzです。

  • PICのPWMについてのプログラム

    先程似たような質問してしまいましたが変更します。 PICを使い外部からのアナログ音声約0.5秒をPIC内臓のAD変換機能を使用してPIC内に格納します。 元々スイッチを2つ付けて1つを押したら上記のようになり、もう1つを押したら格納されているデジタルデータがPWM波となりポートBから出力される物を作りたいです。 出力された波形はローパスフィルターを通りDA変換されてアナログ音が外部に出る。 『0.5秒しか録音できないレコーダ』みたいなものをつくりたいというのが全体図です。 AD変換やDA変換はなんとか解るのですがPICからPWM波を出力する回路(プログラム)がよく解りません。 知っている方いましたら力を貸してもらえませんでしょうか?

  • PICのPWM出力の分解能の向上

    PICをもちいたPWM出力で10bit以上出したいのですが、どのような方法があるでしょうか? お願いします。

  • PIC16F84A PWM制御でトラブル。・゜・(ノД`)・゜・

    PIC16F84Aでサーボを動かすためにDelay関数を用いたPWMのプログラムを組んだのですが、picの電源を安定化電源にすると問題なく動作するのですが、乾電池(4本直列)につなぐと動作が不安定になってしまいます・・。 安定化電源、乾電池共に電圧は5.6V程度で、電流の問題かと思い、乾電池(4本直列パック)を並列に繋いで見たのですが改善されませんでした。 また、サーボ自体には問題はなく、picからのパルス出力そのものが不安定になっていることは確認出来ました。 リモコンカーに搭載するため、安定化電源ではなく、乾電池で動作させたいのですが、どうしたらいいのかお手上げ状態です・・ 今週末に動かしたいので、どなたかお助け願います。・゜・(ノД`)・゜・

  • PICのプログラミングについて

    現在、PICのプログラミングについてアセンブラがいいかC言語がいいか迷っています。 基本的にLEDを使った物をつくりたいと思っており PWM制御でのLEDの調光、LEDの点滅の周期の変化などをつけた 物を作ろうと考えております。 アセンブラとC言語のPICにおいての違いを教えてください。 加えて、上のPWM制御についてはどちらでもできるのでしょうか? 2つのプログラム言語についての良い点、悪い点など教えてください よろしくお願いいたします。

  • PICのPWMの正しい使い方について教えてください

    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); }

  • PICマイコンのLED制御

    PICマイコンのLED制御 pic12Fを使って、LEDのPWM制御を行おうと考えていますが、うまくいかないので知恵をおかしください。 それぞれの出力端子に3色のLEDをつけて、順にだんだん明るくなってから、だんだん消灯してゆくプログラムを考えましたが、 最初のLEDが消える前に、2番目のLEDをゆっくり点灯させたいと思っていますが、うまくいきません 少しだけ同時点灯するには、どのような考えをすればいいのでしょうか。だんだん消えていく中で、点灯を始める処理がわかりません。よろしくお願いします。