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

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

*

Offline firmware.c

  • *****
  • 181
  • Firmware Design
    • View Profile
Re: สงสัยเรื่องADCของLPC1769 ครับ
« Reply #1 on: February 06, 2013, 03:30:59 pm »
Code: [Select]
if (ticks++ >= 99) 
                   /* Set Clock1s to 1 every 1 second    */
  {
    ticks    = 0;
    clock_1s = 1;
  }

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

Code: [Select]
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+

Re: สงสัยเรื่องADCของLPC1769 ครับ
« Reply #2 on: February 07, 2013, 08:52:28 am »
Code: [Select]
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 ด้วย



Code: [Select]
AD_last = (LPC_ADC->ADGDR>>4) & 0xFFF;      /* Read Conversion Result             */

ส่วนตรงนี้ก็เป็นการอ่านผลการ convert ค่าของ ADC จากรีจิสเตอร์ โดยเลื่อนผลลัพธ์ไปทางขวา 4ตำแหน่งบิต เนื่องจากผลลัพธ์
ที่เก็บในรีจิสเตอร์ ADGDR ไม่ได้เรียงลำดับข้อมูลไว้ที่ตำแหน่งเริ่มต้นของบิต 0

Re: สงสัยเรื่องADCของLPC1769 ครับ
« Reply #3 on: February 07, 2013, 03:40:20 pm »
ขอบคุณครับ ^ ^