Thread 中讨论的其他器件:controlSUITE、 C2000WARE
工具/软件: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