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