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**** 2455560 points
Other Parts Discussed in Thread: TMS320F280025C

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1317661/tms320f280025c-adc-not-read-the-value

器件型号:TMS320F280025C

您好!

    我使用的是 TMS320F280025C 控制器。 我需要使用 PWM 作为触发源来读取 ADC 数据。 我需要使用通道 A3。 我使用过本身一样的演示代码、该代码是为通道 C1提供的。 在该代码中、我对通道 A3进行了相关更改。 我在适当的地方突出显示了我所做的更改。 我无法读取 ADC 值。 请仔细检查一下代码、知道错误在哪里。

代码:-

//
//包含的文件
//
#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);
__中断无效 ADcA3ISR (空);

//
//主菜单
//
空 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;  
EDIS;

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

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

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


// EALLOW;

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

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


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

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

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

// InitTempSensor (3.3f);

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

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

// initADC -用于配置 ADCC 并为其加电的函数。
//
void initADC (void)
{
//
//将 VREF 设置为内部
//
SetVREF ( ADC_ADCA 、ADC_EXTERNAL、ADC_VREF3P3);

EALLOW;

//
//将 ADCCLK 分频器设置为/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 = 3; // SOC0将转换引脚 C12

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

AdcaRegs。 ADCINTSEL3N4 位。 INT3SEL = 0;// SOC0结束将设置 INT3标志
AdcaRegs。 ADCINTSEL3N4 位。 INT3E = 1;//启用 INT3标志
AdcaRegs.ADCINTFLGCLR.bit。 ADCINT3 = 1;//确保 INT3标志被清除

EDIS;



__中断无效 ADcA3ISR (空)
{

isrCount++;

如果(isrCount==1000)
{
isrCount=0;

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

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

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

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

谢谢!

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

    您好、Sayali、

    你在 ADC ISR 中调用 GetTemperatureC()。 这不是温度传感器读取。

    另外,这与几个月前回答的一个问题类似。  如果您需要修改示例以读取不同的通道、则只需修改 CHSEL。 我在这篇文章中对此进行了澄清: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1282359/tms320f280025c-adc-interrupt-is-not-triggered/4865754#4865754

    此外、对于简单的 ADC 通道读取、这不是您应该使用的示例。 您应该正在使用 adc_ex1_soc_epwm.c。

    中断号和输入通道号彼此无关。 如果仍不清楚、请考虑通读器件技术参考手册的 ADC 一章。 具体而言、请查看标题为"SOC 工作原理"和"EOC 和中断工作"的章节。

    此致、
    伊袋

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

    您提到在 PIE 矢量表中、需要 ADCA1_INT 条目。 相应地、代码中将按照以下格式进行更改。

    PieVectTable.ADCA1_INT =&AdcA1ISR;  
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;

    IER |= M_INT1;

    不过、查看表3-3 (饼图通道映射)中的技术参考时、发现 INT10.3用于 ADCA3。 因此、我在代码中进行了如下更改:-

    PieVectTable.ADCA3_INT =&AdcA3ISR;  
    PieCtrlRegs.PIEIER10.bit.INTx3 = 1;

    IER |= M_INT10;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    据观察,INT10.3用于 ADCA3。 [/报价]

    这里的 ADCA3指的是 ADCA 中断3。 这与引脚 A3完全不同。 中断和引脚完全不同、而且并不相同。