This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F280025C:未触发 ADC 中断

Guru**** 2394295 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1282359/tms320f280025c-adc-interrupt-is-not-triggered

器件型号:TMS320F280025C

大家好!

   我想在 ISR 中读取 ADC 电压、但不知何故、isrCount 没有增加。

我使用的是 ADCA3/C5   

使用 epwm1 SOCA...触发 ADC

注意:我运行演示代码"adc_ex2_epwm_tempsensor"。 此代码正常运行、并且   isrCount 也会增加。

我正在为您的参考号附加一个代码。 请检查。

//
//包含的文件
//
#include "F28x_project.h"

//
//定义
//
#define results_buffer_size 256

//
//全局变量
//
uint16_t sensorSample = 0;
uint16_t isrCount = 0;
int16_t sensorTemp = 0;

//
//函数原型
//
void initADC (void);
void initEPWM (void);
void initADCSOC (void);
__interrupt void AdcA3ISR (void);

//
//主菜单
//
空 main (void)
{
//
//初始化设备时钟和外设
//
InitSysCtrl();

//
//初始化 GPIO
//
InitGpio();

//
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态是所有 PIE 中断都被禁用并且标志
//被清除。
//
InitPieCtrl();

//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
InitPieVectTable();

//
//映射 ISR 函数
//
EALLOW;
PieVectTable.ADCA3_INT =&AdcA3ISR;// Adca 中断1的函数
EDIS;

//
//配置 ADC 并为其加电
//
initadc();

//
//配置 ePWM
//
initEPwm();

//
//为通道1上的 EPWM 触发转换设置 ADC
//
initADCSOC();


EALLOW;

//
//启用 PIE 中断
//
PieCtrlRegs.PIEIER10.bit.INTx3 = 1;

//
//同步 ePWM
//
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;

//
//启用全局中断和更高优先级的实时调试事件:
//
IER |= M_INT10;//启用组10中断

EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//InitTempSensor (3.3f);

//
//启动 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//解冻、并进入向上计数模式

//
//等待 ePWM 会引起 ADC 转换,然后会引起中断,
//这将填充结果缓冲区,最终设置 bufferFull
//标记
//
while (1)
{

//
// initADC -用于配置和启动 Adca 的函数。
//
void initADC (void)
{
//
//将 VREF 设置为内部
//
SetVREF (ADC_ADCA、ADC_INTERNAL、ADC_VREF3P3);

EALLOW;

//
//将 AdcaLK 分频器设置为/4
//
AdcaRegs.ADCCTL2.bit.prescale = 6;

//
//将脉冲位置设置为 Late EOC
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//
//给 ADC 上电,然后延迟1ms
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
EDIS;

DELAY_US (1000);

//
// initEPWM -用于配置 ePWM1以生成 SOC 的函数。
//
void initEPWM (void)
{
EALLOW;

EPwm1Regs.ETSEL.bit.SOCAEN = 0;//在组上禁用 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在向上计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第1个事件时生成脉冲

EPwm1Regs.CMPA.bit.CMPA = 0x0800;//将 A 值设置为2048个计数
EPwm1Regs.TBPRD = 0x1000;//将周期设置为4096个计数

EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器

EDIS;

//
// initADCSOC -用于配置 ADCA 的 SOC0由 ePWM1触发的函数。
//
void initADCSOC (void)
{
//
//选择要转换的通道以及转换结束标志
//
EALLOW;

AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0x03;// SOC0将转换引脚 A3

AdcaRegs.ADCSOC0CTL.bit.ACQPS = 45;//采样窗口为10个 SYSCLK 周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//针对 ePWM1 SOCA 触发

AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除

EDIS;


__interrupt void AdcA3ISR (void)
{

isrCount++;
//
//将最新结果添加到缓冲区中
// ADCRESULT0是 SOC0的结果寄存器
sensorSample = AdcaResultRegs.ADCRESULT0;

//
//清除中断标志
//
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

//
//检查是否发生了溢出
//
if (1 == AdcaRegs.ADCINTOVF.bit.ADCINT1)
{
AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;//清除 INT1溢出标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志

//
//确认中断
//
PieCtrlRegs.PIEACK.all = PIEACK_group10;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sayali、

    Unknown 说:
    //
    //映射 ISR 函数
    //
    EALLOW;
    PieVectTable.ADCA3_INT =&AdcA3ISR;// Adca 中断1的函数
    EDIS;

    您 已启用 ADCA 中断1、但 ISR 映射到 ADCA 中断3。

    应为:

    PieVectTable.ADCA1_INT = &AdcA1ISR;

    您 应该将 ISR 重命名为 ADCA1 ISR。  中断不是 ADC 输入通道;在这种情况下、两者混合在一起。

    伊袋

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好  

    正如我在第一行中提到的、我将在此代码中使用 ADCA3。 在注释部分1被错误地写入而不是3。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在上面的要点是您已经将中断编号与 ADC 通道混用。 ADCA3是一个通道(输入引脚)。 通道仅在 ADCSOCxCTL.CHSEL 中进行配置。 每个 ADC 有四个中断(INT1-4)、这些是您映射到 PIE 矢量表的中断。 在本例中、ADCA3_INT 实际上意味着:ADC-A 模块、中断信号编号3 (共4个)。

    评论实际上是 正确的根据你的意图。

    伊袋

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ibukun:

    对于中断、我仍然有一点困惑。 如果我想   在上生成中断(信号名称是:a3,引脚号12 (80 QFP 封装),您能为我写代码吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Sayali:

    我在我的第一篇文章中提到了代码修复:

    • PieVectTable 中的条目需要为 ADCA1_INT
    • ISR 需要重命名为 ADCA1ISR

    这样就可以解决您的问题。

    只要知道引脚编号(A3)和中断编号(INT1)是 它们是相同的、并且彼此无关。 如果不清楚这一点、请查看器件 TRM 中的 ADC 一章、以获得有关 ADC 中断如何工作的更多说明。

    伊袋