⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adcdrv.c

📁 文中是一份lpc2210器件ADC驱动程序
💻 C
字号:
/****************************************************************************
************************   Driver for ADC of lpc2210  **********************

*     ADC driver for lpc2210
******************************************************************************/
#include "adcDrv.h"
#include "LPC2294.h"
#include "error.h"
/**
 * set the working mode of ADC, all the channel will be the same mode.
 *
 * @param pADCConfig         pointer to ADC configuration data object
 *                           null pointer if want to use current configuration
 * @return                   0 on success, others are error
 **/

 const uint8 VolTable[] = {
    55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,
    75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94
};

const uint16 VolValAdc[] = {
	568,579,589,599,610,620,630,641,651,661,672,682,692,703,713,723,734,744,754,765,
    775,785,796,806,816,827,837,847,858,868,878,889,899,909,920,930,940,951,961,971
};


void ADCInit(void)
{
    LPC_ADCConfig_t tADCCfg;
    tADCCfg.i32ClkDiv = (Fpclk/4000000 -1);
    tADCCfg.i32Burst = LPC_ADC_NO_BURST;
    tADCCfg.i32Clks = LPC_ADC_CLOCK_10;
    tADCCfg.i32PowerDown = LPC_ADC_POWER_ON;
    tADCCfg.i32TestMode = LPC_ADC_NO_TEST;
    tADCCfg.i32WhenToStart = LPC_ADC_STOP_CONVERT;
    tADCCfg.i32Edge = LPC_ADC_FALLING_EDGE;

    LPC_ADCConfig(TempChannel, &tADCCfg);
    LPC_ADCConfig(VolChannel, (LPC_ADCConfig_t *)0);    //use the same configuration as channel 0

    LPC_ADCPowerCtrl(1);                               // power on the ADC module
}

 
extern int LPC_ADCConfig( int8 adcPortNr,  LPC_ADCConfig_t* pADCConfig)
{
    int status;
    status = 0;
    switch(adcPortNr)                                  //set pinpad as ADC connect
    {
        case LPC_ADC_CHANNEL_0:
            PINSEL1 &= (~(0x03 << 22));
            PINSEL1 |= (0x01 << 22);
            break;
        case LPC_ADC_CHANNEL_1:
            PINSEL1 &= (~(0x03 << 24));
            PINSEL1 |= (0x01 << 24);
            break;
        case LPC_ADC_CHANNEL_2:
            PINSEL1 &= (~(0x03 << 26));
            PINSEL1 |= (0x01 << 26);
            break;
        case LPC_ADC_CHANNEL_3:
            PINSEL1 &= (~(0x03 << 28));
            PINSEL1 |= (0x01 << 28);
            break;
        case LPC_ADC_CHANNEL_4:
            PINSEL2 |= (0x01 << 21);
            break;
        case LPC_ADC_CHANNEL_5:
            PINSEL2 |= (0x01 << 22);
            break;
        case LPC_ADC_CHANNEL_6:
            PINSEL2 |= (0x01 << 6);
            break;
        case LPC_ADC_CHANNEL_7:
            PINSEL2 |= (0x01 << 7);
            break;
        default:
            status = EDevice;
            break;
    }
    if(pADCConfig != (LPC_ADCConfig_t *)0)
    {
        ADCR = ((pADCConfig->i32ClkDiv)<<8) |
                pADCConfig->i32Burst |
                pADCConfig->i32Clks |
                pADCConfig->i32PowerDown |
                pADCConfig->i32TestMode |
                pADCConfig->i32WhenToStart |
                pADCConfig->i32Edge ;
    }
    return status;
}


/**
 * Select one channel to convert and return the result.
 *
 * @param adcPortNr             the selected channel
 *
 * @return                      the result of ADC convert from the selected channel,
 *                              only bit9 ~ bit0 valid, and some error happened if return -1.
 **/
extern int LPC_ADCRead(int8 adcPortNr)
{
    int AdcResult;

    ADCR &= (~0x0ff);
    ADCR |= adcPortNr;

    ADCR |= LPC_ADC_START_CONVERT;
    while((ADDR & LPC_ADC_CONVERT_DONE) == 0);          //wait for conversion complete

    ADCR |= LPC_ADC_START_CONVERT;
    while((ADDR & LPC_ADC_CONVERT_DONE) == 0);          //wait for conversion complete

    AdcResult = ADDR;
    AdcResult = (AdcResult >> 6) & 0x3ff;                   //get the valid bits

    return AdcResult;
}

/**
 * control the power of the ADC module.
 *
 * @param i8IfPowerOn            1 -- power on
 *                               0 -- power off
 *
 * @return
 *
 **/
extern int LPC_ADCPowerCtrl( int8 i8IfPowerOn)
{
    if(i8IfPowerOn)
    {
        ADCR |= (1 << 21);
    }
    else
    {
        ADCR &= (~(1 << 21));
    }
    return 0;
}

int GetBatteryVol(void)
{
    volatile uint32 BatVol;
    uint32 tmp0,tmp1;
    BatVol = LPC_ADCRead(VolChannel);

    __asm
    {
        mov tmp0, #967
        mul  tmp1, tmp0,BatVol
    }

    return tmp1;
}

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

⌨️ 快捷键说明

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