AnsweredAssumed Answered

用LPC824的AD采集电压数据,采集出来的数值为0x0000,bang一下吗?

Question asked by dove geng on Jul 18, 2017
Latest reply on Jul 24, 2017 by jeremyzhou
int main (void)
{
  volatile uint32_t data;
 unsigned char i;
 unsigned int addr_sum,temp;
 uint32_t current_clkdiv, val, temp_data, n;
    SystemInit();   /* ³õʼ»¯Ä¿±ê°å£¬ÇÐÎðɾ³ý       */
    GPIOInit();     /* GPIO³õʼ»¯                   */
    UARTInit();    /* UART³õʼ»¯                   */
  UART1Init();   /* UART³õʼ»¯                   */
 WDTInit();      /* WDT³õʼ»¯                    */
 SCTInit ();
 DIR_INIT();
 DIR_OFF();
 SetLedState(0,0,0,0);
 myDelay(1);
 initvalue();
 
 LPC_GPIO_PORT->SET0  = 0x00822000;     // P0.27, P0.16 to P0.13
// LPC_GPIO_PORT->SET0  |= 0x00822000; 
  LPC_GPIO_PORT->DIR0 &= 0xFF7DDFFF;     // P0.27, P0.16 to outpu
 
  
 LPC_SYSCON->PDRUNCFG &= ~(ADC_PD);
//  LPC_SYSCON->PRESETCTRL &= (ADC_RST_N);
//  LPC_SYSCON->PRESETCTRL |= ~(ADC_RST_N);
//  LPC_SYSCON->SYSAHBCLKCTRL |= (ADC | GPIO | SWM);
 LPC_SYSCON->SYSAHBCLKCTRL |= (ADC);
 
 
  LPC_SWM->PINENABLE0 &= ~(ADC_3|ADC_9|ADC_10); // Fixed pin analog functions enabled
//  LPC_SWM->PINENABLE0 &= ~(ADC_3);
// LPC_SWM->PINENABLE0 |= (ADC_1|ADC_2|ADC_4|ADC_5|ADC_6|ADC_7|ADC_8|ADC_11); // ??AD3-11AD????

  LPC_ADC->INTEN = (1<<SEQA_INTEN)  |
                   (1<<SEQB_INTEN)  |
                   (0<<OVR_INTEN)   |
                   (0<<ADCMPINTEN0) |
                   (0<<ADCMPINTEN1) |
                   (0<<ADCMPINTEN2) |
                   (0<<ADCMPINTEN3) |
                   (0<<ADCMPINTEN4) |
                   (0<<ADCMPINTEN5) |
                   (0<<ADCMPINTEN6) |
                   (0<<ADCMPINTEN7) |
                   (0<<ADCMPINTEN8) |
                   (0<<ADCMPINTEN9) |
                   (0<<ADCMPINTEN10)|
                   (0<<ADCMPINTEN11);
 
  LPC_ADC->TRM &= ~(1<<ADC_VRANGE); // '0' for high voltage
 
  current_clkdiv = (SystemCoreClock / 100000) - 1;
 LPC_ADC->CTRL = (1UL << ADC_CALMODE) | (current_clkdiv & 0xFF);
 while ((LPC_ADC->CTRL & (1UL << ADC_CALMODE)) != 0);

 
//  current_seqa_ctrl |= LOGIC_HIGH<<ADC_TRIGGER;    // Use for software-only triggering
//  current_seqb_ctrl |= LOGIC_HIGH<<ADC_TRIGGER;    // Use for software-only triggering

  // Enable ADC interrupts in the NVIC
  NVIC_EnableIRQ(ADC_SEQA_IRQn);
 
  while(1)
  {

  LPC_ADC->SEQA_CTRL = current_seqa_ctrl; 
 LPC_ADC->SEQA_CTRL &= ~(0xFFF);
 LPC_ADC->SEQA_CTRL |= (1UL << 9);
  
  //¿ªÆôAD
 LPC_ADC->SEQA_CTRL |= ((1UL << ADC_START) | (1UL << ADC_SEQ_ENA));
 do
 {
  data = LPC_ADC->SEQA_GDAT;  // ????
 } while ((data & (1UL << 31)) == 1); // ??????
   //¹Ø±Õ
 LPC_ADC->SEQA_CTRL &= ~(1UL << ADC_SEQ_ENA);
 
         DIR_ON();
       myDelay (500);
          LPC_USART0->TXDAT=((data >> 4) & 0xfff)>>8;
       while(!(LPC_USART0->STAT&0x08));
          LPC_USART0->TXDAT=((data >> 4) & 0xfff);
       while(!(LPC_USART0->STAT&0x08));
          DIR_OFF();
       
      }
    }

Outcomes