我们是做传感器相关产品的, 芯片缺货以来,我们试用了很多国产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: reservedbit29: adc enable 1:enable, 0:disablebit28: reset ip复位 0:复位 1:工作bit27-26:reservedbit25: gain 1x 1:1x 第1级前置放大器跟随器bit24-22: adc_chop_sel adc斩波模式bit21-20: adc_chop_freq adc斩波频率bit19:reservedbit18-16: amp_gain2 前置放大器第2级选择bit15-14: amp_gain1 前置放大器第1级选择bit13-11: amp_chop_sel前置放大器斩波波形选择bit10-9: amp_chop_freqbit8: 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的工作
需要提高的是开发环境以及开发工具上的适配性. 并且文档完全没有按功能模块分类整理,没有目录,这些都对开发者是个极大的挑战, 上下翻文档非常费时间. 源码里面需要给寄存器命名,要有适当的注释,否则有如锦衣夜行, 让好的国货不能传递到非常需要它的行业当中去.
如何使用分立元件构建双向开关?
统一通信基础设施对于远程工作有什么影响
奥拓电子推出全新的XR虚拟 SW-RGBW LED天幕屏
V2C MXene组件促进实用锂硫电池的硫释放动力学和锂离子筛分
中国汽车芯片标准检测认证联盟在天津成立
【东微半导体DT5M4765R8L6开发板试用体验】搭建环境以及体验高精度ADC
日本扩大投资补贴,挑战韩国半导体行业主导地位
消除自激振荡的常用方法有
边缘计算网关有哪些应用场景?边缘计算网关应用场景大汇总
华为的鸿蒙系统和HMS是什么?存在怎样的关系
什么是1G/2G/2.5G/3G? GSM? GPRS?
华为跑分事件获新进展 华为与3DMark达成共识将在未来开启性能模式
Vishay电容器荣获2021年度AspenCore全球电子成就奖
长江存储与第二届全国大学生集成电路创新创业大赛达成合作
电能质量分析仪数据导出功能介绍
虚拟制造系统的功能特点
手术机器人带给医疗行业什么
为什么要说HTC“又”裁员了
FPGA上可以用一个比较器实现ADC的功能?1
无线收发数传MODEM模块PTR2000的特点、引脚功能与应用介绍