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/TMS320F28027:TMS320F28027函数 void AdcOffsetSelfCal()问题

Guru**** 2382480 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/748242/ccs-tms320f28027-tms320f28027-function-void-adcoffsetselfcal-problem

器件型号:TMS320F28027
Thread 中讨论的其他器件:controlSUITEC2000WARE

工具/软件:Code Composer Studio

您好! 我有以下问题、我初始化 ADC 以打开内置温度传感器、但当我进入 AdcOffsetSelfCal ()函数时、我遇到了问题。  当我进入 uint16 AdcConversion (void)函数时、我到达 while 循环(索引<SampleSize)、它运行一次、然后循环再次启动、但程序在 while 条件(AdcRegs.ADCINTFlG.bit.ADCINT1 =0)上停止、不能继续。

void AdcOffsetSelfCal()

uint16 AdcConvean;
EALLOW;
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;//选择内部基准模式
AdcRegs.ADCCTL1.bit.VREFLOCONV = 1;//选择 B5上的 VREFLO 内部连接
AdcChanSelect (13);//为所有 SOC 选择通道 B5
AdcRegs.ADCOFFTRIM.bit.OFFTRIM = 80;//应用人工偏移(+80)以补偿可能驻留在 ADC 内核中的负偏移
AdcConvean = AdcConversion();//在 VREFLO 上捕捉 ADC 转换
AdcRegs.ADCOFFTRIM.bit.OFFTRIM = 80 - AdcConvRean;//将 offtrim 寄存器设置为新值(即删除参数偏移(+80)并创建偏移误差的二补码)
AdcRegs.ADCCTL1.bit.VREFLOCONV = 0;//在 B5上选择外部 ADCIN5输入引脚
EDIS;

/* AdcChanSelect-
此函数通过将所有 SOC 通道选择设置为单个通道来选择要转换的 ADC 通道。

*重要*此函数将覆盖以前的 SOC 通道选择设置。 建议保存
先前的设置。
*
空 AdcChanSelect (uint16 ch_no)

AdcRegs.ADCSOC0CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC1CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC2CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC3CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC4CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC5CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC6CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC7CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC8CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC9CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC10CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC11CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC12CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC13CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC14CTL.bit.CHSEL=ch_no;
AdcRegs.ADCSOC15CTL.bit.CHSEL=ch_no;
}//结束 AdcChanSelect

/* AdcConversion -
此函数启动多个 ADC 转换并返回平均值。 它使用 ADCINT1和 ADCINT2
SOC0-7和 SOC8-15之间的"乒乓"、称为"乒乓"采样。

*重要*此函数将覆盖以前的 ADC 设置。 建议保存以前的设置。
*
uint16 AdcConversion (空)

uint16 index、SampleSize、mean、ACQPS_value;
uint32和;

索引= 0;//将索引初始化为0
SampleSize = 256;//将样本大小设置为256 (**注:样本大小必须是2^x 的倍数,其中整数>= 4)
总和= 0;//将总和设置为0
平均值= 999;//将平均值初始化为已知值

//将 ADC 采样窗口设置为所需的值(采样窗口= ACQPS + 1)
ACQPS_VALUE = 6;
AdcRegs.ADCSOC0CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC1CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC2CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC3CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC4CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC5CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC6CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC7CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC8CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC9CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC10CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC11CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC12CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC13CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC14CTL.bit.ACQPS = ACQPS_VALUE;
AdcRegs.ADCSOC15CTL.bit.ACQPS = ACQPS_VALUE;


//启用乒乓采样

//启用 ADCINT1和 ADCINT2
AdcRegs.INTSEL1N2.bit.INT1E = 1;
AdcRegs.INTSEL1N2.bit.INT2E = 1;

//禁用 ADCINT1和 ADCINT2的连续采样
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;
AdcRegs.INTSEL1N2.bit.INT2CONT = 0;

AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;//ADCINT 在转换结束时触发

//设置 ADCINT1和 ADCINT2触发源
AdcRegs.INTSEL1N2.bit.INT1SEL = 6;//EOC6触发 ADCINT1
AdcRegs.INTSEL1N2.bit.INT2SEL = 14;//EOC14触发 ADCINT2

//设置每个 SOC 的 ADCINT 触发源
AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 2;//ADCINT2启动 SOC0-7
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 2;
AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 2;
AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 2;
AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 2;
AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 2;
AdcRegs.ADCINTSOCSEL1.bit.SOC6 = 2;
AdcRegs.ADCINTSOCSEL1.bit.SOC7 = 2;
AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 1;//ADCINT1启动 SOC8-15
AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC11 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC13 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 1;
AdcRegs.ADCINTSOCSEL2.bit.SOC15 = 1;

DELAY_US (ADC_USDELAY);//转换 ADC 通道之前的延迟


//ADC 转换

AdcRegs.ADCSOCFRC1.ALL = 0x00FF;//强制启动 SOC0-7以开始乒乓采样

while (index < SampleSize){

//等待 ADCINT1触发,然后将 ADCRESULT0-7寄存器相加
while (AdcRegs.ADCINTFlG.bit.ADCINT1 = 0){}             程序在这里停止
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//必须清除 ADCINT1标志,因为 INT1CONT = 0
sum += AdcResult.ADCRESULT0;
sum += AdcResult.ADCRESULT1;
sum += AdcResult.ADCRESULT2;
sum += AdcResult.ADCRESULT3;
sum += AdcResult.ADCRESULT4;
sum += AdcResult.ADCRESULT5;
sum += AdcResult.ADCRESULT6;
//等待 SOC9转换开始,这为 SOC7转换结果提供了时间
while (AdcRegs.ADCSOCFLG1.bit.SOC9 ==1){}
sum += AdcResult.ADCRESULT7;

//等待 ADCINT2被触发,然后将 ADCRESULT8-15寄存器相加
while (AdcRegs.ADCINTFlG.bit.ADCINT2 ==0){}
AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;//必须清除 ADCINT2标志、因为 INT2CONT = 0
sum += AdcResult.ADCRESULT8;
sum += AdcResult.ADCRESULT9;
sum += AdcResult.ADCRESULT10;
sum += AdcResult.ADCRESULT11;
sum += AdcResult.ADCRESULT12;
sum += AdcResult.ADCRESULT13;
sum += AdcResult.ADCRESULT14;
//等待 SOC1转换开始,这为 SOC15转换结果提供了时间
while (AdcRegs.ADCSOCFLG1.bit.SOC1 ==1){}
sum += AdcResult.ADCRESULT15;

index+=16;

}//结束数据收集

//禁用 ADCINT1和 ADCINT2以停止乒乓采样
AdcRegs.INTSEL1N2.bit.INT1E = 0;
AdcRegs.INTSEL1N2.bit.INT2E = 0;

while (AdcRegs.ADCSOCFLG1.all!= 0){}//等待任何挂起的 SOC 完成

//清除所有挂起的中断
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
AdcRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
AdcRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;
AdcRegs.ADCINTOVFCLR.bit.ADCINT2 = 1;

//将 RR 指针重置为32、以便下一个 SOC 为 SOC0
AdcRegs.SOCPRICTL.bit.SOCPRIORITY = 1;
while (AdcRegs.SOCPRICTL.bit.SOCPRIORITY!= 1);
AdcRegs.SOCPRICTL.bit.SOCPRIORITY = 0;
while (AdcRegs.SOCPRICTL.bit.SOCPRIORITY!= 0);

平均值=总和/采样大小;//计算平均 ADC 采样值

返回平均值;//返回平均值

}//End AdcConversion

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

    安德烈

    您是否能够从 C2000Ware 或 controlSUITE 中运行未经修改的 ADC_SoC 和 ADC_TEMP_SENSOR 示例?  

    Tommy

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试过它、但我在编写固件时遇到了某种错误。 我使用 ADCINT4 ADC 和温度测量(不同的固件)运行代码、一切正常。 但是,当您在其中添加函数 void AdcOffsetSelfCal ()时,程序不会退出上面指定的周期。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Andrey Chernyshev"]我尝试过它,但我在编写固件时遇到了某种错误。

    您能澄清这一陈述吗? 我不清楚 C2000Ware 示例是否在您的设置中正常工作。 这一信息对于我确定您是否遇到软件或硬件问题非常重要。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我编译 Example_2802xAdcTempSensor.c 项目时、我得到以下错误:
    "说明资源路径位置类型
    此工程是使用当前未安装的编译器版本创建的- 6.4.2 [c2000]。 请参阅“帮助>安装新软件”并选择“代码生成工具更新”,以检查此编译器是否可通过 CCS 更新获得。 访问 CCS App Center 以获取最新的编译器支持。 或 "="">software-dl.ti.com/.../downloads"> 下载 并安装编译器 for CCS> Build> Compilers。 Example_2802xAdcTempSensor 属性
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    安德烈

    听起来您可能在使用新的 CCS 安装和 controlSUITE 示例。

    如果是这种情况、您有两个选项:

    选项1:从 C2000Ware 下载并使用示例、该软件是 controlSUITE 的后继产品。  C2000Ware Current 会定期接收更新、以便与最新的 CCS 工具版本配合使用。  controlSUITE 不再接收更新。

    选项2:从 CGT 下载页面安装 C2000 6.4.x 代码生成工具(CGT 编译 器)、并更新示例工程属性以使用旧版编译器。

    Tommy

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

    自上次更新以来已经有一段时间了。 我假设您能够解决您的问题。 如果情况并非如此,请拒绝此解决方案并回复此主题。 如果此主题已锁定、请制作一个描述问题当前状态的新主题。

    Tommy