我们是做传感器相关产品的, 芯片缺货以来,我们试用了很多国产MCU,也基本全部切换到国产MCU的技术平台上来. 但是目前MCU行业同质化非常严重, 为了受众多,基本上都集成了各种通讯口,支持LED,LCD,等等,没有个性. 直到接触到东微的MCU,从产品的主要功能上就能看到24BIT ADC这个超亮眼的参数, 细看规格书后,发现它还集成有1-2级运放. 这不就是为我们传感器行业定制的吗.
拿到DT5M4756R8L6的开发板后,我们开始了尝试.但是整个尝试过程曲折而有趣.
拿到手上直接复制了一个GPIO的点灯程序,编译通过,但下载不了,经过了多次群内沟通,终于能下载程序并点灯. 在KEIL内部,要注意调试工具选JLINK,以及编程用的地址空间.相关的图片,我看前面分享的同学已经贴了,我就不贴图了.
我们公司主要的用途是将模拟信号转为数字量,然后通过数字接口提供给用户,所以我们重点关注了一下它的ADC工作流程.
东微的ADC空有24位,但其实它也并没有拿它当主要卖点, 这颗芯片更像是为仪器仪表行业或者医疗器械行业做的量身定作,它花了不少的资源在UI这一块,支持LED,LCD段码屏等. 真正留给ADC用的资源并不多. 对于信号源不多的应用还是能用的.
我们这次测试的本来是PH传感器,但因为PH传感器的接口是BNC的,我们没有找到合适的转接头来连到开发板上, 临时用一个TDS探头代替了PH探头.
因为只是测试,所以并没有从头开始写软件, 在官方的DEMO上修改.
这个MCU的资料和STC看齐,所有信息都弄在一个文件里面, 参考代码也是直接地址操作, 着实费了点时间看源码.
首先是系统时钟,它外部的时钟源只有一个32K晶振,其它的应该是内部时钟源, 没有去动它的时钟主频, 默认时钟是64M,默认的分频是4分频, 所以系统时钟是64/4=16M.
那么ADC的时钟频率,用了这两句代码
#define CLK_ADC (uint32_t)0x00000080
CLK_Enable(CLK_ADC);//enable ADC CLK =4MHz
//0x04000014ul是个ADC操作非常重要的寄存器
*(vu32 *)(0x04000014ul) = 0x00000000+(offset<<7)+(osr<<4)+(4<<12); //CLK_SELECT=0, adc tst bias_amp1=adc_tst[18:17] bias_amp0=adc_tst[16:15] bias_adc2=adc_tst[24:23] bias_adc1=adc_tst[22:21] bias_adc0=adc_tst[20:19]
与ADC控制的控制设置基本全在这个寄存器内
关于ADC还有一个初始化寄存器, 0x04000010ul, 同样的也没有名字,我暂且叫它ADC信号源配置寄存器.
原文档无法复制,花了点时间手码到代码里面了. 发出来,如果你们需要可以直接复制过去.
bit31-30: Reserved
bit29: ADC ENABLE 1:enable, 0:disable
bit28: RESET IP复位 0:复位 1:工作
bit27-26:Reserved
bit25: gain 1x 1:1x 第1级前置放大器跟随器
bit24-22: adc_chop_sel ADC斩波模式
bit21-20: adc_chop_freq ADC斩波频率
bit19:Reserved
bit18-16: amp_gain2 前置放大器第2级选择
bit15-14: amp_gain1 前置放大器第1级选择
bit13-11: amp_chop_sel前置放大器斩波波形选择
bit10-9: amp_chop_freq
bit8: amp_chop_en 前置放大器斩波使能
bit7-0: 输入通道选择
//切换ADC通道
参数 ch_p:正端输入位选择
ch_n:负端输入位选择,是选择ADC信号源的意思
gain:放大系数
这上源码里ADC初始化里面的3个参数, 同样的,没有注释, 靠见名知义,猜.
好了,那源码起了个头,要连硬件. 我们是有传感器的转接板,全部引出2.54的排针出来,用杜邦线连到开发板上
条件简陋,先接了TDS中的NTC部分, 原来我们是用的单端接法,这次先尝试了一下差分接法, 用到了P19以及P25两个器件,在板子上压力传感器的旁边. 压力传感器找不到我就没有办法了,压力传感器有个气咀样的东西.
继续魔改源码
void switch_channel(vu8 ch_p,vu8 ch_n,vu8 gain)
{
vu8 gain1,gain2;
if (gain==1)
{
gain1=0;
gain2=0;
//ch_n<<4 是负端输入选择, ch_p是正端输入选择, negative ,postive的意思,
//0x32是 00110010, 0 0 enable work,0000, 0010表示 00 1级放大
*(vu32 *)(0x04000010ul) = 0x32000000 + (ch_n<<4) + (ch_p) + (gain2<<16) + (gain1<<14);
}
//0x30是 00110000 0 0 enable, work,0000 表示无放大
else if (gain==10)
{
gain1=0;
gain2=0;
*(vu32 *)(0x04000010ul) = 0x30000000 + (ch_n<<4) + (ch_p) + (gain2<<16) + (gain1<<14);
}
}
目前还没改源码里的信号源, 可以看到源码里面,用一个gain配置了两种情况,一种有一级放大,一种无放大. 信号源分正端和负端, 我们用了ANN8以及ANP8这两路,所以都配置为1000, 对照表我就不贴了,在规格书底部区域.
先改源码再测试
adc_max= -8388607
adc_min= 8388607
源码里 这两数对应的整数部分是,011111111111111111111111,所以其实有效的分辨精度是23位,并且实际ENOB只有19位,采样频率是1KHZ,并不算快.
NTC的分压法测试是非常简单的,它的分压电阻是100K,我们用的的 10K 3950的NTC, 这个分压还是不太合理的,勉强测了一下, 精度不怎么好,不过稳定性非常不错.
TDS部分也是分压法测试,但是供电就不能用恒流供电了,需要用到变化的电源以及精选的分压电阻.这个在开发板上不太好接线,全部引到我们的转接板上面. 这个渗及到公司的一些细节,不太好直接贴出来. 测试的结论是ADC非常稳定, 但是操控过程有些繁琐,建议封装成不同的库函数, 以提高用户的开发效率.
总结一下就是这颗DT5M4765非常适合有ADC要求,并且有传统UI要求的应用. 有一个非常非常非常人性化的功能,就是它本身可以对外输入3.3,甚至1.8V. 要知道现在的传感器,绝大多数都开始了3.3V供电,甚至1.8V供电, 如果MCU本身对外可以供这几个电压,那么省了很多LDO的工作
需要提高的是开发环境以及开发工具上的适配性. 并且文档完全没有按功能模块分类整理,没有目录,这些都对开发者是个极大的挑战, 上下翻文档非常费时间. 源码里面需要给寄存器命名,要有适当的注释,否则有如锦衣夜行, 让好的国货不能传递到非常需要它的行业当中去.