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.

[参考译文] TMS320F28P550SJ:TMS320F28P550SJ9控制器中的 ADC 采样读取问题

Guru**** 2478765 points
Other Parts Discussed in Thread: SYSCONFIG, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1468557/tms320f28p550sj-adc-samples-read-problem-in-tms320f28p550sj9-controller

器件型号:TMS320F28P550SJ
主题中讨论的其他器件:SysConfigC2000WARE

工具与软件:

尊敬的团队:

如果我使用驱动程序库通过 SysConfig 执行相同操作、则以下 ADC 示例中的代码无法在寄存器配置中正常运行。

请查找 C 代码以供参考

//########################################################################################################################################################################
//
//文件:adc_ex2_epwm_tempsensor.c
//
//标题:采样温度传感器并转换为温度
//
//! \addtogroup bitfield_example_list
//!

ADC 温度传感器转换


//!
//! 此示例将 ePWM 设置为定期触发 ADC。 。
//! ADC 转换到温度传感器的内部连接、
//! 然后、通过调用将其解释为温度
//! GetTemperatureC 函数。
//!
//! 程序运行后、内存将包含:\n
//! -\b sensorSample \b:来自温度传感器的原始读数。 \n
//! -\b sensorTemp \b :传感器样本的解释为 a
//! 单位为摄氏度。
//!
//
//############################################################################################################################################################################################
//
//
//
// C2000Ware v5.04.00.00
//
//版权所有(C) 2024德州仪器(TI)公司- http://www.ti.com
//
//以源代码和二进制形式重新分发和使用、无论有无
//修改、但前提是满足以下条件
//已满足:
//
//重新分发源代码必须保留上述版权
//通知、此条件列表和以下免责声明。
//
//以二进制形式重新分发必须复制上述版权
//通知、此条件列表和中的以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//既不是德州仪器(TI)公司的名称、也不是的名称
//其贡献者可用于认可或推广衍生产品
//未经事先书面许可、从本软件中获取。
//
//此软件由版权所有者和贡献者提供
//"按原样"以及任何明示或暗示的保证、包括但不包括
//仅限于对适销性和适用性的暗示保证
//不考虑特定目的。 在任何情况下均不得享有版权
//所有者或贡献者对任何直接、间接、附带、
//特殊、示例性或后果性损害(包括但不包括)
/仅限于采购替代商品或服务;不使用、
//数据或利润;或业务中断)、无论其原因是什么
//责任理论,无论是合同,严格责任,或侵权
//(包括疏忽或其他)以任何方式产生的使用
//此软件、即使被告知此类损坏的可能性。
//$
//############################################################################################################################################################################################

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

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

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

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

//
// Main (主菜单)
//
void main (void)

//
//初始化器件时钟和外设
//
InitSysCtrl();

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

//
//禁用 CPU 中断
//
颜色;

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

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

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

//
//映射 ISR 函数
//
EALLOW;
PieVectTable.ADCC1_INT =&adcC1ISR;// ADCC 中断1的函数
EDIS;

//
//配置 ADC 并为其上电
//
initADC();

//
//配置 ePWM
//
initEPWM();

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


EALLOW;

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

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

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

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

InitTempSensor (3.3f);

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

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

}
}

//
// initADC -用于配置 ADCC 并为其加电的函数。
//
void initADC (void)

//
//将 VREF 设置为内部
//
SetVREF (ADC_ADCC、ADC_INTERNAL、ADC_VREF3P3);

EALLOW;

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

//
//将脉冲位置设置为延迟 EOC
//
AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1;

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

DELAY_US (1000);
}

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

EALLOW;

EPwm1Regs.ETSEL.bit.SOCAEN = 0;// Disable SOC on a group (禁用组上的 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;

AdccRegs.ADCSOC0CTL.bit.CHSEL = 0xC;// SOC0将转换引脚 C12

AdccRegs.ADCSOC0CTL.bit.ACQPS = 45;//采样窗口为10个 SYSCLK 周期
AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// Trigger on ePWM1 SOCA

AdccRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0 end of SOC0将设置 INT1标志
AdccRegs.ADCINTSEL1N2.bit.INT1E = 1;// Enable INT1 flag (启用 INT1标志)
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除

EDIS;
}

//
// adcC1ISR - ADC C 中断1 ISR
//
__interrupt void adcC1ISR (void)

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

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

//
//检查是否发生了溢出
//
if (1 = AdccRegs.ADCINTOVF.bit.ADCINT1)

AdccRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;// Clear INT1 overflow flag flag (ADccRegs.ADCINTOVFCLR.bit.ADCINT1 = 1)
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;// Clear INT1 flag (清除 INT1标志)
}

//
//确认中断
//
PieCtrlRegs.PIEACK.all = PIEACK_Group1;
}


//
//文件结尾
//

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

    您好、Rakesh。

    我可能认为以下函数位没有在上面的代码中进行配置(它启用 TS 输出到 ADC)。  

    ASysCtl_enableTemperatureSensor ();

    这是 SysConfig 示例中正确的情况。  

    在 代码中的"//将 ADCCLK divider 设置为/4"行上方添加下面的行应使其正常运行。  

    "AnalogSubsysRegs.TSNSCTL.bit.enable=1;"  

    BR、

    Nilesh