FC2カウンター

現在の訪問者数

現在の閲覧者数:

カレンダー

07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

プロフィール

剣菱P

Author:剣菱P
剣菱Pと申します。
性別:男
年齢:27
二兎を追って一兎も得られないタイプ

マイコンやプログラミング、ニコニコ動画、雑記等
方向性は見えずとも、ちょっとずつ更新していく予定です!

リンクフリーです。
こんなブログでよかったらよろしくお願いしま~す。

公開メール kenbishiP@gmail.com

検索フォーム

最新記事

最新コメント

カテゴリ

メールフォーム

名前:
メール:
件名:
本文:

月別アーカイブ

最新トラックバック

リンク

ブロとも一覧

ブロとも申請フォーム

ランキング

ランキング参加中です。気が向いたらクリックしてあげてください。


にほんブログ村 その他趣味ブログへ
にほんブログ村 その他趣味ブログ 趣味の工作へ

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

もうすぐ今年も終わりかぁ・・・ PIC 新お勉強 その10(A/D変換)»

コメント

コメントの投稿













管理者にだけ表示を許可する

PIC 新お勉強 その11(CCP_PWM)


前回はA/Dコンバータを使ってアナログをデジタルにする方法を勉強したわけですが

逆にPICからアナログの出力を出すには D/Aコンバータを使えばいいわけなんですが

そんなものは12F683には搭載されていません!
じゃあ出来ないのかというと、そういうわけでもないみたいです

けっこう限られた範囲での話ですが、擬似的にアナログ出力のように見せかけることが出来るみたいですね。

たとえばLED!
今まではPICでLEDを点灯させるか消灯させるかの2パターンをやりました。デジタルなので当然ですね。
ではアナログのように ちょっと明るくといった中間値でつけさせるにはどうすればいいか

それには人間にわからないようなスピードでLEDをつけたり消したりピカピカさせてやればいいのです。高速でON・OFFを繰り返せば半分くらいの明るさに見えるみたいです

ccp_5.jpg
ON+OFFの時間に対するONのみの時間の割合のことをデューティ比というようです。
ONの時間が1サイクルのちょうど半分ならデューティ比50%ですね

で、これをプログラムでやるためには
output_high(PIN_A0);
delay_us(50);
output_low(PIN_A0);
delay_us(50);
見たいな感じで点滅させればいいわけですが、当然その作業中は他の作業は出来ませんし、
途中で他の作業をさせてしまったら、ONかOFFの時間が狂ってしまって狙ったデューティ比が
出せなくなります。
それはまったく持って実用的ではありません!

そこで活躍するのがCCPというモジュールらしいです!
CCPモジュールは当然CPUから独立しているのでCPUの作業とは別のラインで仕事が出来ます。
そして、CCPモジュールで上記のようにON OFFを繰り返す機能をもつのが
PWMモードというモードです。

デューティ比を操作して擬似的にアナログ出力をするような方法をPWMというみたいです。

CCPモジュールに
・波形の1サイクルの時間
・デューティー比
の情報を渡すだけで、あとは勝手にCCPモジュールがPWM波形を出力してくれます。

今回の実験ではボリュームの値をA/Dコンバータで読み込んで、それに見合った明るさでLEDをつけることにします。

プログラムは



#include <12f683.h>
#fuses INTRC_IO,NOWDT,NOPROTECT,NOMCLR,BROWNOUT
#use delay(clock = 4000000)

main()
{
    unsigned int data;
    setup_adc_ports(AN0_ANALOG);
    setup_adc(ADC_CLOCK_DIV_32);
    setup_ccp1(CCP_PWM);
    setup_timer_2(T2_DIV_BY_1,0xff,1);
    set_tris_a(0x01);
    set_pwm1_duty(0xff);
    while(1){
        set_adc_channel(0);
        delay_us(50);
        data = read_adc();

        set_pwm1_duty(data);
    }
}



・setup_ccp1(CCP_PWM)
CCPモジュールをPWMモードにセットします。
他にキャプチャーモードとコンペアモードがあるらしいですが、今回はPWMで

・setup_timer_2(T2_DIV_BY_1,0xff,1)
CCPモジュールのPWMモードはタイマー2というタイマーと連動しています。
このタイマーが0の時に、PWMの端子が5vになり、タイマーがある値になったときに0vになる
といった感じでPWMモードは動作しているのでタイマー2のセットアップをします

setup_timer_2(mode, period, postscale)
modeはプリスケール値の設定
periodは1サイクルの長さを決める値で、8ビットです。最後まで数えるなら0xff
postscaleは何回タイマーがリセットされたら割り込みを発生させるかの値。使わないときは1としておく

・set_pwm1_duty(0xff);
デューティ比を決めるための関数。
PWMモードにも8bitと10bitのモードがあり、この関数にint で値を渡すかlongで渡すかで自動切換えが行われるようです

12f683_2.jpg

5番ピンに書いてあるCCP1というのが、CCPモジュールを使用した時に出力に割り振られるという意味です。

実行結果
ccp_1.jpg
ccp_2.jpg
ccp_3.jpg
ccp_4.jpg

最後のほうはあまり違いが見えませんが、とりあえずボリュームの角度にあわせてLEDの明るさが変わっています。


クリックお願いいたします。

スポンサーサイト

もうすぐ今年も終わりかぁ・・・ PIC 新お勉強 その10(A/D変換)»

コメント

コメントの投稿













管理者にだけ表示を許可する


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。