WCH沁恒单片机
直播中

梁宏满

7年用户 976经验值
私信 关注
[问答]

CH573F ADC为何要校准,原因及根源是什么?

ADC使用之前官方例程中有对ADC做粗校准,这需要一个AIN输入脚悬空。论坛之前有过类似帖子:
结论是使用外部基准源自行校准,就不需要粗校准了。但自己的使用场景是没有基准源的,所以这里提出另外几个问题:

  • ADC为何要校准,原因既根源是什么?
  • ADC校准好处是什么?不校准情况下误差有多大?(自己应用场景对误差要求不高,测量温度误差1-3度左右都可以)
  • ADC校准,是否必须有一个AIN引脚悬空(不能接仍任何外部器件,包括上、下拉电阻),且必须是PA5(例程中为该引脚)。
  

回帖(1)

何珊

2022-8-26 09:23:49
粗调实际上就是对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);
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分