ADC กับ ATmega8

  • 16 Replies
  • 4255 Views
ADC กับ ATmega8
« on: February 05, 2015, 08:09:57 pm »
ขอคำปรึกษาเกี่ยวกับ ADC ของ ATmega8 หน่อยครับ พอดีอ่าน datasheet แล้วสงสัยว่าหลังจาก conversion เสร็จแล้วค่าที่อ่านมาได้จะถูกเก็บไว้ที่ ADCH/ADCL ใน ADLAR ถูกไหมครับ และถ้าเราจะนำค่าที่อ่านได้มาใช้ต่อเนี่ย สามารถเขียนโค้ดในลักษณะใดได้บ้างครับ

ปล. ADC ที่จะใช้คือรับค่ามาจาก infrared distance sensor แล้วจะนำค่าที่อ่านได้ที่ระยะต่างๆมาใช้ครับ

*

Offline skytec

  • *****
  • 1030
  • "จินตนาการสำคัญกว่าความรู้ " --อัลเบิรต ไอสไตน์
    • View Profile
    • R&D , Technical Consultants , Sensor Developer  , Engineering consultants
Re: ADC กับ ATmega8
« Reply #1 on: February 05, 2015, 08:18:41 pm »
ขอคำปรึกษาเกี่ยวกับ ADC ของ ATmega8 หน่อยครับ พอดีอ่าน datasheet แล้วสงสัยว่าหลังจาก conversion เสร็จแล้วค่าที่อ่านมาได้จะถูกเก็บไว้ที่ ADCH/ADCL ใน ADLAR ถูกไหมครับ และถ้าเราจะนำค่าที่อ่านได้มาใช้ต่อเนี่ย สามารถเขียนโค้ดในลักษณะใดได้บ้างครับ

ปล. ADC ที่จะใช้คือรับค่ามาจาก infrared distance sensor แล้วจะนำค่าที่อ่านได้ที่ระยะต่างๆมาใช้ครับ

ผมใช้แบบโง่ๆ เลยครับ คือ ใช้  Arduino  ครับ แล้วเลือกพรอตเป็น ATMEGA8 ครับ เขียนตามตัวอย่างของมันเลย ง่ายดี
"จินตนาการสำคัญกว่าความรู้ ความรู้มีข้อจำกัด จิตนาการไร้ขอบเขต " --อัลเบิร์ต ไอสไตน์

Re: ADC กับ ATmega8
« Reply #2 on: February 05, 2015, 08:27:35 pm »
ถ้าใช้ arduino มันง่ายก็ใช่ครับ ผมลองใช้แล้ว แต่ตัวงานถูกบังคับให้ใช้ ATmeg8 ครับ

*

Offline JENG

  • *****
  • 808
  • รู้ทุกเรื่องเว้นเรื่องจริง
    • View Profile
Re: ADC กับ ATmega8
« Reply #3 on: February 05, 2015, 10:13:46 pm »
Code: [Select]
//analog initial
void analog_initial(void){


    //Set ADC prescalar to 128 - 125KHz sample rate @ 16MHz
    ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);


    //Set ADC prescalar to 64 - 125KHz sample rate @ 8MHz
    //ADCSRA |= (1<<ADPS2)|(1<<ADPS1);




    //ADMUX |= (1<<REFS1);            //Set ADC reference to 2.56v
    ADMUX |= (1<<REFS0);            //Set ADC reference to AVCC
    //ADMUX |= (1<<ADLAR);            //Left adjust ADC result to allow
    //ADCSRA |= (1<<ADFR);            //Set ADC to Free-Running Mode
    ADCSRA |= (1<<ADEN);            //Enable ADC
    //ADCSRA |= (1<<ADSC);            //Start A2D Conversions


}


//analog read
unsigned int analog_read(unsigned char mux_ch){


    ADMUX &= 0b11100000;
    ADMUX |= mux_ch;                //Select ADC Channel ch must be 0-7
    ADCSRA |= (1<<ADSC);            //Start Single conversion
    while(!(ADCSRA&(1<<ADIF)));        //Wait for conversion to complete
    ADCSRA |= (1<<ADIF);            //Clear ADIF by writing one to it


    return ADC;

}
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺

*

Offline az

  • ***
  • 169
    • View Profile
Re: ADC กับ ATmega8
« Reply #4 on: February 05, 2015, 10:14:21 pm »
ขอคำปรึกษาเกี่ยวกับ ADC ของ ATmega8 หน่อยครับ พอดีอ่าน datasheet แล้วสงสัยว่าหลังจาก conversion เสร็จแล้วค่าที่อ่านมาได้จะถูกเก็บไว้ที่ ADCH/ADCL ใน ADLAR ถูกไหมครับ และถ้าเราจะนำค่าที่อ่านได้มาใช้ต่อเนี่ย สามารถเขียนโค้ดในลักษณะใดได้บ้างครับ

ปล. ADC ที่จะใช้คือรับค่ามาจาก infrared distance sensor แล้วจะนำค่าที่อ่านได้ที่ระยะต่างๆมาใช้ครับ

ประกาศตัวแปรมารับค่าจาก port ADC ได้เลยครับ

Code: [Select]
unsigned  w_sensor = ADC;  // ADC คือ port regidter(16 bit) ประกอบด้วย ADCH(8 bit), ADCL(8bit)
ถ้าใช้ 10 bit หลังจะได้ค่า 0 - 1023



ปล. ADLAR คือ การกำหนดว่าจะใช้ 10 bit หน้า หรือ 10 bit หลังครับ
เพราะแสวงหา..  มิใช่เพราะรอคอย
เพราะเชี่ยวชาญ..  มิใช่เพราะโอกาส
เพราะสามารถ..  มิใช่เพราะโชคช่วย
ดังนี้แล้ว "ลิขิตฟ้า  หรือจะสู้มานะตน..."

Re: ADC กับ ATmega8
« Reply #5 on: February 06, 2015, 01:23:51 am »
Code: [Select]
//analog initial
void analog_initial(void){


    //Set ADC prescalar to 128 - 125KHz sample rate @ 16MHz
    ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);


    //Set ADC prescalar to 64 - 125KHz sample rate @ 8MHz
    //ADCSRA |= (1<<ADPS2)|(1<<ADPS1);




    //ADMUX |= (1<<REFS1);            //Set ADC reference to 2.56v
    ADMUX |= (1<<REFS0);            //Set ADC reference to AVCC
    //ADMUX |= (1<<ADLAR);            //Left adjust ADC result to allow
    //ADCSRA |= (1<<ADFR);            //Set ADC to Free-Running Mode
    ADCSRA |= (1<<ADEN);            //Enable ADC
    //ADCSRA |= (1<<ADSC);            //Start A2D Conversions


}


//analog read
unsigned int analog_read(unsigned char mux_ch){


    ADMUX &= 0b11100000;
    ADMUX |= mux_ch;                //Select ADC Channel ch must be 0-7
    ADCSRA |= (1<<ADSC);            //Start Single conversion
    while(!(ADCSRA&(1<<ADIF)));        //Wait for conversion to complete
    ADCSRA |= (1<<ADIF);            //Clear ADIF by writing one to it


    return ADC;

}

ไม่ใช่ว่าบรรทัดก่อน return เนี่ย ต้องใส่ 0 ให้ ADIF หรือครับ

ขอคำปรึกษาเกี่ยวกับ ADC ของ ATmega8 หน่อยครับ พอดีอ่าน datasheet แล้วสงสัยว่าหลังจาก conversion เสร็จแล้วค่าที่อ่านมาได้จะถูกเก็บไว้ที่ ADCH/ADCL ใน ADLAR ถูกไหมครับ และถ้าเราจะนำค่าที่อ่านได้มาใช้ต่อเนี่ย สามารถเขียนโค้ดในลักษณะใดได้บ้างครับ

ปล. ADC ที่จะใช้คือรับค่ามาจาก infrared distance sensor แล้วจะนำค่าที่อ่านได้ที่ระยะต่างๆมาใช้ครับ

ประกาศตัวแปรมารับค่าจาก port ADC ได้เลยครับ

Code: [Select]
unsigned  w_sensor = ADC;  // ADC คือ port regidter(16 bit) ประกอบด้วย ADCH(8 bit), ADCL(8bit)
ถ้าใช้ 10 bit หลังจะได้ค่า 0 - 1023



ปล. ADLAR คือ การกำหนดว่าจะใช้ 10 bit หน้า หรือ 10 bit หลังครับ

อ๋อ คือหลังจากเลือก ADLAR แล้วก็ค่อยมาดูอีกทีว่า แต่ละแบบค่าที่ถูกแปลงแล้วถูกเก็บไว้ที่ ADCH/ADCL bit ไหนบ้างใช่ไหมครับ เช่น ADLAR = 1 ก็จะแบ่งไปเก็บใน ADCH 8 bit และ ADCL 2 bit แบบนี้เข้าใจถูกไหมครับ

*

Offline JENG

  • *****
  • 808
  • รู้ทุกเรื่องเว้นเรื่องจริง
    • View Profile
Re: ADC กับ ATmega8
« Reply #6 on: February 06, 2015, 10:38:53 am »
อ่านเพิ่มเติมจาก data sheet เอาคับ ห้ามอ่านแบบผ่านๆนะ ผมเงิบมาแล้วเรื่อง adc ของ avr น่ะ
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺

Re: ADC กับ ATmega8
« Reply #7 on: February 07, 2015, 03:15:54 am »
อ่านเพิ่มเติมจาก data sheet เอาคับ ห้ามอ่านแบบผ่านๆนะ ผมเงิบมาแล้วเรื่อง adc ของ avr น่ะ

คือใน datasheet เนี่ย ผมอ่านแล้วนะ แต่มันงงอ่ะครับ ก็เลยมาถามเอาให้แน่ใจว่าตัวเองเข้าใจถูกแล้วใช่ไหม ตอนนี้กำลังลองเขียนโปรแกรมเพื่อเช็คไปด้วยอีกทีครับ