F280049M外部GPIO触发ADC数据采集

4 篇文章 0 订阅

新手小白,刚刚开始学习DSP,将自己的过程记录下来。(自用记录,防止遗忘!)

1. 首先要了解GPIO模块

查阅手册可知,ADC转换的外部触发有以下5种,故若采用GPIO触发,需用到XINT2引脚。

– S/W - software immediate start
– All ePWMs - ADCSOC A or B
– GPIO XINT2
– CPU Timers 0/1/2
– ADCINT1/2

 同时得知280049M的XINT2号引脚与input5 相连。因此在设置触发时,只需要将XINT2进行相关配置即可产生出发。

 2. 在确认完相关手册信息后,再对GPIO进行初始化配置,结合上一章软件触发的程序进行修改即可。

下面是对GPIO15号引脚进行直接输入高电平触发(该程序可初步实现上电一次出发一次,但存在抖动等因素,具有非准确性,其实可以加一个延时函数,消抖动即可。后面本人采用了两个GPIO直接进行拉高拉低上电,解放双手。。。)

#include "driverlib.h"
#include "device.h"

uint16_t a1[1024] = {0};
uint16_t a2[1024] = {0};
uint16_t a3[1024] = {0};
uint16_t a4[1024] = {0};
uint16_t a5[1024] = {0};
uint16_t a6[1024] = {0};
uint16_t i = 0 ,j = 0 ;
uint16_t p = 0 ,q = 0 ;
uint16_t u = 0 ,v = 0 ;

void initADCs(void);
void initADCSOCs(void);
void initExintGPIO(void);

int testCount=0;
interrupt void xint2ISR(void)
{
    testCount++;

    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
void main(void)
{
    Device_init();                                       //初始化设备时钟和外设
    Device_initGPIO();                                   //禁用引脚锁并启用内部上拉
    Interrupt_initModule();                              //初始化PIE并清除PIE寄存器。禁用CPU中断。
    Interrupt_initVectorTable();                         //用指向shell中断的指针初始化PIE向量表ISR服务程序。

    // 初始化ADC,初始化SOC
    initADCs();
    initADCSOCs();
    initExintGPIO();

    EINT;                                                //打开全局中断
    ERTM;                                                //当使用仿真器调试时 开启DEBUG中断


    while(1)
    {
        // 等待ADC转换完成,并清除中断标志位
        while(ADC_getInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1) == false)
        {
        }
        ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);

        while(ADC_getInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1)== false)
        {
        }
        ADC_clearInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1);

        while(ADC_getInterruptStatus(ADCC_BASE, ADC_INT_NUMBER1) == false)
        {
        }
        ADC_clearInterruptStatus(ADCC_BASE, ADC_INT_NUMBER1);

        a1[i++] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);
//        if(i >= sizeof(a1) / sizeof(a1[0]))  //(400/4=100)同i>=100,此方法不用修改两处,只用将定义数组处的数组内数据随意修改即可。
//存储结果
        if(i >= 1024)
        {
            i=0;
        }

        a2[j++] = ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER1);
        if(j >= 1024)
        {
            j=0;
        }

        a3[p++] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER0);
        if(p >= 1024)
        {
            p=0;
        }

        a4[q++] = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER1);
        if(q >= 1024)
        {
            q=0;
        }

        a5[u++] = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER0);
        if(u >= 1024)
        {
            u=0;
        }

        a6[v++] = ADC_readResult(ADCCRESULT_BASE, ADC_SOC_NUMBER1);
        if(v >= 1024)
        {
            v=0;
        }
    }
}

// 初始化ADC
void initADCs(void)
{
    // ADC使用片内参考3.3V
    // Setup VREF as internal
    ADC_setVREF(ADCA_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
    ADC_setVREF(ADCB_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);
    ADC_setVREF(ADCC_BASE, ADC_REFERENCE_INTERNAL, ADC_REFERENCE_3_3V);

    // ADC时钟4分频
    // Set ADCCLK divider to /4
    ADC_setPrescaler(ADCA_BASE, ADC_CLK_DIV_4_0);
    ADC_setPrescaler(ADCB_BASE, ADC_CLK_DIV_4_0);
    ADC_setPrescaler(ADCC_BASE, ADC_CLK_DIV_4_0);

    // 设置转换结束时触发中断
    // Set pulse positions to late
    ADC_setInterruptPulseMode(ADCA_BASE, ADC_PULSE_END_OF_CONV);
    ADC_setInterruptPulseMode(ADCB_BASE, ADC_PULSE_END_OF_CONV);
    ADC_setInterruptPulseMode(ADCC_BASE, ADC_PULSE_END_OF_CONV);

    // 启动AD并延迟1ms
    // Power up the ADCs and then delay for 1 ms
    ADC_enableConverter(ADCA_BASE);
    ADC_enableConverter(ADCB_BASE);
    ADC_enableConverter(ADCC_BASE);
    DEVICE_DELAY_US(1000);  //在ADC转换前要延迟一段时间
}

void initExintGPIO(void)
{

    Interrupt_register(INT_XINT2, &xint2ISR);
    Interrupt_enable(INT_XINT2);                      // 使能 XINT2 中断

    GPIO_setPinConfig(GPIO_15_GPIO15);             // GPIO15 复用为GPIO功能
    GPIO_setDirectionMode(15, GPIO_DIR_MODE_IN);   // GPIO15 设置为输入
    GPIO_setQualificationMode(15, GPIO_QUAL_SYNC);  //GPIO15 的时钟周期同系统时钟周期

    GPIO_setInterruptPin(15, GPIO_INT_XINT2);                          // XINT2 connected to GPIO15
//    GPIO_setInterruptType(GPIO_INT_XINT2, GPIO_INT_TYPE_FALLING_EDGE);  //下降沿
    GPIO_setInterruptType(GPIO_INT_XINT2, GPIO_INT_TYPE_RISING_EDGE);  // XINT2 对应GPIO 15 ,上升沿触发(因为电压起初是低电平)
    GPIO_enableInterrupt(GPIO_INT_XINT2);                              //使能XINT2 中断

}


// 初始化ADCSOC
void initADCSOCs(void)
{
    // 采样窗口持续10个系统时钟
    // - SOC0 will convert pin A0 with a sample window of 10 SYSCLK cycles.
    // - SOC1 will convert pin A1 with a sample window of 10 SYSCLK cycles.
    //
//    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN0, 10);
//    ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN1, 10);
      ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_GPIO, ADC_CH_ADCIN0, 10);
      ADC_setupSOC(ADCA_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_GPIO, ADC_CH_ADCIN1, 10);

    // 设置中断为ADCINT1,并启用
    // Set SOC1 to set the interrupt 1 flag. Enable the interrupt and make
    // sure its flag is cleared.
    ADC_setInterruptSource(ADCA_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER1);
    ADC_enableInterrupt(ADCA_BASE, ADC_INT_NUMBER1);
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);

    // 采样窗口持续10个系统时钟
    // - SOC0 will convert pin B0 with a sample window of 10 SYSCLK cycles.
    // - SOC1 will convert pin B1 with a sample window of 10 SYSCLK cycles.
    //
//    ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN0, 10);
//    ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN1, 10);
    ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_GPIO, ADC_CH_ADCIN0, 10);
    ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_GPIO, ADC_CH_ADCIN1, 10);
    // 设置中断为ADCINT1,并启用
    // Set SOC1 to set the interrupt 1 flag. Enable the interrupt and make
    // sure its flag is cleared.
    ADC_setInterruptSource(ADCB_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER1);
    ADC_enableInterrupt(ADCB_BASE, ADC_INT_NUMBER1);
    ADC_clearInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1);


//    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN15, 10);
//    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_SW_ONLY, ADC_CH_ADCIN15, 10);
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_GPIO, ADC_CH_ADCIN15, 10);
    ADC_setupSOC(ADCC_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_GPIO, ADC_CH_ADCIN15, 10);
    // 设置中断为ADCINT1,并启用
    // Set SOC1 to set the interrupt 1 flag. Enable the interrupt and make
    // sure its flag is cleared.
    ADC_setInterruptSource(ADCC_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER1);
    ADC_enableInterrupt(ADCC_BASE, ADC_INT_NUMBER1);
    ADC_clearInterruptStatus(ADCC_BASE, ADC_INT_NUMBER1);
}

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,针对您的问题,我可以为您提供以下回答: TMS320F280049是一款数字信号处理器,用于嵌入式控制应用。要配置TMS320F280049ADC模块,您需要进行以下步骤: 1. 配置ADC模块的采样频率和分辨率。这可以通过设置ADC模块的控制寄存器来实现。例如,您可以使用ADCTRL1寄存器设置采样频率和分辨率。 2. 配置ADC模块的输入通道。您可以使用MUX寄存器来选择要采样的输入通道。 3. 配置ADC模块的转换模式。ADC模块支持单次转换模式和循环转换模式。您可以使用ADCTRL2寄存器来选择转换模式。 4. 启动ADC转换。您可以使用ADCTRL2寄存器中的SOC位来启动ADC转换。 在配置ADC模块时,请确保参考电压和输入电压之间的关系正确。另外,请注意ADC模块的噪声和线性度等特性,以便正确地采样和处理模拟信号。 希望这些信息能对您有所帮助! ### 回答2: TMS320F280049是德州仪器的一款高性能数字信号处理器(DSP)产品。要配置其内部ADC,首先需要设置ADC的参考电压和采样精度。 参考电压决定了ADC的输入范围,可以通过设置内部参考电压或外部参考电压来实现。在程序中,可以使用内部寄存器来设置参考电压的值。 采样精度决定了ADC将模拟信号转换为数字信号的精确度。可以通过设置采样速率和分辨率来控制。采样速率是指ADC每秒钟可以进行的采样次数,分辨率是指ADC可以分辨的最小电压变化。 配置ADC时,需要设置通道数和采样时间。通道数决定了可以同时进行转换的信号数量。可以通过设置ADC的控制寄存器来选择转换的通道。采样时间是指ADC对输入信号进行采样的时间长度,可以通过设置ADC的采样控制寄存器来调整。 配置完成后,可以使用ADC的中断功能进行数据的采集和处理。ADC可以通过设置中断寄存器来触发中断请求,当数据转换完成后,可以在中断服务程序中获取转换结果并进行处理。 总之,要在TMS320F280049上配置ADC,需要设置参考电压、采样精度、通道数和采样时间,并可以通过中断功能进行数据的采集和处理。配置过程中需要注意使用寄存器进行设置,并确保正确地配置和连接外部电路以满足应用需求。 ### 回答3: TMS320F280049是Texas Instruments(德州仪器)推出的一款32位固定点数字信号处理器(DSP)微控制器。在该芯片上配置ADC(模拟-数字转换器)可以实现模拟信号的数字化处理。 首先,我们需要了解TMS320F280049ADC模块特性和引脚配置。该芯片拥有12位精度的ADC模块,可以通过GPIO引脚连接外部模拟信号源。使用器件参考手册中提供的引脚映射表,将所需的模拟输入信号连接到正确的引脚上。 接下来,我们需要设置ADC模块的相关寄存器以配置其工作模式和采样率。可以使用设备的示例代码或到官方网站下载对应的软件开发工具包(SDK)来获得示例代码。 在配置ADC之前,我们需要设置ADC的时钟源和分频系数。可以使用寄存器来配置时钟源和分频系数,以便设定适当的采样率和转换精度。 接下来,需要配置ADC的工作模式和触发方式。可以通过设置控制寄存器来选择连续模式或单次模式,以及手动触发或自动触发模式。此外,还可以配置结果的对齐方式和精度。 配置完成后,可以通过读取结果寄存器来获取ADC的转换结果。可以使用中断机制或轮询方式读取结果。读取结果后,可以根据需要进行处理或进一步的数字信号处理。 最后,在使用ADC之后,需要及时清除可能存在的中断标志位,并根据需要禁用ADC模块。这可以通过操作相应的寄存器来完成。 总之,通过对TMS320F280049进行ADC配置,我们可以实现模拟信号的数字化处理,为后续的数字信号处理和算法运算提供基础。需要根据具体的应用需求和芯片特性进行适当的配置和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值