PICのお勉強(30) C言語編 AD変換の結果をLCDに表示する
前回の回路にLCDをつけて,A/D変換して得られた10bitの数値データを表示してみました。
基準電圧が5Vだから1023が5Vにあたり,分解能は約5mVってことになりますね。そこで,データを5倍してmVの単位でLCDに表示しようと思います。要するにこれは電圧計ですな。
ソースはこれ→lesson30.c
数値データをどうやったらLCDに表示できるのか悩みましたが,itoa(Integer to Asciiって意味?)という便利な関数があるんですな。コレで文字列にしといてLCDに送ればいいみたい。あ,あとlcd.cの「TRISA=0;」をコメントアウトしないといけません。「TRISA = 0b00000001;」としといてもいいけど。
やってみると,ちゃんと表示されるじゃないですか。アタリマエかもしれないけど嬉しいですなあ。
LCDは,10msごとに表示を書き換えてるので,ちょっとチラチラするんだけど,これはなんか良い方法があるのかなあ? また調べときます(^^;)
あと,LCDのコントラスト調整についてですが,SD1602の3ピン(VO)にダイオードを1本つけておくだけで,電源電圧が多少変わっても自動的に適正コントラストになるようです。VO端子は0.5V程度の電位にしておけば,適正コントラストになるらしいのですが,ダイオードを使えば約0.6Vになりますものね。ここに書いてありました。素晴らしいアイデアです。
/************************************
16F88 HI-TECH C v.9.83
RA0(AN0)の入力電圧をA/D変換してLCDに表示する
************************************/
#define _LEGACY_HEADERS
#include "pic.h"
#include "stdlib.h"
#include "lcd.h"
#define _XTAL_FREQ 4000000
__CONFIG(CCPRB3 & DEBUGDIS & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);
unsigned int adconv();
unsigned int tmp;
unsigned int i;
char str[7];
void main()
{
OSCCON = 0b0110000; // 内蔵OSC 4MHz
ADCS2 = 0; //AD変換クロック値設定
ADCS1 = 0;
ADCS0 = 1;
ADFM = 1; // AD変換結果は右詰めで格納
VCFG1 = 0; // 基準電圧はVddとVss
VCFG0 = 0;
ANSEL = 0b00000001; // RA0(AN0)はアナログ
TRISA = 0b00000001; // RA0(AN0)入力
TRISB = 0b00000000; // すべて出力
PORTA = 0b00000000;
PORTB = 0b00000000;
lcd_init(); //SD1602の初期化
while (1)
{
tmp = adconv()*5;
itoa(str,tmp,10);
lcd_clear(); //表示クリア
lcd_goto(0); //カーソルを0行目の先頭に移動する
lcd_puts(str);
lcd_puts("mV");
__delay_ms(10); //10msの時間待ち
}
}
unsigned int adconv()
{
CHS2 = 0; //AD変換ポート設定 RA0(AN0)
CHS1 = 0;
CHS0 = 0;
ADON = 1; //AD変換ON
__delay_us(20); //アクイジション時間 20us
GODONE = 1; //AD変換開始
while(GODONE); //変換完了待ち
return (ADRESH<<8) + ADRESL;
}
| 固定リンク | 0
「PICマイコン」カテゴリの記事
- ZK-80で足し算(2020.07.23)
- TK-80互換機 ZK-80のキット(2020.07.21)
- PICのお勉強(37) C言語編 12F683でA/D変換(2015.06.02)
- UVレジンでLEDイルミネーション (2)(2015.05.15)
- PICのお勉強(35) C言語編 PWMでサーボモータを動かす(2014.10.05)
コメント
物理の教師とかををなされているのですか?
投稿: Coma | 2012年7月12日 (木) 15:44