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.

[参考译文] CCS/TMS320F28377S:可以帮我混合代码吗?

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/606316/ccs-tms320f28377s-can-you-help-me-to-mix-the-code

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

我想同时查看温度值和 ADC 值的值。

我已经尝试混合、但它出错、所以以下是我的代码:

//######################################################################################################################
//
////文件:adc_soc_ePWM_tempsensor_cpu01.c
//
//标题:采样温度传感器并转换为 F2837xS 的温度。
//
//! addtogroup cpu01_example_list
//! 

ADC 温度传感器转换(ADC_SoC_ePWM_tempsensor)

//! //! 此示例设置 EPWM 以定期触发 ADC。 //! ADC 将内部连接转换为温度传感器、 //! 然后通过调用 //! GetTemperatureC 函数。 //! //! 程序运行后、内存将包含:\n //! -\b sensorSample \b:温度传感器的原始读数。 n //! -\b sensorTemp \b:传感器样本的解释为 a //! 以摄氏度为单位。 //! // //########################################################################################################################## //$TI 发行版:F2837xS 支持库 V200 $// $发行 日期:星期二6月21日13:52:16 CDT 2016 $// 版权所有:版权所有(C) 2014-2016德州仪器(TI)公司-// http://www.ti.com/ 保留所有权利$ //############################################################################################################ // //包含的文件 // #include "F28x_Project.h" // 函数原型 // void ConfigureADC (void); void ConfigureEPWM (void); void SetupADCepwm (void); interrupt void adca1_ISR (void); // Globals // uint16 sensorSample; void / int16 sensorStep 1;// intsensorStep 1。 初始化系统控制: // PLL、看门狗、启用外设时钟 //此示例函数位于 F2837xS_SYSCTRL.c 文件中。 // InitSysCtrl(); // //步骤2。 初始化 GPIO: //此示例函数位于 F2837xS_GPIO.c 文件中, //说明了如何将 GPIO 设置为其默认状态。 // InitGpio();//针对本例跳过 // //步骤3。 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 // Dint; // //将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE 中断并 清除标志//。 //此函数位于 F2837xS_PIECTRL.c 文件中。 // InitPieCtrl(); // 禁用 CPU 中断并清除所有 CPU 中断标志: // IER = 0x0000; IFR = 0x0000; // //初始化 PIE 矢量表,其中包含指向 shell 中断 //服务例程(service routines,ISR)的指针。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 //可以在 F2837xS_DefaultIsr.c 中找到 shell ISR 例程 //此函数可在 F2837xS_PieVect.c 中找到 // InitPieVectTable(); // //映射 ISR 函数 // EALLOW; PieVectTable.ADCA1_INT =&adca1_ISR;//针对 ADCA 中断1的函数 EDIS; // //配置 ADC 并为其加电 // ConfigureADC(); // 初始化温度传感器 //注意:如果使用3.0V 以外的 VREFHI 电压,则参数需要更改 // InitTempSensor (3.0); // 配置 ePWM // // ConfigureEPWM (); // //设置 ADC 以实现温度传感器上的 ePWM 触发转换 // SetupADCepwm(); // 启用全局中断和更高优先级的实时调试事件: // IER |= M_INT1;//启用组1中断 EINT;//启用全局中断 INTM ERTM;//启用全局实时中断 DBGM // 启用 PIE 中断 // PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // 同步 ePWM // EALLOW; // CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1; //执行 { EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式 asm (" ESTOP0"); }while (1);*/ // //启动 ePWM // //// EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA // EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结,并输入向上计数模式 // //在循环中无限地进行转换 // 同时写入 ADC/配置1 / ADC///针对电源配置 ADC A 和 ADC B // void ConfigureADC (void) { EALLOW; // //写入配置 // AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4 AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE); // //将脉冲位置设置为晚期 // AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1; // //为 ADC 加电 // AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; // //延迟1ms 以允许 ADC 加电时间 // DELAY_US (1000); EDIS; } // // ConfigureEPWM -配置 ePWM SOC 和比较值 // void ConfigureEPWM (void) { EALLOW; // //假设 ePWM 时钟已启用 // EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲 EPwm1Regs.CMPA.bit.CMPA = 0x0800; //将比较 A 值设置为2048个计数 EPwm1Regs.TBPRD = 0x1000; //将周期设置为4096个计数 EPwm1Regs.TBCTL.bit.CTRMODE = 3; //冻结计数器 EDIS; } // // SetupADCepwm -配置 ADC ePWM 采集窗口和触发 // void SetupADCepwm (void) { uint16 tempsensor_acqps; tempsensor_acqps = 139;//温度传感器需要至少700ns //采集时间 // //选择要转换的通道和转换结束标志 // EALLOW; AdcaRegs.ADCSOC0CTL.bit.CHSEL = 13;//SOC0将转换为内部 //连接 A13 J5:44 AdcaRegs.ADCSOC0CTL.bit.ACQPS = tempsensor_acqps;//采样窗口为100 //SYSCLK 周期 AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发 AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志 AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志 AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除 EDIS; } // // adca1_ISR -读取温度 ISR // 中断 void adca1_ISR (void) { sensorSample = AdcResultRegs.ADCRESULT0; sensorTemp = GetTemperatureC (sensorSample); AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志 PieCtrlRegs.PIEACK.all = PIEACK_Group1; } // //文件结束 //

我想读取温度值、而不是 下面代码的 AdcaResult1:

//######################################################################################################################
//
//文件:adc_soc_software_cpu01.c
//
//标题:F2837xS 的 ADC 软件触发。
//
//! addtogroup cpu01_example_list
//!

ADC SOC 软件组(ADC_SoC_SOFTWARE)


//!
//! 此示例根据软件转换 ADCA 和 ADCB 上的一些电压
//! 触发。
//!
//! 程序运行后、存储器将包含:
//!
//! -\b AdcaResult0 \b:引脚 A0\n 上电压的数字表示
//! -\b 结果1:引脚 A1上电压的数字表示\n
//
//!
//! 注意:两个 ADC 的软件触发顺序发生、因此
//! 两个 ADC 将异步运行。
//!
//
//######################################################################################################################
//$TI 版本:F2837xS 支持库 V200 $
//$Release Date:Tue Jun 21 13:52:16 CDT 2016 $
//版权所有:版权所有(C) 2014-2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################

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

//
//函数原型
//
void ConfigureADC (void);
void SetupADCSoftware (void);

//
//全局
//
uint16 AdcaResult0;
uint16 AdcaResult1;
//uint16 AdcbResult0;
//uint16 AdcbResult1;
float Voutput=0、rawValue;

void main (void)

//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xS_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xS_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
InitGpio();

//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xS_PIECTRL.c 文件中。
//
InitPieCtrl();

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

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xS_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xS_PieVect.c 中找到
//
InitPieVectTable();

//
//启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

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

//
//设置用于软件转换的 ADC
//
SetupADCSoftware();

//
//循环无限地进行转换
//
操作

//
//convert、等待完成并存储结果
//通过软件 ADCA 立即开始转换
//
AdcaRegs.ADCSOCFRC1.ALL = 0x0003;//SOC0和 SOC1

//
//通过软件 ADCB 立即开始转换
//
//AdcbRegs.ADCSOCFRC1.ALL = 0x0003;//SOC0和 SOC1

//
//等待 ADCA 完成,然后等待确认标志
//
while (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 0);
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

//
//等待 ADCB 完成,然后确认标志
//
// while (AdcbRegs.ADCINTFlG.bit.ADCINT1 =0);
// AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

//
//存储结果
//
AdcaResult0 = AdcaResultRegs.ADCRESULT0;
AdcaResult1 = AdcaResultRegs.ADCRESULT1;
//AdcbResult0 = AdcbResultRegs.ADCRESULT0;
//AdcbResult1 = AdcbResultRegs.ADCRESULT1;

rawValue=(float) 3.0/4096;
voutput=(float)(3.0/4096)* AdcaResult0;
//
//此时,转换结果存储在中
//AdcResult0、AdcResult1、AdcbResult0和 AdcbResult1
//

//
//软件断点,再次点击运行以获取更新的转换
//
//asm (" ESTOP0");

} while (1);

//
// ConfigureADC -写入 ADC 配置并为两者加电
// ADC A 和 ADC B
//
空配置 ADC (空)

EALLOW;

//
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
//AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
//AdcSetMode (ADC_ADCB、ADC_Resolution 12位、ADC_SIGNALMODE_SINGLE);

//
//将脉冲位置设置为晚期
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
//AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//
//为 ADC 加电
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);

EDIS;

//
// SetupADCSoftware -设置 ADC 通道和采集窗口
//
空 SetupADCSoftware (空)

uint16 acqps;

//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//
if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)

acqps = 14;//75ns

否则、//分辨率为16位

acqps = 63;//320ns

//
//选择要转换的通道和转换结束标志
//ADCA
//
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;//SOC0将转换引脚 A0 J3:27
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
//1个 SYSCLK 周期
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC1将转换引脚 A1 J3:29
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
//1个 SYSCLK 周期
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 1;// SOC1结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
//ADCB
/*AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;//SOC0将转换引脚 B0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
//1个 SYSCLK 周期
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC1将转换引脚 B1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
//1个 SYSCLK 周期
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 1;// SOC1的末尾将设置 INT1标志
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除*/
EDIS;


//
//文件结束
//

提前感谢您、

卡纳特  

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

    您能更详细地介绍一下该程序是如何失败的? 哪些部件不工作?

    我确实注意到、在上面的代码中、您似乎正在将 ADC 设置为由 PWM 触发、但绝不会将 CTRMODE 的值更改为取消冻结 PWM。

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

    我只想在单击"播放"按钮的同时查看 ADC 和温度的值。

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

    好的、那么您正在尝试修改您发布的第二个代码片段、以便 AdcResult1包含温度传感器读数、而 AdcResult0包含其他信号的样本、对吧?

    嗯,你需要像第一个代码片段包含的那样添加一个到 InitTempSensor()的调用。 另请注意、第一个代码片段将 CHSEL 域配置为13、因为通道 A13在内部连接到温度传感器。 您将需要在 ADCSOC1CTL.CHSEL 中执行相同的操作。 AdcaResult1应包含原始温度传感器读数,然后使用 GetTemperatureC()将其转换为摄氏度。

    您想弄清楚这一点吗?

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这是我的观点。 因此、我将根据您的建议再次尝试修改、然后我将告诉您结果。

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

    我现在可以这么做

    非常感谢您、
    卡纳特