在用28335AD测量的时候发现和实际高精度万用表测量AD口电压偏差较大,但是是线性的,也就是说可以通过校准得到和高精度万用表基本一致的值。AD口用的是外部基准2.048,测量了外部基准的实际电压也是2.04807V。但是AD转换结果有很大的误差,实际 0.88 ,用AD测量0.85,实际1.755,AD测量1.69,实际1.46,AD测量1.41.
转换的关系为AD测量值 = AD值/4096*3V
采用的是PWM中断然后软件触发。附AD初始化话代码和中断触发采集代码
void sInitAdc(void)
{
#ifdef ADC_CALIBRATION
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
ADC_cal();
EDIS;
#endif
//extern void DSP28x_usDelay(unsigned long Count);
AdcRegs.ADCTRL1.bit.RESET = 1; // Reset the ADC module
asm(" RPT #10 || NOP"); // Must wait 12-cycles (worst-case) for ADC reset to take effect
AdcRegs.ADCREFSEL.bit.REF_SEL = 1;//External reference, 2.048 V on ADCREFIN add 2017 外部基准必须在带隙电压上电之前配置
asm(" RPT #10 || NOP"); //
AdcRegs.ADCTRL3.all = 0x00C6; // first power-up ref and bandgap circuits
//3 HSPCLK/[6*(ADCTRL1[7] + 1)] 25M ADCCLK
//Sequential sampling mode is selected.
// Power up bandgap/reference circuitry
DelayUs(5000); // Wait 5ms before setting ADCPWDN
AdcRegs.ADCTRL3.bit.ADCPWDN = 1; // Set ADCPWDN=1 to power main ADC
DelayUs(200); // Wait 20us before using the ADC
AdcRegs.ADCMAXCONV.all=0x000F;//16 Maximum numbe of conversions
AdcRegs.ADCCHSELSEQ1.all=0x3210;
AdcRegs.ADCCHSELSEQ2.all=0x7654;
AdcRegs.ADCCHSELSEQ3.all=0xBA98;
AdcRegs.ADCCHSELSEQ4.all=0xFEDC;
AdcRegs.ADCTRL1.all=0x2010; /*MOde 2 ADCCLK=FCLK;Start-Stop mode ;Cascaed mode(16);25M ADCCLK*/
}
中断采集部分代码
void sAD_Deal(void)
{
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //触发AD
while(AdcRegs.ADCST.bit.SEQ1_BSY==1); // 等待读取的采样值
mWaitADReadRdy();
/***********公共无需选通AD*************/
strADC.BusV[P_BUS]= (ADCRESULT0>>4);//BUS正电压
strADC.BusV[N_BUS]= (ADCRESULT1>>4);//BUS负电压