主题中讨论的其他器件:C2000WARE
无效
AdcConversion_run (int * conv)
{
EALLOW;
AdcRegs.INTSEL1N2.bit.INT1E = 1;
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcRegs.INTSEL1N2.bit.INT1SEL = 5;// EOC5触发 ADCINT1
//强制启动 SOC0-5以开始乒乓采样
//
AdcRegs.ADCSOCFRC1.ALL = 0x003F;
//
//等待 ADCINT1触发,然后将 ADCRESULT0-5寄存器相加
//
while (AdcRegs.ADCINTFlG.bit.ADCINT1 = 0)
{
}
//
//必须清除 ADCINT1标志,因为 INT1CONT = 0
//
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
conv[0]=(int) AdcResult.ADCRESULT0;
conv[1]=(int) AdcResult.ADCRESULT1;
conv[2]=(int) AdcResult.ADCRESULT2;
conv[3]=(int)AdcResult.ADCRESULT3;
conv[4]=(int) AdcResult.ADCRESULT4;
Conv[5]=(int) AdcResult.ADCRESULT5;
//
//禁用 ADCINT1 以停止
//
AdcRegs.INTSEL1N2.bit.INT1E = 0;
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
AdcRegs.ADCINTOVFCLR.bit.ADCINT1 = 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);
EDIS;
}
无效
AdcChanSelect_run()
{
EALLOW;
AdcRegs.ADCSOC0CTL.bit.CHSEL=3;
AdcRegs.ADCSOC1CTL.bit.CHSEL=11;
AdcRegs.ADCSOC2CTL.bit.CHSEL=4;
AdcRegs.ADCSOC3CTL.bit.CHSEL=12;
AdcRegs.ADCSOC4CTL.bit.CHSEL=5;
AdcRegs.ADCSOC5CTL.bit.CHSEL=13;
uint16 ACQPS_value = 50;
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.INTSEL1N2.bit.INT1E = 1;
// AdcRegs.INTSEL1N2.bit.INT2E = 1;
//
//禁用 ADCINT1和 ADCINT2的连续采样
//
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;
// AdcRegs.INTSEL1N2.bit.INT2CONT = 0;
//
//在转换结束时触发 ADCINT
//
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//
//设置 ADCINT1和 ADCINT2触发源
//
AdcRegs.INTSEL1N2.bit.INT1SEL = 5;// EOC6触发 ADCINT1
// AdcRegs.INTSEL1N2.bit.INT2SEL = 14;// EOC14触发 ADCINT2
//
//设置每个 SOC 的 ADCINT 触发源
//
AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 0;// ADCINT2启动 SOC0-7
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC6 = 0;
AdcRegs.ADCINTSOCSEL1.bit.SOC7 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 0;// ADCINT1启动 SOC8-15
AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC11 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC13 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 0;
AdcRegs.ADCINTSOCSEL2.bit.SOC15 = 0;
DELAY_US (ADC_USDELAY);//转换 ADC 通道之前的延迟
EDIS;
}
无效
main (空)
{
int conv[6];
//
//*重要*
// Device_cal 函数、此函数复制 TI 的 ADC 校准值
//将 OTP 保留到 ADCREFSEL 和 ADCOFFTRIM 寄存器中、发生
//自动存储在引导 ROM 中。 如果引导 ROM 代码在期间被绕过
//在调试过程中,必须为 ADC 调用以下函数
//功能。 ADC 的时钟必须为
//在调用此函数之前启用。
//请参阅器件数据手册和/或 ADC 参考
//手册以了解更多信息。
//
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
(*Device_cal)();
EDIS;
EALLOW;
//
//要给 ADC 加电,应首先设置 ADCENCLK 位以启用
//时钟、然后加电带隙、参考电路、
//和 ADC 内核。 在执行第一次转换之前、必须有5ms 的延迟
//在加电后观察以给所有模拟电路加电时间
//并趋稳
//
//
//请注意,要使以下延迟功能正常运行,请执行
// F2806x_Examples.h 文件中的 cpu_rate define 语句必须
//包含正确的 CPU 时钟周期(以纳秒为单位)。
//
EALLOW;
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;//电源 ADC BG
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;//电源基准
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;//电源 ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;//选择内部 BG
EDIS;
DELAY_US (ADC_USDELAY);//转换 ADC 通道之前的延迟
EALLOW;
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1;
EDIS;
DELAY_US (ADC_USDELAY);//转换 ADC 通道之前的延迟
InitAdcAio();//由 C2000ware 提供
AdcOffsetSelfCal();//provided C2000ware
AdcChanSelect_run();//只运行一次
AdcConversion_run (conv);
Phase1_CURRENT=((float)(conv[0]-conv[1])/4096.0f)* new_param.target_Nominal _pase_gain;// AN0、AN1的结果
Phase3_current=((float)(conv[2]-conv[3])/4096.0f)* new_param.target_Nominal _pase_gain;// AN2、AN3的结果:错误地是 Phase2
Phase2_current=((float)(conv[4]-conv[5])/4096.0f)* new_param.target_Nominal _pase_gain;// AN4、AN5的结果:错误地是 Phase3
AdcConversion_run (conv);
Phase1_CURRENT=((float)(conv[0]-conv[1])/4096.0f)* new_param.target_Nominal _pase_gain;// AN0、AN1的结果
Phase3_current=((float)(conv[2]-conv[3])/4096.0f)* new_param.target_Nominal _pase_gain;// AN2、AN3的结果:错误地是 Phase2
Phase2_current=((float)(conv[4]-conv[5])/4096.0f)* new_param.target_Nominal _pase_gain;// AN4、AN5的结果:错误地是 Phase3
AdcConversion_run (conv);
Phase1_CURRENT=((float)(conv[0]-conv[1])/4096.0f)* new_param.target_Nominal _pase_gain;// AN0、AN1的结果
Phase3_current=((float)(conv[2]-conv[3])/4096.0f)* new_param.target_Nominal _pase_gain;// AN2、AN3的结果:错误地是 Phase2
Phase2_current=((float)(conv[4]-conv[5])/4096.0f)* new_param.target_Nominal _pase_gain;// AN4、AN5的结果:错误地是 Phase3
}
