adc.c

来自「NXP LPC系列AMR7的开发程序源码(LCD」· C语言 代码 · 共 153 行

C
153
字号
/*****************************************************************************
 *   adc.c:  ADC module file for NXP LPC29xx Family Microprocessors
 *
 *   Copyright(C) 2007, NXP Semiconductor
 *   All rights reserved.
 *
 *   History
 *   2007.08.15  ver 1.00    Prelimnary version, first Release
 *
******************************************************************************/
#include "LPC29xx.h"                        /* LPC29xx definitions */
#include "type.h"
#include "irq.h"
#include "target.h"
#include "adc.h"

volatile DWORD ADC1Value[ITERATION][ADC_NUM];
volatile DWORD ADC1ValueAverage[ADC_NUM];
volatile DWORD ADC1IntDone = 0;
volatile DWORD ADC1Iteration = 0;

/******************************************************************************
** Function name:		ADC1Handler
**
** Descriptions:		ADC1 interrupt handler
**
** parameters:			None
** Returned value:		None
** 
******************************************************************************/
void ADC1_Handler (void)
{
  DWORD regVal;
  
  regVal = ADC1_INT_STATUS;
  if ( regVal & (0x01<<0) )	/* check EOS error first */
  {
	ADC1_Stop();
	if ( ADC1Iteration >= ITERATION )
	{
	  ADC1Iteration = 0;
	}
	ADC1Value[ADC1Iteration][0] = ADC1_ACD0 & 0x3FF;
	ADC1Value[ADC1Iteration][1] = ADC1_ACD1 & 0x3FF;
	ADC1Value[ADC1Iteration][2] = ADC1_ACD2 & 0x3FF;
	ADC1Value[ADC1Iteration][3] = ADC1_ACD3 & 0x3FF;
	ADC1Value[ADC1Iteration][4] = ADC1_ACD4 & 0x3FF;
	ADC1Value[ADC1Iteration][5] = ADC1_ACD5 & 0x3FF;
	ADC1Value[ADC1Iteration][6] = ADC1_ACD6 & 0x3FF;
	ADC1Value[ADC1Iteration][7] = ADC1_ACD7 & 0x3FF;
	ADC1Iteration++;
	ADC1IntDone = 1;
	ADC1_INT_CLR_STATUS |= (0x01<<0);
  }
    
  if ( regVal & (0x01<<1) )	/* ADC2 Compare */
  {
	ADC1_INT_CLR_STATUS |= (0x01<<1);
  }
  return;
}

/*****************************************************************************
** Function name:		ADC1_Init
**
** Descriptions:		initialize ADC channel
**
** parameters:			None
** Returned value:		None
** 
*****************************************************************************/
void ADC1_Init( void )
{
  DWORD regVal;

  ADC1_Stop();
  
  /* all the related pins are set to ADC inputs, AD1.0~7 */
  /* ADC1 channel 0~7 */
  SFSP0_8 = (0x00<<2)|(0x01<<0);	/* Analog input, func. 1. */
  SFSP0_9 = (0x00<<2)|(0x01<<0);	
  SFSP0_10 = (0x00<<2)|(0x01<<0);	
  SFSP0_11 = (0x00<<2)|(0x01<<0);	
  SFSP0_12 = (0x00<<2)|(0x01<<0);	
  SFSP0_13 = (0x00<<2)|(0x01<<0);	
  SFSP0_14 = (0x00<<2)|(0x01<<0);	
  SFSP0_15 = (0x00<<2)|(0x01<<0);

  ADC1_ACC0 = 0x0A;			/* AD1 channel 0~7 are 10-bit resolution */
  ADC1_ACC1 = 0x0A;
  ADC1_ACC2 = 0x0A;
  ADC1_ACC3 = 0x0A;
  ADC1_ACC4 = 0x0A;
  ADC1_ACC5 = 0x0A;
  ADC1_ACC6 = 0x0A;
  ADC1_ACC7 = 0x0A;
  
  regVal = ADC1_CONFIG;
  regVal &= ~(0x01<<0);			/* single scan. */
//  regVal |= (0x01<<0);			/* continuous scan. */
  /* Positive and negative edge of MSCSS timer(START3). */  
  ADC1_CONFIG = regVal|(0x1<<14)|(0x1<<15);

  install_irq( 17, (void *)ADC1_Handler, HIGHEST_PRIORITY );
  EnableIntReq_IRQ( 17, ACTIVE_HIGH, HIGHEST_PRIORITY );

  /* Enable both Comp/match and EOS interrupts on ADC1 */ 
  ADC1_INT_SET_ENABLE = 0x03;
  return;
}

/*****************************************************************************
** Function name:		ADC1_Start
**
** Descriptions:		Start ADC channel
**
** parameters:			None
** Returned value:		None
** 
*****************************************************************************/
void ADC1_Start( void )
{
  if ( ADC1_STATUS & 0x01 )
  {
	/* Stop ADC first if conversion in progress */
	ADC1_Stop();
  }	
  ADC1_CTRL = ((0x01<<0)|(0x01<<2));	/* Set both start and update bits. */
  return;
}

/*****************************************************************************
** Function name:		ADC1_Stop
**
** Descriptions:		Stop ADC channel
**
** parameters:			None
** Returned value:		None
** 
*****************************************************************************/
void ADC1_Stop( void )
{
  /* if in continuous mode and conversion is progress,
  wait until it finishes. */
  while ( (ADC1_STATUS & 0x01)&&(ADC1_CONFIG & 0x01) );		
  ADC1_CTRL = (0x01<<1);
  return;
}

/*********************************************************************************
**                            End Of File
*********************************************************************************/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?