#申请原创#
项目中的国产AD芯片替换 我公司在2019年开始着手国产AD芯片元器件的替代工作,国产化已成为客户的强制要求,公司开始正式进行。全公司开始调研一些国产的元器件寻求国产替代。当时我们用的还是ADI公司的芯片ADS8688,这个芯片在工业控制领域使用非常广泛。自带8路通道,且可以同步采样,采样也达到了500K的速度,分辨率为16位,可以达到比较高的采样精度。 经过调研,发现市场上国产的AD芯片公司有芯海科技,晶华微,芯佰微,圣邦微,重庆中电24所,云芯微,上海贝岭等等。 因为我们公司用的是16通道同步采样的芯片,自带二阶有源低通滤波,如果单纯要PIN-TO-PIN替换,这样最省事,直接把精力放在软件移植上就可以。结果调研发现,在这个AD芯片上,没有任何可原位替代实现的可能性。因为AD芯片牵扯到数模混合电路,相对来说模拟电路比数字电路难度要高一个档次,这也是国外模拟电路工程师薪水非常高的原因。国内顶级的模拟电路设计比国外还是差好几个档次,特别是针对一些高速的模数转换芯片,国内还无法实现功能替换。不过随着时间的推移,国内的AD芯片设计水平和制造水平也越来越提升,相信不久的将来能赶上国外。国内的中低端AD芯片供应选择面还是比较大的,可以满足普通用户的需求。 我公司原来采用的ADS8688内部框图如下: 可以看到,8个通道的输入端为1M欧的高输入阻抗,这样模拟前端不用再通过电压跟随器之类的放大器进行阻抗变换,简化了电路设计。OVP是输入过电压保护电路,对芯片进行了一定程度的保护,如浪涌、ESD、EFT等。再往后是PGA电路,即可编程增益放大器,其优点是可动态的调节输入电压范围,使得信号源的电压幅值最大化的落入合适的电压输入范围等级,提高信号采集的精度。为了抑制电路中的噪声,芯片内部采用了二阶低通滤波电路。后端ADC驱动器本质上是一个放大缓冲器,可满足采样的高速性。Multiplexer即是一个多路开关MUX,具备自动扫描和手动扫描两种模式。MUX的输出由16位逐次逼近型AD转换器进行采样。芯片本身可用内部电压参考源或外部电压参考源两种模式。相对来说,如果要求精度高的话,最好配备低纹波噪声的外部电压基准源。芯片通过SPI总线与CPU进行通信,把采样到的数据送给CPU进行处理,支持菊花链拓扑的SPI标准接口协议。 ADS8688芯片优点一目了然,但既然PIN-TO-PIN替换无法实现,考虑进行功能级替换。最开始我司考虑的是重庆中电24所的一款芯片SAD7656EN。其内部功能框图为: 可以看到,这款芯片是6通道16位SAR AD转换器,但没有内置低通滤波器,支持数据串行输出。手册上写的是该芯片可原位替代国外芯片AD7656,但经过与24所技术人员沟通,发现首次与实际对应不上。此芯片手册上虽然写的支持两种电压输入范围,其实只支持一种电压范围。另外,关于串行总线输出的时序配置上,也与AD7656存在差异之处。最让用户感到头大的是一个芯片的价格为12000元,还是经过771所总师系统内沟通后的打折价,我司最终难以接受,开始寻找其他芯片供应厂商。 经过多方位寻找,最后锁定一个公司的芯片,北京核芯互联科技有限公司。型号是CALD16200K8,与技术人员沟通,发现兼容的是ADI公司AD7606芯片。其内部框图如下。 可以看到,其内部框图与ADS8688功能上非常接近。CLAD16200K8是8通道同步采样模数数据采集系统(DAS),内置二阶抗混叠滤波器、跟踪保持放大器、16位电荷再分配逐次逼近型模数转换器(ADC)、灵活的数字滤波器、2.5V基准电压源、基准电压缓冲以及高速串行和并行接口。 CLAD16200K8采用5V单电源供电,可以处理±10V和±5V真双极性输入信号,同时所有通道均能以高达200kSPS的吞吐速率采样。CLAD16200K8的模拟输入阻抗均为1MΩ。 最主要的这款芯片价格很亲民,一片70多元,比ADS8688还要便宜。下表是两款芯片的硬件资源对比表。可以看到,硬件功能性能指标非常接近,功能上可以实现完全替代。
资源对比 | | | 采样速度 | | | 输入阻抗 | | | 通道数量 | | | 供电范围 | | | 功耗 | | | 温度 | | | 内置滤波 | | | 输入电压范围 | ±10.24 V, ±5.12 V, ±2.56 V, ±1.28 V, ±0.64 V – 10.24 V, 5.12 V, 2.56 V, 1.28 V | | 参考电压 | | | 内外基准 | | | 过采样技术 | | | 串行协议 | | |
不过在实际使用中,还是发现了使用该芯片存在的一些问题。首先是该芯片在内部基准源和外部基准源分别工作时,实测的误差区别很大。特别是内部基准源下偏离的正常源信号值很大。经过与厂家沟通,厂家说提供的第一版芯片只支持外部基准源,这种情况下由于内外标定方法的原因导致误差比较大。后来厂家在第二版芯片中修正了此问题。第二,对于ADS8688而言,RST管脚是低电平有效,而CLAD16200K8的RESET却是高电平有效,这个在电路设计时要注意,我当时就犯了这个错误,导致CLAD16200K8芯片反复复位,无法正常工作。对于ADS8688而言,还有一个要注意的事项是,芯片推荐的原理图中,RST管脚通过47K电阻上拉到5V,实际使用时发现偶尔芯片工作不正常,通过示波器加到RST管脚,发现RST复位,分析由于47K电阻阻抗过大导致驱动电流不够,最终导致了电平越界门限值出现误动。把电阻更换为4.7K后,芯片工作正常。第三,对于负电压的信号,ADS8688的串行输出采用的是原码,而CLAD16200K8采用的是补码,故实际采集处理时需要把补码转换为原码使用。 关于ADS8688及CLAD16200K8的原理图可参考下图。
再说一下移植的事,整体上讲,没有什么大问题。由于两个芯片都遵循SPI标准协议,此处基本一样,主要是前端的寄存器配置上存在差异。 对于ADS8688而言,核心代码为:
AI_CS0_LOW; //CS0 LOW
ai_delay(5);
for(i = 0 ; i< 16 ; i++)
{
if((command >> (15-i)) & 0x0001)
{
AI_MOSI0_HIGH;//mosi high
}
else
{
AI_MOSI0_LOW;//mosi low
}
AI_CLK0_HIGH;//CLK high
ai_delay(2);
AI_CLK0_LOW;//CLK low
ai_delay(2);
}
ai_delay(5);
for(i = 0 ; i< 16 ; i++)
{
sdo_value|= (AI_MISO0) << (15-i);
AI_CLK0_HIGH;//CLK high
ai_delay(2);
AI_CLK0_LOW;//CLK low
ai_delay(2);
}
AI_CS0_HIGH;//CS0HIGH
ai_delay(5);
returnsdo_value;
对于CLAD16200K8而言,核心代码为:
if(BUSY_IS_LOW())
{
AD_CS_0();
for(ch=0;ch<8;ch++)
{
for(index=0;index<16;index++)
{
Num<<=1;
SCK_0();
OSTimeDlyHMSM(0,0, 0, 10);
if(MISO_IS_HIGH())
Num++;
SCK_1();
OSTimeDlyHMSM(0,0, 0, 10);
}
us_adc_now[ch]=(uint16_t)(Num+0x8000);//补码变为正码值
}
AD_CS_1();
}
|