你好,我在用AVP32F335,在对外部标准的1.5v采样的时候,会出现采样值偏离较大,有些芯片甚至不到1.4v的采样值,实测AD口的信号是1.5v。下面是初始化的代码:
1.AdcRegs.ADCTRL1.bit.RESET = 1; 惹的祸
以上这个问题,首先要考虑的是ADCOFFTRIM寄存器。需要考虑系统出厂默认ADCOFFTRIM寄存器是否曾改变过?芯片在出厂测试时,会对每颗芯片的ADC测试,并把零点的偏差值写入ROM中,而在芯片脱离仿真启动的过程中,BOOT ROM的程序会自动调用ADC_cal()函数,其作用就是将ADCREFSEL和ADCOFFTRIM寄存器写事先芯片出厂存在ROM中的数据。但芯片仿真过程中,会自动跳过BOOT ROM,因此在例程中,InitAdc()函数起始,对ADC时钟使能后,就调用了ADC_cal()以写入ADCOFFTRIM值。注意,ADC时钟不使能,ADC寄存器是无法写入的。ADC在每次转换后,结果寄存器的值都会减去ADCOFFTRIM寄存器的值,此时的采样结果才是准确的。所以,采样值如果偏差过大,首先,可以设置断点看下ADCOFFTRIM的值是否是出厂值。ADCOFFTRIM出厂值在地址0x380085;ADCREFSEL出厂值在地址0x380083。如果ADCOFFTRIM不等于0x380085地址的值,且不为0,您的软件可能有重新对ADC校准的过程。如果ADCOFFTRIM等于0,还需要考虑文档中以下描述内容。
上图资料显示,ADCOFFTRIM寄存器的值是通过执行ADC_cal()函数来赋值的,而给ADC控制寄存器1的14位(RESET)置1,会清零ADCOFFTRIM以及其他ADC寄存器。因此,在RESET=1之后,一定要重复执行一次ADC_cal();相对于要重新配置ADC,以下测试过程可以完整体现此问题。如以下测试程序:
上图是在执行AdcRegs.ADCTRL1.bit.RESET = 1; 之前,寄存器AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM 的值是11;
执行完AdcRegs.ADCTRL1.bit.RESET = 1;后,寄存器AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM 的值是0,
只有当从新调用ADC_cal()后,寄存器AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM才回到11。RESET位功能说明如下:
注意:因为RESET=1后是重置整个ADC,所以在RESET=1以后,不但ADC_cal()要重新调用,ADC所有寄存器都恢复默认状态,同样影响到乐动平台电子ADC内部1.5v模拟电源使能位需使能的注意事项AdcRegs.ADCTRL1.bit.rsvd1 = 8;
以上问题,在TMS320F28335芯片上同样存在,而在TI的程序示例代码中,因为没有AdcRegs.ADCTRL1.bit.RESET = 1; 且F28335的ADCOFFTRIM值比较集中,所以一般不会注意此问题。