粗调实际上就是对GND校准,ADC对GND读个值,计算出固定的偏移, 然后手动去offset其他通道的值;
这个偏移通常在几个LSB到几十个LSB 之间,可能是偏大, 或者偏小, 把校准值带入实际的采样值,来修正这个固定偏差;
对于CH579,其借用PA5对应的ADC channel 1来做粗调通道,当使用粗调时,内部模拟开关会控制该channel的电平,如果该IO 正好被对应到了外部的IO上,要避免外部电路造成的影响,所以不建议使用PA5作为其他功能,否则建议其他方式实现粗调;
对于CH573 用于粗调的通道是可被修改的的, 例程中给的是channel 6 ,这是个内部通道;
下面代码来来源 CH573_EVT_1.6 的 CH57x_adc.c :
signed short ADC_DataCalib_Rough( void ) // 采样数据粗调,获取偏差值
{
UINT16 i;
UINT32 sum=0;
UINT8 ch=0; // 备份通道
UINT8 ctrl=0; // 备份控制寄存器
ch = R8_ADC_CHANNEL;
ctrl = R8_ADC_CFG;
R8_ADC_CFG = 0;
ADC_ChannelCfg( 6 ); // 6/7/10/11 可选
R8_ADC_CFG |= RB_ADC_OFS_TEST|RB_ADC_POWER_ON|(2<<4); // 进入测试模式
R8_ADC_CONVERT = RB_ADC_START;
while( R8_ADC_CONVERT & RB_ADC_START );
for(i=0; i<16; i++)
{
R8_ADC_CONVERT = RB_ADC_START;
while( R8_ADC_CONVERT & RB_ADC_START );
sum += (~R16_ADC_DATA)&RB_ADC_DATA;
}
sum = (sum+8)>>4;
R8_ADC_CFG &= ~RB_ADC_OFS_TEST; // 关闭测试模式
R8_ADC_CHANNEL = ch;
R8_ADC_CFG = ctrl;
return (2048 - sum);
}
粗调实际上就是对GND校准,ADC对GND读个值,计算出固定的偏移, 然后手动去offset其他通道的值;
这个偏移通常在几个LSB到几十个LSB 之间,可能是偏大, 或者偏小, 把校准值带入实际的采样值,来修正这个固定偏差;
对于CH579,其借用PA5对应的ADC channel 1来做粗调通道,当使用粗调时,内部模拟开关会控制该channel的电平,如果该IO 正好被对应到了外部的IO上,要避免外部电路造成的影响,所以不建议使用PA5作为其他功能,否则建议其他方式实现粗调;
对于CH573 用于粗调的通道是可被修改的的, 例程中给的是channel 6 ,这是个内部通道;
下面代码来来源 CH573_EVT_1.6 的 CH57x_adc.c :
signed short ADC_DataCalib_Rough( void ) // 采样数据粗调,获取偏差值
{
UINT16 i;
UINT32 sum=0;
UINT8 ch=0; // 备份通道
UINT8 ctrl=0; // 备份控制寄存器
ch = R8_ADC_CHANNEL;
ctrl = R8_ADC_CFG;
R8_ADC_CFG = 0;
ADC_ChannelCfg( 6 ); // 6/7/10/11 可选
R8_ADC_CFG |= RB_ADC_OFS_TEST|RB_ADC_POWER_ON|(2<<4); // 进入测试模式
R8_ADC_CONVERT = RB_ADC_START;
while( R8_ADC_CONVERT & RB_ADC_START );
for(i=0; i<16; i++)
{
R8_ADC_CONVERT = RB_ADC_START;
while( R8_ADC_CONVERT & RB_ADC_START );
sum += (~R16_ADC_DATA)&RB_ADC_DATA;
}
sum = (sum+8)>>4;
R8_ADC_CFG &= ~RB_ADC_OFS_TEST; // 关闭测试模式
R8_ADC_CHANNEL = ch;
R8_ADC_CFG = ctrl;
return (2048 - sum);
}
举报