Quantcast
Channel: JH7UBCブログ
Viewing all articles
Browse latest Browse all 440

PIC12F1822 A/Dコンバータのテスト

$
0
0
 PIC12F1822のA/Dコンバータの動作テストを行います。

 回路図です。表示には、AQM0802Aを使います。電源は乾電池2本(3V)です。
 A/Dコンバータ入力は、AN0(RA0)を使い、VDDの電圧を10KΩのボリュームで0~3Vの電圧を加えます。
 VREF=VDDとして、A/Dコンバータの動作をチェックします。

イメージ 1

 ブレッドボードです。
イメージ 2

 A/Dコンバータを使う手順は、

 1 アナログ入力にするピンを指定する。 ANSELA = 0b00000001;  //AN0(RA0)をアナログ入力にします。

 2 使うA/Dコンバータのチャンネルを指定します。またA/Dコンバータを有効にします。
   これは、ADCON0で行い、ADCON0 = 0b00000001; //bit6-bit2=0000でAN0を指定、bit0=1でADC有効になります。
 3 ADCON1のbit7で、結果を右詰めで格納するか、左詰めで格納するかを指定します。今回は右詰めにします。 また、bit6-bit4でA/D変換クロックを指定します(ADFM=1)。変換クロックは、1us以上なので、010=Fosc/32=1.0usとします。したがって、ADCON1= 0b10100000;となります。
 4 A/Dコンバータの準備ができる時間を待って、A/D変換をスタートします。(GO=10)

 5 A/D変換が終わるのを待ち、(GO=0になるのを待ちます)、結果をADRESHとADRESLから取り出します。

 プログラムです。0.5秒ごとにA/D変換値を表示します。I2C及びLCD表示部分は、前の記事と同じです。

--------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
// CONFIG1
#pragma config FOSC     = INTOSC
#pragma config WDTE     = OFF
#pragma config PWRTE    = ON
#pragma config MCLRE    = OFF
#pragma config CP       = OFF
#pragma config CPD      = OFF
#pragma config BOREN    = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO     = OFF
#pragma config FCMEN    = OFF
// CONFIG2
#pragma config WRT    = OFF
#pragma config PLLEN  = ON
#pragma config STVREN = ON
#pragma config BORV   = HI
#pragma config LVP    = OFF
#define _XTAL_FREQ 32000000
#define LCD_addr 0x7C   //3E+0
/* I2C 初期化*/
void I2C_init(){
    SSP1CON1 = 0x28;        //SSPEN = 1,I2C Master Mode
    SSP1STATbits.SMP = 1;   //標準速度モード(100KHz)
    SSP1ADD = 0x4F;         //Fosc/(4*Clock)-1  Clock=100kHz,Fosc=32MHz
}
/* スタートコンディション */
void I2C_start(){
    SEN = 1;
    while(SEN);
}
/* ストップコンディション */
void I2C_stop(){
    SSP1IF = 0;
    PEN = 1;
    while(PEN);
    SSP1IF = 0;
}
/* I2Cに1byte送信 */
void I2C_write(unsigned char dat){
    SSP1IF = 0;
    SSP1BUF = dat;
    while(!SSP1IF);
}
/* write command */
void LCD_cmd(unsigned char cmd){
    I2C_start();          //start condition
    I2C_write(LCD_addr);  //send slave address
    I2C_write(0x00);      //send control byte
    I2C_write(cmd);       //send command
    I2C_stop();           //stop condition
}
/* write charactor */
void LCD_char(unsigned char dat){
    unsigned char ackn;
    I2C_start();          //start condition
    I2C_write(LCD_addr);  //send slave address
    I2C_write(0x40);      //send control byte
    I2C_write(dat);       //send data
    I2C_stop();           //stop condition
}
/* LCD initialize ?*/
void LCD_init(){
    __delay_ms(40); //40ms wait
    LCD_cmd(0x38);  //8bit,2line
    LCD_cmd(0x39);  //IS=1 : extention mode set
    LCD_cmd(0x14);  //Internal OSC Frequency
    LCD_cmd(0x70);  //Contrast set
    LCD_cmd(0x56);  //Power/ICON/Contrast Control
    LCD_cmd(0x6C);  //Follower control
    __delay_ms(200);//200ms wait
    LCD_cmd(0x38);  //IS=0 : extention mode cancel
    LCD_cmd(0x0C);  //Display ON
    LCD_cmd(0x01);  //Clear Display
    __delay_ms(2);  //wait more than 1.08ms
}
/* Clear Display */
void LCD_clear(){
    LCD_cmd(0x01);
    __delay_ms(1);
    __delay_us(80);
}
/* Return Home `*/
void LCD_home(){
    LCD_cmd(0x02);
    __delay_ms(1);
    __delay_us(80);
}
/* Cursor 2line top */
void LCD_2line(){
    LCD_cmd(0xC0);
}
/* write 1 charactor to LCD  */
void putch(unsigned char ch){
    LCD_char(ch);
}
/* write string */
void putstr(const unsigned char *s){
    while(*s){
        LCD_char(*s++);
    }     
}
void main() {
    OSCCON = 0b01110000 ;     // 内部クロック8MHz
    ANSELA = 0b00000001 ;     // RA0をアナログPORTに設定
    TRISA  = 0b00001111 ;     // RA0,RA1,RA2,RA3は入力、RA4RA5は出力
    PORTA  = 0b00000000 ;     // PORTの初期化
    LATA = 0b00000000;
    I2C_init();
    LCD_init();
   
    putstr("ADC TEST");
       
    /* A/Dコンバータ関係の設定 */
    ADCON0 = 0b00000001;    //AN0をselect,ADCイネーブル
    ADCON1 = 0b10100000;    //ADFM=1(右詰め),クロックFosc/32,VREF=VDD
   
    while(1){
        __delay_us(20);
        GO = 1;             //ADCスタート
        while(GO);          //ADC完了まで待つ
        unsigned int val = ADRESH;
        val = (val<<8) | ADRESL;
        LCD_2line();
        printf("%4d",val);
        __delay_ms(500);
     }
}
-------------------------------------------
10kΩのボリュームを回すと、1~1023の値を表示しました。正常に動作しています。

PIC12F1822は、固定参照電圧を内蔵していますので、次回それを使ったテストをしてみます。

Viewing all articles
Browse latest Browse all 440

Trending Articles