閲覧総計:18900  (本日:1  昨日:4)

A/D値でLED点滅間隔変更

【目次】(項目をクリックすると飛べます)



「A/D変換」を利用した簡単なプログラムを作成し、18F2320の「A/D変換」機能の利用法、
稼働を確認しました。

A/D変換値(0〜1023)を用いて発光ダイオード(LED)の点滅間隔を0msec〜1023msec
にスムーズに変化させる。 07/10/06

※C18のプログラムを追記した。 08/08/31

P1010554.JPG

Mikro Cのプログラム

/**
* 18F2320 アナログ入力テスト 0-5V入力−LED点滅時間
* A/D値で発光ダイオード(LED)の点滅間隔を変更する
*
* PIC18F2320
*
* A/D: RA1(AN1) (10KΩ半固定抵抗で分圧しアナログ値を生成)
* LED: RC1
*
*Clock: 8.0MHz 内蔵発振器使用
*Device Flags:
* _INTIO2_OSC_1H _WDT_OFF_2H _MCLRE_OFF_3H _LVP_OFF_4L
* (その他はデフォルト設定でOK)
*
* MikroC v7.0.0.3
*/
void main()
{
    unsigned int temp; //使用変数の定義

    //PICの初期化
    PORTA = 0b00000000; //PORTAの中身をきれいにする
    PORTC = 0b00000000; //PortCの中身をきれいにする
    OSCCON = 0b01110000; //内蔵発信機 8MHz使用に設定
    //A/D変換clock設定 0.125us*16倍=2.0us
    ADCON2.ADCS2=1;
    ADCON2.ADCS1=0;
    ADCON2.ADCS0=1;
    TRISA = 0b00000010; //RA1のみ1:入力に設定、他は0:出力
    TRISC = 0b00000000; //PortC 8個全て0:出力設定
    //マイコンの初期化終わり

    do
    {
        //アナログデータの取得 10bit(0~1023)
        temp = ADC_Read(1); //RA1(AN1)アナログ入力

        //LED点滅間隔が0-1023msecで滑らかに変更出来る
        PORTC.F1 = 1;
        VDelay_ms(temp);
        PORTC.F1 = 0;
        VDelay_ms(temp);
    } while(1);
}

★この情報は役に立ちましたか?

選択肢 投票
はい 22  
いいえ 14  

C18のプログラム

/**
* 18F2320の稼働テスト アナログ値の取得
* A/D値で発光ダイオード(LED)の点滅間隔を変更する
*
* A/D:RA1 (10KΩ半固定抵抗で分圧しアナログ値を生成)
* LED:RC1
* Clock: 8.0MHz 内蔵発振器使用
*
* C18 StudentEdition v3.12
*/
#include <p18f2320.h>
#include <adc.h>
#include <delays.h>

//config設定
#pragma config OSC = INTIO2 //内部発振器を利用
#pragma config WDT = OFF //ウォッチドッグタイマOFF
#pragma config MCLRE = OFF //MCLRをOFFし、RE3として利用
#pragma config DEBUG = OFF //デバッグ可にし、RB6,RB7はICD用に利用
#pragma config LVP = OFF //低電圧ICSP制御OFF
//その他のconfigはデフォルト設定のまま

//関数のプロトタイプ宣言
void my_delay_ms(unsigned int x); //at 8MHz

void
main(void)
{
    //使用変数の定義
    int result; //A/D値(10bit)の受け
    
    //PICの初期化
    OSCCON = 0b01110000; //内蔵発振器を8MHz使用に設定
    TRISA = 0b00000010; //PortAのRA1を1:入力に他は0:出力に設定    
    TRISC = 0b00000000; //PortC 8個全て0:出力設定
	
    OpenADC( //第1引数
             ADC_FOSC_16 & //AD変換用クロック:システムクロックの16倍 0.125μsec*16=2.0μsec
             ADC_RIGHT_JUST & //変換結果の保存方法 右詰め
             ADC_0_TAD, //AD変換のアクイジションタイム選択 0Tad 
             //第2引数
             ADC_CH1 & //AD変換するのチャンネル選択(PIC18Fは同時に複数のAD変換はできない) 
             ADC_INT_OFF & //AD変換での割込み使用の有無 割込み無し
             ADC_VREFPLUS_VDD & //Vref+の設定 PICの電源電圧と同じ:ADC_VREFPLUS_VDD or 外部(AN3)の電圧:ADC_VREFPLUS_EXT
             ADC_VREFMINUS_VSS, //Vref-の設定 PICの0V:ADC_VREFMINUS_VSS or 外部(AN2)の電圧:ADC_VREFMINUS_EXT
             //第3引数
             0b0000); //ポートのアナログ・デジタル選択 (ADCON1の下位4ビットを記載) AN0-AN12全てアナログ使用
    Delay10TCYx( 5 ); //50TCY待つ

    while (1)
    {
         SetChanADC( ADC_CH0 ); //AD入力チャンネルの設定
         ConvertADC(); //AD変換実行
         while( BusyADC() ); //AD変換が終わるまで待つ
         result = ReadADC(); //AD変換値(10bit)読込み

         LATCbits.LATC1 = 1; //LED ON
         my_delay_ms(result);
         LATCbits.LATC1 = 0; //LED OFF
         my_delay_ms(result);
     }
}

void
my_delay_ms(unsigned int x) //at 8MHz
{
    while (x)
    {
        Delay1KTCYx(2); //1mS遅延 at 8MHz
        x--;
    }
}

★この情報は役に立ちましたか?

選択肢 投票
はい 7  
いいえ 1  

添付ファイル: fileP1010554.JPG 2247件 [詳細]