1

关于投票
基于ATmega48的串口电压表的制作
资料编写与整理:AVR猎手benladn911     
出处:AVR猎手的地盘  http://blog.ednchina.com/benladn911/      转载请注明出处
 
更新说明:
2007.11.23   V1.2   支持400mV,4V,40V,400V直流电压测量量程。
2007.03.19   V1.1   支持4V直流电压测量量程,同时使用UT60A软件采集保存到计算机
 
前言
现在很多的高档数字万用表都具有RS232串行接口,万用表在实际测量电参数的同时把测量到的电参数按一定的通讯协议通过RS232串行接口传输到计算机,由计算机的上位机软件进行数据的实时、定时采集,利用计算机端的软件可以记录大量数据从而方便对一定时间段内的电参数监测分析,生成电参数变化曲线。

但是目前具有这种PC机采集记录功能的高档万用表价格昂贵,让很多人望而却步,在技术论坛上看到很多技术网友想自制类似功能的万用表,希望有人能制作出相关功能的电压表出来,提供自制资料供大家自己制作,以方便平时工作和学习的需求。由于自己本人的技术成长也是受益于网络的共享精神,是到自己回报网络和网友的时候了…

很多网友提出了相关的方案。其中的一个方案是通过单片机读取普通数字万用表的LCD液晶段码信息,就像读取LED数码管的段码信息来处理,然后通过单片机进行数据转换发送到计算机端的软件,当然还得开发计算机端的软件。但是LCD液晶是交流信号驱动的,和用数字电平驱动的LED数码管属于两种不同的显示设备,所以用单片机来读取LCD液晶的段码信息是不现实的,而且自己开发上位机软件的难度和工作量都较大,于是这个方案推翻了。当然这其中网友提出了很多可行的模块方案。

最后结合了所有的建议,还是决定采用带AD功能的单片机直接测量采集电参数,进行数据转换,然后看看能不能直接利用市面上现成的万用表的上位机软件进行数据的采集保存,这样可以缩小开发的周期和成本,但是想要利用现成的万用表上位机软件的话就涉及到通讯协议的问题了,厂家一般是不公开这些资料的。于是还是利用了网络强大的搜索功能,总算找到相关协议资料了…在此再次感谢网络的共享精神,感谢《我爱电子制作网》 http://www.5iediy.com 的作者何光站长,原来何光站长已经制作出相关功能的串口电压表,并且在其网站上公布了相关万用表软件和协议文件,总共提供了2个万用表厂家的软件和协议,其中优利德厂家开发的UT60A数字万用表软件功能比较完善。本想直接推荐大家按此资料自制的,但最后本人还是决定在此基础进行功能的增强和完善,算是一个改进版本吧,相信何光站长也会赞同的。好了,下面就开始吧…
 


串口电压表基本工作流程:

ATmega48单片机每0.5秒对输入到ADC0口的直流电压(0 - 4V直流电压)进行AD转换,为了保证采集到的电压值的稳定性,单片机每次AD转换的时候连续读取8次的电压值,然后去掉其中的一个最大值和一个最小值再求平均值,在把得到的电压平均值进行BCD码转换,把BCD码数据送到数码管进行刷新显示,既每0.5秒更新一次当前电压值。
当把PD6口的S1拨动开关接地时,单片机就把BCD码数据按照UT60A万用表软件的协议要求进行特殊的数据转换,然后电路每0.5秒发送一次数据到串口。
 
 
我做的串口电压表的实验板,每个模块都是独立的,模块直接的连接使用杜邦连接线,插一插连接线就可以了,很方便,这样可以重复使用每个模块,其他的实验如果有用到的直接插下线就可以,节省一些重复焊接劳动。呵呵,图片拍的不是很好,请谅解

点击开大图

电压采集中的工作图片:电压采集中的工作图片:

点击开大图


V1.2版本功能参数说明:
 
串口万用表技术指标(因时间较长,现重新整理,所以部分参数可能描述有误,有错误大家可以指出,我再修改,谢谢大家的支持)
直流电压量程:0 – 400mV  ,0 – 4V  , 0  – 40V  ,0  – 400V 
最大显示字:3.999
分辨率:4mV ,4mV ,40mV,400mV,
准确度:可用高精度数字万用表调试到最佳准确度为止
环境温度:室温18~28℃
环境湿度:不大于75% RH
 
V1.2版本相关下载:
 
Protel99SE格式和PDF格式的原理图下载:
 
HEX烧写文件:(由于最近事务繁多,过后整理下再发布源程序)
 
ATmega48的串口电压表详细制作说明文档(PDF格式):


V1.1版本功能参数说明:

串口万用表技术指标
直流电压量程:0 – 4V
最大显示字:3.999
分辨率:4mV
准确度:可用高精度数字万用表调试到最佳准确度为止
环境温度:室温18~28℃
环境湿度:不大于75% RH
 
V1.1版本相关下载:

Protel99SE格式和PDF格式的原理图下载:
 
HEX烧写文件:
 
ATmega48的串口电压表详细制作说明文档(PDF格式):
 
UT60A的软件的下载地址如下:
http://www.uni-trend.com/software/UT60A_Soft.exe

UT60A的软件的使用说明书下载地址如下:
http://www.uni-trend.com.cn/download/UT60Asoft.pdf
 

 
软件的设计
    AVR单片机开发环境采用AVR Studio 4.12SP4 + WINAVR20060421 ,采用C语言开发。本串口电压表暂时只提供hex文件,暂不提供源程序,请谅解。


本串口万用表目前版本为V1.1,只有一个4V的量程,功能的扩展将根据网友实际的需求和建议做改进。相信不久就会有新版的。

2007.11.23  更新为V1.2版本,支持4个电压量程,同时一样支持数据的采集和保存。

 

 

 

 

 

 

 

 

系统分类: 单片机
用户分类: AVR单片机应用
标签: 电压表 串口电压表 ATMEGA48
来源: 原创
发表评论 阅读全文(191) | 回复(0)

7

关于投票
AVR的BOD,不得不说的功能应用
AVR的BOD,不得不说的功能应用
资料编写与整理:AVR猎手benladn911      出处:AVR猎手的地盘  http://benladn911.21ic.org       转载请注明出处
 
说起AVR芯片的BOD功能,我们先看一下马潮老师写的关于 AVR的BOD 的使用注意事项,然后我再和大家一起分享我实际在应用BOD时候碰到的问题以及分析解决方法。

虚线内的是马潮老师的原文,如下:
--------------------------------
作为一个正式的系统或产品,当系统基本功能调试完成后,一旦进行现场测试阶段,请注意马上改写熔丝位的配置,启用AVR的电源检测(BOD)功能。

对于5V系统,设置BOD电平为4.0V;对于3V系统,设置BOD电平为2.7V。然后允许BOD检测。

这样,一旦AVR的供电电压低于BOD电平,AVR进入RESET(不执行程序了)。而当电源恢复到BOD电平以上,AVR才正式开始从头执行程序。保证了系统的可靠性!

原因分析如下:
AVR是宽电压工作的芯片,当电压跌至2.5V,系统程序还能工作。这是有2个可怕的现象可能出现,
1。外围芯片工作已经混乱,AVR读到的东西不正确,造成程序的执行发生逻辑错误(不是AVR本身的原因)。
2。当电源低到临界点,如2.4V时,并且在此互上互下的,AVR本身的程序执行也不正常,取指令、读数据都可能发生错误,或程序乱飞、不稳定(AVR本身的原因,实际任何的单片机都是这样的),非常容易造成EEPROM、FALSH的破坏。有人问51怎么不会?实际上51也是这样,只是51内部没有直接写EEPROM、FLASH的指令,它的程序乱飞留不下痕迹。还有人有疑问:外挂EEPROM,掉电时怎么不会改写?实际是外挂EEPROM,当电压低于4V(2.7V)时,它已经不工作了,程序去改内容也改不了。而AVR内部的东西在临界电压时都能工作,但非常不稳定。

AVR的BOD功能必须要使用,我早期使用51时,凡是产品外部都要使用电源监测芯片,现在AVR自己本身就有该功能,一定要使用。

这些教课书上是没有的。
----------------------------------

下面也说说我的亲身经历:(我描述事件的时候比较罗嗦,为的也是以后有人碰到类似问题的时候可以参考,所以,您就慢慢看咯^_^)

正在做的一个控制系统,现场环境提供给我的电源是DC 24V,我的系统需要两个电压,一个是DC 12V 3A,一个是DC 5V 200mA。12V稳压选用了1501A12开关稳压IC(此芯片最大电流可以承受5A,如果要达到这么大的电流,配套的电感很重要,必须使用蓝绿磁环,0.85mm的漆包线绕制,22uH的电感量)。5V的电源用7805对12V电源进行稳压。单片机用的是ATMEGA48,使用洞洞板焊接做实验,芯片的熔丝只修改了下振荡源为外部晶体振荡和关闭8分频功能,未开启BOD。

因为12V的电压系统要带动一个直流电机,由12V的继电器进行带动控制,因为电机工作时带动的负载有可能会被外力阻挡而造成电机停转过载,这个时候电机的堵转电流可能达到3A左右,所以在硬件上我做了保护,采用AVR的ADC检测电机的工作电流,如果发生过载,则马上停止电机工作。

这个手工焊接的控制板测试时工作正常,包括电机过载测试,都未发生什么故障。

都测试通过后,制板回来,烧写程序的时候顺便打开AVR的BOD,设置为4.3V。然后开始着手做一些过载测试,发现一过载MCU就马上复位~~~超级郁闷啊~~~以为自己又改了什么程序导致不稳定,或者是启动电机工作后的延时时间不够(大家都知道:在驱动大功率负载的时候,在接通继电器的时候,MCU的指令控制一定要再延时几十个毫秒~几百个毫秒左右,否则会出现继电器吸合后马上断开的问题。详细原因不在本文讨论范围之内就不多说了,书本上都有详细说明这些用法),真的很打击人~ 想想AVR也没这么脆弱~~或者是我布板设计不合理???没这个理由的,以前的板子可是用洞洞板焊接的,以前不管怎么测试都不会复位。试着增加了输出控制的延时时间,还是一样的结果,一过载就复位。

软件改了~不行~~~写入以前的软件~也不行
换回以前的洞洞板测试,OK,没问题。不会吧~~~

静下心来仔细想想,两个板的差异,硬件一样,软件一样,芯片一样。等等…好象…对了!新做的板子都开启了BOD使能。马上先把BOD关了,果然,系统没有再发生过一次复位的情况。问题是解决了,但总得给个理由吧,总不能就放着BOD不用~~~再用眼睛仔细观察电机过载时电路板的一些状态,发现12V的LED电源指示灯会在电机过载的瞬间暗了一下,哇靠~!火眼金睛啊~!多带了个眼镜果然不一样!^_^哈哈,知道哪里的问题了。应该是电机过载时,12V的电压有所跌落,然后导致经过7805稳压后的5V电压也有所跌落,虽然这个电压的跌落只是瞬间,可能有跌到 4.3V以下,但这个瞬间马上被BOD检测到了,BOD强制MCU复位。这个瞬间的跌落用万用表是检测不出的,特别是用数字表更看不出了,有示波器的话就可以看下这个的跌落波形了。我手上只有两个数字表,所以没法把这个瞬间的波形捕捉出来给大家看了。(有些时候数字表还不如指针表,指针表可能还会更直观的显示出一些瞬态变化,如果有指针表应该也可以看出一些细微的电压波动)

解决方法:BOD的作用上面马老师已经说了,所以还是不能关掉了事,设置为2.7V即可,我这样做有没有道理大家自己想咯^_^

把自己使用BOD的过程分享出来是想告诉大家:使用BOD的时候不是随手开下就了事的,要注意实际工作的一些异常状况的发生,设置好适合系统的BOD电压才能保证你的系统工作的更可靠。

AVR,我看行!   ^_^ 嘿嘿,ATMEL可是没给我广告费哦~

 

-------------------------------- 最新更新 2008.04.16 --------------------------------

我现在的电源方案是 DC24V --> AP1501-12稳压到12V  --> 7805稳压到5V给AVR , 这样出现的问题是7805的输入端的12V电压会因为12V的负载而降低,导致7805的输出不稳定导致AVR工作异常。


解决方案:DC24V --> AP1501-12稳压到12V给12V的负载 
 
          DC24V --> LM317 稳压到5V给AVR (因为24V电源可提供的功率很大,不会受12V的负载而下跌,所以把24V直接稳压到5V,可得到稳定的5V,虽然从24V直接降到5V压降很大,但5V的负载电流很小,所以基本上不会有太大的发热问题)


系统分类: 单片机
用户分类: AVR单片机应用
标签: AVR BOD
来源: 原创
发表评论 阅读全文(1551) | 回复(6)

2

关于投票
AVR单片机上电复位不可靠问题的解决(原创)
昨晚在调试AVR 单片机时又有一些心得体会,虽然结论是一个很小的问题造成的,但在此还是写出来给大家参考,避免走弯路。
 
 
事件描述:
       以前用AVR的芯片也做过好几个设计,从来没有怀疑过ATMEL的芯片的稳定性,以前的几个方案都是很稳定的,当然这跟PCB的设计有很大的关系,如果大家需要PCB相关参考资料的话可以到本站的PCB技术专栏里查找,那里有很多前辈的PCB布板心得。
        这次用的ATmega48制作的串口电压表就出现一个很奇怪的现象,电路板是用万能板焊接的,程序里用到ADC功能和串口通讯功能,用的AVR下载工具是STK500,每次下载程序后芯片总是不能正常复位工作,还要读取下芯片的特征字或熔丝位让芯片重新复位下才能工作,这时候复位后工作都稳定,没出现什么不正常。刚开始不在意这个问题,因为在开发的初期用AVR DRAGON仿真调试部分功能时复位脚不能接任何器件,所以也就把复位脚悬着不接复位电路,以为是没接阻容复位而造成不稳定。在此还是没有怀疑过芯片的问题。
         直到后来这个程序都开发完毕了,给ATMEGA48加上 一个10K的上拉电阻和0.1uF的电容做复位,把ISP线拔掉,独立给串口电压表上电(因为当时都是用几个电路模块连接做实验,串口电平转换电路也是独立的,初期串口调试已经都通过了,所以我把这个串口电平转换模块的连线都拔掉了),问题来了,上电不工作,手动把复位脚接地后放开可以工作,但过了一会后还是死了,加看门狗后还是老样,没有任何改善,每次手动复位正常工作后,把手指头放在ATMEGA48的1、2、3脚上方慢慢靠近,手指头还没碰到芯片就死机了~~~不会吧,没这么脆弱吧。以前用AVR Tiny26做的控制器,把手机放在芯片上方然后拨打10086都不会死机。不会中奖了吧,又不是第一次搞单片机,难道真要像以前论坛里的朋友开玩笑说:要杀只大公鸡祭拜下~~~
        奇怪啊~~~实在没招,把串口电平转换电路给接上继续调试下,这时候再上电每次都是正常工作,而如果再把串口电平转换电路断开则又不能正常复位工作~~~手动复位后把手再靠近芯片的1、2、3脚上方就又马上死机~~~狂晕~~~~不是吧~~~ATMEGA48的第一脚是RST,2、3两脚刚好是RXD、TXD串行引脚,难道真的是这个串口干扰引脚影响到复位电路?不可能吧,ATMEGA48芯片用得人多的是,各方面的应用都有,不可能是芯片的缺陷,还是多怀疑下自己吧...重新再好好看看自己的程序吧...
        程序里开始首先是对IO做初始化,TXD配置为输出,还有其他相关IO配置。然后是对定时器的一些初始化,再就是对串口的一些初始化了。看了下程序,在初始化的时候就把串口中断发送、接收允许都使能了,难道是这里的问题?串口电压表在实际工作的时候串口其实不是在一直工作的,是通过一个开关选择接地才发送数据,平时是不发送的,而在不接串口电平转换电路的时候RXD、TXD都是是悬空的,只有TXD为输出有上拉,RXD没有使能上拉,这时候RXD是最容易被外部干扰的,这就是问题的所在了。当然如果串口电平转换电路都连接着,那就没这个问题,因为串口电平转换电路已经把RXD的电平给钳住了。解决的方法很简单:在初始化串口的时候关闭串口中断使能,在主程序里需要发送数据的时候再使能串口,发送完马上关闭就可以。至此问题解决,这时候看你再怎么去“摸”ATMEGA48的引脚或封装都没有再出现任何的死机情况,每次上电复位都是非常的稳定。(把AVR的BOD熔丝打开可增加复位的可靠性,BOD LEVEL根据实际的电源电压进行选择,这里的电源是5V,所以BOD LEVEL选4.3V)
 
 
总结教训:
        这是自己的粗心大意、芯片内部功能的没有合理性利用的表现。在此引以为戒!告诉自己:不要以为自己做过一些小项目就飘飘然起来,不要动不动就去怀疑人家半导体厂家芯片的稳定性,要多怀疑自己才是。往往可能最基本的问题没注意而花费了很多的时间,自己做着玩的东西那都无所谓了,如果你是给别人打工呢?那性质就完全不一样了!
 
下图为AVR单片机 典型外部复位电路:
        AVR单片机已经内置了上电复位设计。并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位线路在上电时,可以设计得很简单:直接拉一只10K的电阻到VCC即可。
 
        为了可靠,再加上一只0.1uF的电容以消除干扰、杂波。
 
        二极管1N4148的作用有两个:作用一是将复位输入的最高电压钳在Vcc+0.5V 左右,另一作用是系统断电时,将10K电阻短路,让0.1uF的电容快速放电,让下一次来电时,能产生有效的复位。
 
        当AVR在工作时,按下开关S 时,复位脚变成低电平,触发AVR芯片复位。
 
 
2007-3-30 17:07:00 AVR猎手
系统分类: 单片机
用户分类: AVR单片机应用
标签: AVR 复位 抗干扰
来源: 原创
发表评论 阅读全文(1788) | 回复(10)
总共 , 当前 /