Electoday 2025

ไมโครคอนโทรลเลอร์ => ARM Processors => Topic started by: opiumus on February 06, 2013, 03:22:51 PM

Title: สงสัยเรื่องADCของLPC1769 ครับ
Post by: opiumus on February 06, 2013, 03:22:51 PM
#include "LPC17xx.H"                    /* LPC17xx definitions                */

unsigned short AD_last;                 /* Last converted value               */
unsigned char  clock_1s;                /* Flag activated each second         */

/*----------------------------------------------------------------------------
  SysTick IRQ: Executed periodically
*----------------------------------------------------------------------------*/
void SysTick_Handler (void) {           /* SysTick Interrupt Handler (10ms)   */
  static unsigned long ticks;

 if (ticks++ >= 99)                    /* Set Clock1s to 1 every 1 second    */
  {
    ticks    = 0;
    clock_1s = 1;
  }

  LPC_ADC->ADCR |=  (1<<24);            /* Start A/D Conversion               */
}

/*----------------------------------------------------------------------------
  A/D IRQ: Executed when A/D Conversion is done
*----------------------------------------------------------------------------*/
void ADC_IRQHandler(void) {

  AD_last = (LPC_ADC->ADGDR>>4) & 0xFFF;      /* Read Conversion Result             */

}


ผมไม่เข้าใจหลักการของบรรทัดที่hilightไว้อะครับ
ส่วนแรกไม่เข้าใจว่านับยังไง
ส่วนที่สอง ไม่เข้าใจว่า ADGDR>>4 ความหมายคืออะไร
อีกอย่างช่วยแนะนำด้วยครับว่าถ้าต้องการจะเขียนADC 3 channel ต้องเขียนยังไง
อยากให้พี่ๆในบอร์ดช่วยแนะนำด้วยนะครับ ผมเพิ่งจะหัดทำ ยังทำอะไรไม่เป็นเลย
Title: Re: สงสัยเรื่องADCของLPC1769 ครับ
Post by: firmware.c on February 06, 2013, 03:30:59 PM
if (ticks++ >= 99) 
                   /* Set Clock1s to 1 every 1 second    */
  {
    ticks    = 0;
    clock_1s = 1;
  }

ไม่น่าเกี่ยวกับ ADC

AD_last = (LPC_ADC->ADGDR>>4) & 0xFFF;
      /* Read Conversion Result             */

คำตอบน่าจะอยู่ใน datasheet ของ LPC1769 ครับ ลองดูว่า ADC register มีทั้งหมดกี่ bit bit ที่เท่าไหร่บ้าง
Title: Re: สงสัยเรื่องADCของLPC1769 ครับ
Post by: MicroMan on February 07, 2013, 08:52:28 AM

if (ticks++ >= 99)                    /* Set Clock1s to 1 every 1 second    */
  {
    ticks    = 0;
    clock_1s = 1;
  }


ตรงส่วนนี้ก็เป็นการนับ counter จำนวนครั้งที่เกิดการ Overflow ของ System Tick ซึ่งกำหนดไว้ให้ tick ทุกๆ 10mS
เพื่อให้นับครบ 1วินาที และในทุกๆ 10mS ที่เกิดการ Overflow ก็จะมีการสั่ง start convert ADC ด้วย




AD_last = (LPC_ADC->ADGDR>>4) & 0xFFF;      /* Read Conversion Result             */


ส่วนตรงนี้ก็เป็นการอ่านผลการ convert ค่าของ ADC จากรีจิสเตอร์ โดยเลื่อนผลลัพธ์ไปทางขวา 4ตำแหน่งบิต เนื่องจากผลลัพธ์
ที่เก็บในรีจิสเตอร์ ADGDR ไม่ได้เรียงลำดับข้อมูลไว้ที่ตำแหน่งเริ่มต้นของบิต 0
Title: Re: สงสัยเรื่องADCของLPC1769 ครับ
Post by: opiumus on February 07, 2013, 03:40:20 PM
ขอบคุณครับ ^ ^