goo blog サービス終了のお知らせ 

元杜重工

*あつめたりつくったり* 過去資料整理中
鉄道・船・マンホールの写真と艦船プラモデル・電子工作も少々

PICでAD変換とPWM制御

2020年07月11日 | 電子工作
雨で外出もできないので久々にマイコン工作。

LEDキャンドル的なものを作ってみました。
スイッチ付けたらヒカルだけでは面白くないので、ボリュームで明るさを調整できるようにしました。

実用性を考えてサイズは最小化。5cm x 4cmくらい。
ボタン電池LR44 x2個で動きます。PIC12F1822使用。



回路はこんな感じ。
部品数が少ないのにちゃんと動くのがPICマイコンの偉いところ。


MPLABのXC8とPICkit3で構築。

◆ピンの設定
TRISA = 0b010000;
ANSELA = 0b010000; // RA4をアナログ入力
PORTA = 0b000000;
WPUA = 0b000000;

◆PWM関連
CCP1CON = 0b00001100 ; // PWM機能を使用する
CCP1SEL = 1; // CCP1/P1A の機能を RA5 に割り当てる
T2CON = 0b00000001 ; // TMR2プリスケーラ値を4倍に設定
CCPR1L = 0 ; // デューティ値は0で初期化
TMR2 = 0 ; // Timer2カウンターを初期化
PR2 = 255 ; // PWMの周期を設定(4MHzなら249=1000Hz)
TMR2ON = 1; // TMR2(PWM)スタート

◆AD変換関連
ADCON0 = 0b00001101; // AN3(RA4)をアナログ チャンネル選択 ADC を有効
ADCON1 = 0b00010000; // 左詰め FOSC/8 V_DDを参照

◆AD変換実行
GO_nDONE = 1;
while(GO_nDONE);
今回は左詰めにして上位8bitだけ参照してchar型の変数に格納して使いました。
i = ADRESH;
これを
CCPR1L = akarusa;       // 大きいほどLEDは暗い
すればほぼ出来上がり。

たったこれだけですが、鈍った半田ごて裁きを取り戻すにはよかったかも。簡単な工作ですが、ちゃんと調光できるので面白いですね。このくらいならマイコンいらなくねとか思うけど、まぁオートパワーオフとか炎のようにゆらゆら点灯とかもプログラム次第ではできるので。

PICで温度計測

2018年03月31日 | 電子工作
温度センサって案外安いものですね。
秋月で1個60円で売っていた
高精度IC温度センサLM61CIZ[LM61CIZ]
を使って温度を測っていみました。

センサのほかに使用するのはPICマイコン12F1822とPCとの接続に使用するFT232R組み込みのケーブルTTL-232R-5V。
PC側はTera Termを使用します。参考記事

LM61は-30℃から+100℃を300から1600mVで表現します。電源は2.7~10Vに対応なので乾電池2本でもUSBでも可能。

PIC12F1822は8ピンのマイコンで10bitのAD変換機能(ADC)やUSERT機能があります。
今回をこれを利用してセンサのデータを変換してPCに表示させます。

ADCは8ケタ+2ケタの10bit(0~1023)に変換できます。2ケタ+8ケタの右揃えにもできます。
またAD変換には参照電圧が必要です。電源電圧や外部のバッテリなどのほかに固定参照電圧(FVR)という機能があるので今回はこれを使います。
センサ出力は最大で1600mVですので2014mVのFVRを使用します。

ADCのクロック速度の設定が必要です。
マイコンのデータシートにマイコンの動作周波数(FOSC)ごとの推奨速度が示されています。
今回は1MHzで動作させるため、FOSC/2(2us)としました。

ソースコードの一部を紹介
◆ピンの設定
ANSELA = 0b000001; //RA0はアナログ入出力
RXDTSEL = 1; //RX/DTの機能をRA5 に割り当てる
TXCKSEL = 1; //TX/CKの機能をRA4 に割り当てる
TRISA = 0b110101; //RA0,2,5,6を入力 (2は別用途)
WPUA = 0b00000; //弱プルアップしない

◆設定
FVRCON = 0b10000010; //FVR有効、2048mV
ADCON0 = 0b00000001; //AN0をAD変換、ADC有効
ADCON1 = 0b00000011; //左詰め、FOSC/2、<1:0>=11: VREF+を内部の固定参照電圧(FVR)モジュールに接続する

◆変換実行
ADGO = 1;
while(ADGO);

変換結果はADRESH、ADRESLへ格納される。

左詰めの場合、上位8bitのみ使用して温度へ換算するとこんな感じ。
temp = (ADRESH*4)/5-60; // 1degC = 10mV


PCにつないで動かしてみます。
部品数が少ないのにちゃんと動きます。

PCでこんな感じで表示させてみました。
今回はマイコン内蔵のEEPROMに記録機能も付けました。

PICとPCをUSBでつなぐ(USART/TTLの一歩)

2018年02月03日 | 電子工作
ころがってたPICマイコンを久々にPCとシリアル通信してみたので備忘録。

今回、PCとの接続に使用したのは秋月で売ってるUSBシリアル変換ケーブル
TTL-232R-5V

見た目は普通のUSBケーブルだけど中にFT232Rが組み込まれています。
5Vの電源も供給してくれます(3.3Vの製品もあります)。75mAまで。


片方をPCにもう片方をブレッドボードやピンソケットピンヘッダにそのまま差せます。

PC側はTera Termを使用。
「ファイル」から「新しい接続」を開いて「シリアル」を選択しそれっぽいCOMをリストから選ぶ。
「設定」の「シリアルポート」を開けばボーレートとか設定できる。今回は9600。


これでPC側は準備よし。

ちなみに「新しい接続」はAlt+N、「接続断」はAlt+I


PICはおなじみPIC16F628A。
ブレッドボード上で組んでみる。

V_DD(14番ピン)、V_SS(5番ピン)はそれぞれ電源のプラスとマイナスに接続。

それから通信には7番ピンのRXと8番ピンのTXを使用する。
それぞれTransmittedとReceived。
USBシリアル変換ケーブルにもRXとTXがあるのでこれにつなぎます。

ここで注意!!

TXはデータを流す側でRXはデータを受け取る側なので
【TXとRX】をつなぎます。
同じもの同士をつないではいけません。

USBシリアル変換ケーブルには他にも2本端子が出ていますが、今回は何もつなぎません。

あとはソフトウェア。
MPLAB XとXC8を使いました。


プログラムのポイントは

◆RX, TXは入力
TRISB = 0b00000110;   //RX(RB1),TX(RB2)は入力

◆送信モード
今回は非同期・ハイスピード
SYNC = 0;       //USART Mode Select bit = Asynchronous mode
BRGH = 1;       //High Baud Rate Select bit
SPBRG = 25;      //BOUD RATE 9600
クロック4MHzでBRGH = 1のときSPBRG = 25とするとほぼ9600になります。
データシートにSPBRGの計算式と一覧表があります。

◆送信許可
TXEN = 1;       //Transmit enabled

◆データの受信関数
char getch()
{
while(!RCIF);  //USART receive bufferがFullになったら
return(RCREG);  //データを返す
}

◆データの送信関数
void putch(char DATA)
{
while(!TXIF);   //USART transmit bufferがFullになったら
TXREG = DATA;   //1バイト書き込み
}

◆データを送信
printf("Hello\r\n");
printf("Ans = %c\r\n", DATA);

こんな感じで簡単な文字の送受信ができました。

7セグLEDをダイナミック点灯

2017年11月03日 | 電子工作
先週、先々週と台風で家に引きこもり。
ということで久々にPICマイコンを引っ張り出して、秋葉原の秋月で買ってストックしておいたパーツで電子工作。

今回は7セグLEDでタイマーを作りました。

7セグLEDとはエレベータとかで見るこれ。


4桁赤色7セグメントLED表示器(コロン付) カソードコモン(カソード共通)
[OSL40391-LRA]
1個200円

数字の部分が光る7本のバー(セグ)でできています。
写真のものは4ケタ。あるので合計で7×4=28本のセグがあるわけですが、16本しか端子がありません。
LEDの+側端子アノードと-側端子カソードがあるはずなので、各セグから2本ずつ脚が出ているわけではありません。

では、どうなっているかというと上にも書いたように「カソード共通」になっているのです。
しかし、それでもアノードが各セグから出ていれば28+1本は必要です。

となると…

アノードも共通化されています。

データシートを見てみましょう。

(電流が下から上へ流れる見づらい描き方、アノード共通の製品の図をコピーして作ったのでしょうか)

左端の3つのLEDは時計の分と秒の間のドットとかなのでとりあえずおいておいて、
それ以外は8個のLEDが4つの塊になっています。
(8個というのは7セグ+各桁の右下のドット)

上4つのCOMがカソード、下のA~GとDPがアノードです。
つまり使用する端子の数は4+8=12です。

各桁のアノードがつながっているので、これでは各桁に同じ数字しか表示できません。
桁ごとにカソードは分かれているので、どの桁を点灯するかは選べるようです。

ということは、【一の位に「5」を表示して他の桁は消灯】みたいなことはできるようです。

他の3つの桁も同じようにできるので、
【一の位に「5」を表示して他の桁は消灯】
【十の位に「6」を表示して他の桁は消灯】
【百の位に「7」を表示して他の桁は消灯】
【千の位に「8」を表示して他の桁は消灯】
という動作を順番にすることはできます。アノードがつながっているので同時にはできません。

じゃあ、順番に切り替えるしかありません。一の位から順番に
「えーと、一の位が5で次が6で…」
みたいな感じでひとつずつ読み取ることにしましょう。


そんな、のんびりしたことはやってられません。

じゃあ、桁を切り替える操作を高速(目にもとまらぬ速さ)でやってやりましょう。

人間の目は毎秒30フレームぐらいで感じ取っているらしいです。テレビや動画も毎秒30コマで静止画を切り替えているわけですから。
つまり1/30秒の間に
【一の位に「5」を表示して他の桁は消灯】
【十の位に「6」を表示して他の桁は消灯】
【百の位に「7」を表示して他の桁は消灯】
【千の位に「8」を表示して他の桁は消灯】
という動作をしてあげれば、同時に光って見えるはずです(まあ、綺麗に見せるにはもっと高速にする必要があります)。

これが【ダイナミック点灯】と呼ばれる手法です。
街中で目にする7セグLEDや電光掲示板で使われているものです。
注意点としては、各桁は点滅しているので連続点灯している場合より暗く見えます。


今回のマイコンには、お気に入り(?)の16F628Aを使います。
難しいことをしないのであれば十分な性能と安さだと思っています。
最近は16F1827というもっと高性能で安いものもありますが…。


PICマイコン PIC16F628A-I/P
[PIC16F628A-I/P]
1個180円

脚が18本。このうち2本は電源で残りの16本がI/Oポートです。(メモ②)
これなら何とか動かせそうです。

PICの7本足に抵抗を挟んでLEDのアノードへ。
LEDのカソード側はスイッチ(NPNトランジスタSC1815)を挟んでGNDへ。各桁とコロンの分で5つPICで制御します。

PIC動作の基本は
1.トランジスタを一つずつONに
2.表示する数字になるようにアノード側をONに
3.今のトランジスタをOFFにして次のトランジスタをONに
4.次の桁の数字になるようにアノード側をONに
5.くりかえし

そんなこんなで


出来ました。
250Hzで桁を切り替えています。
「2」がちょっと暗いのはシャッターを切ったタイミングの問題で目では同じ明るさに見えます。


いや~【ダイナミック点灯】をはじめに考えた人はすごい。賢い。私も賢くなりない~。


-----メモ①-------
アノード側の抵抗に10Ωを写真では使っています。電源は単3電池2直で3V。
秋月のサイトによればLEDの順方向電圧降下:2.1~2.5V、
LEDのデータシートは10ms以下であれば100mAまでOKとなっているので

(3-2.1)V/0.1A=9Ω

ちょっと攻めすぎだろ。というかPICのデータシートで
Maximum output current sourced by any I/O pin・・・25mA
ってなんているんだからそれ以上、マイコンから出しちゃダメでしょ。47Ωとかにしましょう。

-----メモ②-------
この16F628Aについて
「脚が18本。このうち2本は電源で残りの16本がI/Oポートです。」
と書きましたが、16本の内2本(RA4, RA5)はInput専用なのでOutputに使えるのは14本です。
今回は右下のドットを使っていないのでアノード7、カソード5で12本つかっています。カツカツです。

-----
※本文中の価格・仕様は変更になっていることがあります。ご確認ください。

久々のマイコン PIC12F1822

2017年05月01日 | 電子工作
連休につきあることを思い立って久々にPICマイコンをいじり始めました。
というわけで早速、部品集めに秋葉原に。

いつもはピン数、機能、価格でまあまあ使えて手頃なPIC16F628Aを使っているのですが、今回は小型化目的で8ピンの12F1822に初挑戦。以下備忘録。

○なんか知らんが、初期設定はアナログ入出力になっている。下記のようにするとデジタルにできる。
ANSELA = 0b00000000;
○RA2またはRA5をPWM駆動できる。ピンのセレクトは
CCP1SEL = 0; //0:RA2, 1:RA5

他は今のところ628Aとだいたい同じ。日本語のデータシートもあるしなんとかなる。さてさてだいたいブレッドボード上で回路ができてプログラムも佳境というところでPICKIT3が故障。MPLAB X IDEの画面ではPrograming/Verify completeと表示されるのに何度やっても書き換わっていない。書き込んでいる時間もなんか短い気がするのでダメかなあ。LEDはいつも通り点いているんだけどSTATUSは緑で時々一瞬だけ赤になったりするし…。

追記
新品の同型PICにつないで書き込みを行ったところ、PC上のものではなく最後に書き込み成功したものが書き込まれた。つまるところ書き込みできていないのではなくPICKIT3が記憶しているプログラムコードが書き換わらなくなっているようだ。どうすらええ。