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

📄 -Ԧ+--+

📁 LM3S ADC例程多种采样触发方式
💻
字号:
#include  "systemInit.h"
#include  "uartGetPut.h"
#include  <adc.h>
#include  <stdio.h>


#define  ADCSequEnable          ADCSequenceEnable
#define  ADCSequDisable         ADCSequenceDisable
#define  ADCSequConfig          ADCSequenceConfigure
#define  ADCSequStepConfig      ADCSequenceStepConfigure
#define  ADCSequDataGet         ADCSequenceDataGet


//  定义KEY
#define  KEY_PERIPH             SYSCTL_PERIPH_GPIOD
#define  KEY_PORT               GPIO_PORTD_BASE
#define  KEY_PIN                GPIO_PIN_1


tBoolean ADC_EndFlag = false;                               //  定义ADC转换结束的标志


//  ADC外部事件触发初始化(硬件电路上要短接PB4与PB5)
void adcExtTrigInit(void)
{
    SysCtlPeriEnable(KEY_PERIPH);                           //  使能KEY所在的GPIO端口
    GPIOPinTypeIn(KEY_PORT, KEY_PIN);                       //  设置KEY所在管脚为输入

    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB);                  //  使能GPIOB端口

    GPIOPinTypeOut(GPIO_PORTB_BASE, GPIO_PIN_5);            //  设置PB5管脚为输出
    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0x00);        //  PB5 = 0
    GPIOPinTypeIn(GPIO_PORTB_BASE, GPIO_PIN_4);             //  设置PB4管脚为输入

    GPIOIntTypeSet(GPIO_PORTB_BASE,                         //  设置PB4的中断类型
                   GPIO_PIN_4,
                   GPIO_FALLING_EDGE);

    GPIOPinIntEnable(GPIO_PORTB_BASE, GPIO_PIN_4);          //  使能PB4管脚中断
    IntEnable(INT_GPIOB);                                   //  使能GPIOB端口中断
}


//  等待按键
void keyWait(void)
{
    while (GPIOPinRead(KEY_PORT, KEY_PIN));                 //  等待KEY按下
    SysCtlDelay(10 * (TheSysClock / 3000));                 //  延时,以消除按键抖动
    while (!GPIOPinRead(KEY_PORT, KEY_PIN));                //  等待KEY抬起
    SysCtlDelay(10 * (TheSysClock / 3000));                 //  延时,以消除松键抖动
}


//  产生一个短脉冲(PB5管脚)
void pulseGen(void)
{
    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0xFF);
    SysCtlDelay(1 * (TheSysClock / 3000));
    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0x00);
}


//  ADC初始化
void adcInit(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_ADC);                    //  使能ADC模块
    SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS);             //  设置ADC采样率
    ADCSequDisable(ADC_BASE, 0);                            //  配置前先禁止采样序列

    //  采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级
    ADCSequConfig(ADC_BASE, 0, ADC_TRIGGER_EXTERNAL, 0);

    //  采样步进设置:ADC基址,采样序列编号,步值,通道设置
    ADCSequStepConfig(ADC_BASE, 0, 0, ADC_CTL_CH0 |
                                      ADC_CTL_END |
                                      ADC_CTL_IE);

    ADCIntEnable(ADC_BASE, 0);                              //  使能ADC中断
    IntEnable(INT_ADC0);                                    //  使能ADC采样序列中断

    ADCSequEnable(ADC_BASE, 0);                             //  使能采样序列
}


//  ADC采样
unsigned long adcSample(void)
{
    unsigned long ulValue;

    while (!ADC_EndFlag);                                   //  等待采样结束
    ADC_EndFlag = false;                                    //  清除ADC采样结束标志
    ADCSequDataGet(ADC_BASE, 0, &ulValue);                  //  读取ADC转换结果

    return(ulValue);
}


//  主函数(程序入口)
int main(void)
{
    unsigned long ulValue;
    char cBuf[30];

    jtagWait();                                             //  防止JTAG失效,重要!
    clockInit();                                            //  时钟初始化:PLL,20MHz
    uartInit();                                             //  UART初始化
    adcExtTrigInit();                                       //  ADC外部事件触发初始化
    adcInit();                                              //  ADC初始化
    IntMasterEnable();                                      //  使能处理器中断

    for (;;)
    {
        keyWait();                                          //  等待按键
        pulseGen();                                         //  产生PB5到PB4的触发脉冲
        ulValue = adcSample();                              //  ADC采样
        ulValue = (ulValue * 3000) / 1024;                  //  转换成电压值
        sprintf(cBuf, "ADC0 = %ld(mV)\r\n", ulValue);       //  采样值格式化为电压值
        uartPuts(cBuf);                                     //  通过UART输出电压值
    }
}


//  GPIOB的中断服务函数
void GPIO_Port_B_ISR(void)
{
    unsigned long ulStatus;

    ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true);     //  读取中断状态
    GPIOPinIntClear(GPIO_PORTB_BASE, ulStatus);             //  清除中断状态,重要

    if (ulStatus & GPIO_PIN_4)                              //  如果PB4的中断状态有效
    {
    }
}


//  ADC采样序列0的中断
void ADC_Sequence_0_ISR(void)
{
    unsigned long ulStatus;

    ulStatus = ADCIntStatus(ADC_BASE, 0, true);             //  读取中断状态
    ADCIntClear(ADC_BASE, 0);                               //  清除中断状态,重要

    if (ulStatus != 0)                                      //  如果中断状态有效
    {
        ADC_EndFlag = true;                                 //  置位ADC采样结束标志
    }
}

⌨️ 快捷键说明

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