PIC 54:電圧と棒グラフ


 以前から遊んでいたLCDがあります。[PIC16F883]ですが「何か使わないと!」と思い電圧表示にでも使おうと試すことにしました。
 電圧はIC内臓の10bitのA/D変換です。これをただ表示するだけでは、意味がありませんが空いているスペースを使って「棒グラフ」と連動させようと思いました。時折見かけるものです、これはメーター代わりに使えるのでこの機会に試すことにしました。

 A/D変換は普通は多数サンプルを取って使うのですが、ここでは1回のサンプル表示です。実験なので数字が出れば良い。

 棒グラフは単に横一杯の16文字分を使っています。これは半分でも良かったかとか、10個表示でも!なども考えられますが、まずは「最大16個表示」にしました。

 [ A/D変換 ]

 特に理由はないので、ICに付いているA/D変換を利用しました。10Bitで使い慣れたものです。
 実験で高速表示も無いので、1回測定してその結果をLCDに表示するだけです。

 基準電圧は5Vとし、3端子レギュレータに依存しています。

 表示関連は全てSoftまかせで、小細工はしない。

全体

 [ 棒グラフ ]

 LCDの下の段を棒グラフにします、左から右へ伸ばしました(これの方が簡単)。数字DATAが基準になります。A/D変換は0-1023まで変換されるので、これを64で割ると16になります、これをDATAがある所は黒印、後はクリヤーすれば棒グラフの出来上がりです。
 黒角を使いましたが、○や#なども使えます。

 応用は結構あると思います。デジタル信号がアナログ的に見えるので、視覚的に面白いです。
 16文字分を使いましたが、例えば3つに分けてそれぞれの信号の変化を表示させる。などをすると「つまらない文字の羅列も見たくなる」というものです。

 [ ハードの製作 ]

 以前の物を再利用した物で、新たに作った物ではありません。単に半固定のVRを付けて電圧を端子に加えただけです。説明も不要でしょう。

 今回は「棒グラフ」の実験が主でSOFTの確認で、Softのポイントは「棒グラフ」の太線の所です

 [ 結果 ]

 予定通りの動作をしました。VRを動かすと0-1023までスムーズとは言えませんが、それなりに変化が見えます(VR自体が小さいので細かく調整出来ません)。
 これでアナログ化のツールが手に入ったことになります(そんなライブラリーって有ったのかなー、不明)。

 Mikro C-Proに代わってプログラムの変更、アチコチ直す必要が出て少し面倒です。でも、なれるしかありませんが面倒ですね。初めからProになっていれば多少は苦労が少ないと思うのですが・・・。
 当然の事ですがPIC16F88なども同じプログラムで動くはずです。

 現時点でコンフイグのエラーになっていますが、動作はしています。(秋月電子ライターとの相性問題か・・・。)

2009年8月8日 

/* Last M:2009/8/8
 By M.kikuchi
*/
//  Lcd pinout settings
      sbit LCD_RS at RC5_bit;
      sbit LCD_EN at RC6_bit;
      sbit LCD_D7 at RB0_bit;
      sbit LCD_D6 at RB1_bit;
      sbit LCD_D5 at RB2_bit;
      sbit LCD_D4 at RB3_bit;
//  Pin direction
      sbit LCD_RS_Direction at TRISC5_bit;
      sbit LCD_EN_Direction at TRISC6_bit;
      sbit LCD_D7_Direction at TRISB0_bit;
      sbit LCD_D6_Direction at TRISB1_bit;
      sbit LCD_D5_Direction at TRISB2_bit;
      sbit LCD_D4_Direction at TRISB3_bit;

      char txt1[] = "123456";
      char txt2[] = "JA1HWO";
      char i;                 // Loop variable

void  main(){
      unsigned    int ad;
      unsigned    char buf[6];
      
      TRISA = 0xff;          //Input
      TRISB = 0;             //OUTput
      TRISC = 0;
      OSCCON=0b01110000;     //8MHz
      ANSEL =0b00000001;     // RA0-4
      ANSELH=0;
      PORTC=0;               //

     Lcd_Init();            //Lcd set
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Cmd(_LCD_CURSOR_OFF);
//
      Lcd_Out(1,1,txt1);
      Lcd_Out(2,5,txt2);     //
      Delay_ms(1000);
      Lcd_Cmd(_LCD_CLEAR);
//
      while (1){
         ad = Adc_Read(0);
         WordToStr(ad,buf);
         Lcd_Chr(1,1,buf[0]);     //電圧表示
         Lcd_Chr_Cp(buf[1]);
         Lcd_Chr_Cp(buf[2]);
         Lcd_Chr_Cp('.');
         Lcd_Chr_Cp(buf[3]);
         Lcd_Chr_Cp(buf[4]);
         Lcd_Chr_Cp('V');         //

  // 棒グラフ
         for(i=0;i<16;i++){
            if((ad/64)>=i)
               Lcd_Chr(2,i+1,0xff);
            else
               Lcd_Chr(2,i+1,' ');
         }
         Delay_ms(300);
      }
}

 [MENU] [MAIN MENU]

inserted by FC2 system