สงสัยเรื่องADCของLPC1769 ครับ

Started by opiumus, February 06, 2013, 03:22:51 PM

Previous topic - Next topic

opiumus

#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 ต้องเขียนยังไง
อยากให้พี่ๆในบอร์ดช่วยแนะนำด้วยนะครับ ผมเพิ่งจะหัดทำ ยังทำอะไรไม่เป็นเลย

firmware.c

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 ที่เท่าไหร่บ้าง
IAR Embedded Workbench for ARM
AVR-Studio + AVR-GCC
CodeBlocks + MinGw
CodeBlocks + Gtk+

MicroMan


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