迷走の果て・Tiny Objects

迷走する日々の覚え書きです。自分で分かってることは省略してますので、念のため。

デジット8桁14セグメントLCDを試す(2)電圧計

前の記事の続きです。
セグメントパターンをいくつか作ってこのような表示をしてみました。
アルファベットを全部作るつもりはありませんけど。
WELLCOME.jpg

PSoC1のEzADCを使って簡単な電圧計の実験をしました。
コードサイズが3K程度ですので、CY8C27143より安価なCY8C24123を使いました。
電圧計

かなり厄介です。サンプルレートを変えるとAD変換値が変わったり、アナログ関係のパラメータを変えても同じ。
外付けのADコンバータを使ったほうが楽でしょう。

一応、回路図です、簡単。
digit14segLCD電圧計

digit14segLCD_EzADC.jpg
EzADCの設定です。
裏技(レジスタを直接いじる)を使わずにAGNDを出力できるなど名前どおりラクチンなのですが、サンプルレートを変えるとAD変換値が変わるのはどういうわけでしょう?

digit14segLCD_globalResouces.jpg
今回、RefMuxには (1.6 BandGap)+/-(1.6 BandGap) を使ってみました。
PSoCのBandGap電圧は1.3Vですから 2.08V+/-2.08V となります。
これで±2Vぐらいまで測れるだろうという目論見でしたが、実際は2Vから-1.6Vぐらいです。プラス側はPSoCのVDD(5V)に対して1Vほど余裕がありますが、マイナス側はVSSに対して余裕がないからです。
AGND_BandGapの説明

-1.6V以下では誤差が大きくなります。
入力電圧 表示値
-1.40V   -1.400
-1.50V   -1.500
-1.60V   -1.599
-1.70V   -1.695
-1.80V   -1.787
-1.90V   -1.864
といった具合です。

ちなみに消費電流は10mA弱(VDD=5V)。アッテネータを入れれば単機能の電圧計として使えそうです。
でも外付けADCの実験もしてみたい。

恥ずかしながらコード公開しますが、PSoCerで無ければ理解しにくい部分があるかも。
変数の名前を判りやすくつけようと思ったのですが、途中で挫折。


//----------------------------------------------------------------------------
// デジット8桁14セグメントLCDを試す
// 2015/10/24
// edy
// 2015/10/30
// 24123に移植
// http://eleshop.jp/shop/g/gF7M416/
//----------------------------------------------------------------------------

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h"

#define AVE_NUM 4

unsigned char tx_buf[18];
unsigned char digit_buf[8];
//
const int seg_pat[30]={
63, 6, 219, 207, 230, 237, 253,5121, 255, 239,
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0,9350,1334,9264,4800, 192,10294, 249, 56, 57,2048};
// spc, A, M, V, +, -, W, E, L,  C,","


//
//桁番号 digit_num=0...7 セグメント番号 seg_num=0...13 とする。
//セグメント番号は
// A:0 B:1 C:2 D:3 E:4 F:5 G1:6
// G2:7 J:8 K:9 L:10 M:11 N:12 P:13
//
//bit_pos[digit_num*14+seg_num]がビット位置
/*
const unsigned char bit_pos[112]={
86, 85, 84, 83, 82, 80, 81, 1, 0, 6, 5, 4, 3, 2,
93, 92, 91, 90, 89, 87, 88, 8, 7, 13, 12, 11, 10, 9,
100, 99, 98, 97, 96, 94, 95, 15, 14, 20, 19, 18, 17, 16,
107,106,105,104,103,101,102, 22, 21, 27, 26, 25, 24, 23,
114,113,112,111,110,108,109, 29, 28, 34, 33, 32, 31, 30,
121,120,119,118,117,115,116, 36, 35, 41, 40, 39, 38, 37,
128,127,126,125,124,122,123, 43, 42, 48, 47, 46, 45, 44,
135,134,133,132,131,129,130, 50, 49, 55, 54, 53, 52, 51
};
*/
//2015/10/25追記
//bit_pos[]を見ていたら規則的に並んでいるのに気付いたので変更。
//bit_pos0[seg_num]+digit_num*7 がビット位置
const unsigned char bit_pos0[14]={
86, 85, 84, 83, 82, 80, 81, 1, 0, 6, 5, 4, 3, 2};

void delay_1mS(void ) //CPU_Clock 24MHz~1.5MHzまではそこそこ正確。それ以下では1msより長くなる。
{
int i;
int delayTable[]={32,83,184,388,6,0,0,0};
for (i=delayTable[OSC_CR0 & 0x07] ; i>0 ; i-- ) {}
}

void delay_1mS_Times(int delay)
{
int i;
for (i=0 ; i<delay ; i++) {
delay_1mS();
}
}

void LCD_Disp(void )
{
int i,j,k;
for ( i =142; i>=0 ; i--){
CLK_Off();
j=i/8;
k=i%8;
DAT_Switch(tx_buf[j] & (1<<k));
CLK_On();
}
STB_On();
STB_Off();

}
void clear_tx_buf(void )
{
int i;
for (i=0 ; i<=17 ; i++) {
tx_buf[i]=0;
}
}

void convert(void )
{
int p,r,s,digit_num,pattern,seg_num,tx_bit_pos;

for (digit_num=0 ; digit_num<=7 ; digit_num++){
pattern=seg_pat[digit_buf[digit_num]];
for (seg_num=0 ; seg_num<=13 ; seg_num++){
p=pattern & 1; // LSB of pattern
pattern/= 2; // shift right
//tx_bit_pos=bit_pos[digit_num*14+seg_num];
tx_bit_pos=bit_pos0[seg_num] + digit_num * 7;
r=tx_bit_pos / 8;
s=(1<<(tx_bit_pos % 8)) * p;
tx_buf[r]=((tx_buf[r])& ~s) | s;
}
}
}

void main(void)
{

int i,j,loop_count,isMinus,loop ;
long ADCResult;
long offset;

M8C_EnableGInt ;
DAT_Start();
CLK_Start();
STB_Start();
AMUX8_Start();
EzADC_Start(EzADC_LOWPOWER);

// display test
for (i=0 ; i<=17 ; i++) {
tx_buf[i]=255;
}
LCD_Disp();
delay_1mS_Times(500);

clear_tx_buf();
LCD_Disp();
delay_1mS_Times(500);

AMUX8_InputSelect(AMUX8_PORT0_5);
delay_1mS_Times(100);

offset=0;
for(loop_count=0 ; loop_count<AVE_NUM; loop_count++) {
EzADC_GetSamples(1);
while (!(EzADC_fIsDataAvailable())); // Loop until value ready
offset+= EzADC_iGetDataClearFlag() ; // Reset ready flag and get data
}

AMUX8_InputSelect(AMUX8_PORT0_4);

while(1){

ADCResult=0;
for(loop_count=0 ; loop_count<AVE_NUM; loop_count++) {
EzADC_GetSamples(1);
while (!(EzADC_fIsDataAvailable())); // Loop until value ready
ADCResult+= EzADC_iGetDataClearFlag() ; // Reset ready flag and get data
}

//ADCResult=(ADCResult-offset)/AVE_NUM;
ADCResult=((ADCResult-offset)*1000/978+AVE_NUM/2)/AVE_NUM;

isMinus=0;
if (ADCResult<0) {
ADCResult=-ADCResult;
isMinus=1;
}

digit_buf[7]= 13; // "V"
digit_buf[6]= ADCResult%10;
ADCResult/= 10;
digit_buf[5]= ADCResult % 10;
ADCResult/= 10;
digit_buf[4]= ADCResult % 10;

digit_buf[3]= 20; // "."

ADCResult/= 10;
digit_buf[2]= ADCResult % 10 ;
digit_buf[1]= (isMinus!=0) ? 15 : 10 ; // - or space
digit_buf[0]= 10 ; // space

clear_tx_buf();
convert();
LCD_Disp();
}
}
関連記事
スポンサーサイト

コメント

コメントの投稿

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

トラックバック

この記事へのトラックバックURL
http://edycube.blog2.fc2.com/tb.php/829-09808a85

 | HOME | 

文字サイズの変更

プロフィール

edy

最新記事一覧(サムネイル画像付き)

Arduino 互換ボード SS MICROを試す Jul 22, 2017
店の電飾(3)無限鏡(infinity mirror) Jun 25, 2017
店の電飾(2)回路の変更とスケッチ Jun 25, 2017
店の電飾 Jun 18, 2017
Arduino Pro Microを試す。(3)HIDとして使う(2) Jun 15, 2017
Arduino Pro Microを試す。(2)HIDとして使う Jun 04, 2017
Arduino Pro Microを試す。(1) Jun 03, 2017
脈拍センサー MAX30102を試す(2)MAX30100と比較 May 29, 2017
脈拍センサーMAX30102を試す(1) May 25, 2017
脈拍センサーMAX30100を試す(5) May 20, 2017

全記事表示リンク

全ての記事を表示する

ブログリンク

リンク

このブログをリンクに追加する

月別アーカイブ

07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  12  11  10  09  07  05  04  03  04  03  01  12  11  10  08  07  06  05  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  02  01  12  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  10  09  08  07  06  05  04  03  02  01 

カテゴリ

プログラミング (0)
freescale (1)
AVR (3)
テルミン (16)
緊急警報放送 (3)
78K (1)
PSoC (295)
地上デジタル放送 (2)
電子工作 (404)
HX711 (2)
ACS712 (6)
数学 (6)
パソコン (12)
PLC (14)
未分類 (39)
ブログ関係 (20)
スカイプ (37)
ロボット (1)
LTSpice (8)
OCXO (0)
arduino (32)
maxima (1)
フランクリン発振回路 (3)
GPS (3)
DTMF (1)
Linux (1)
KOMAINO (7)

タグリスト

最近のコメント

最近のトラックバック

メールフォーム

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

検索フォーム

アクセス

RSSリンクの表示

フリーエリア

FC2Ad

まとめ

Template by たけやん