上传一个完整的项目范例(原创)
这是一个完整的项目文件,程序我已经全部调试完毕,现将软硬件资料全部上传,供大家参考学习。里面包含了M16的AD、EEPROM、定时器、中断、看门狗等内部资源的使用,以及菜单程序、浮点数的存放与取出和显示、液晶显示、数字滤波、按键复用等内容。项目硬件比较简单,AD0、AD1读取两路4-20ma电流信号(由RCV420转换成0-5V的电压信号),AD2读取电压信号该系统主要完成这样一个工作,从AD0读出温度、AD1读取差压,由这两个值根据一个公式计算出流量并显示,AD2读出全压并显示。系统有4个按键,分别接在4个IO口上,这是个按键是 “设置/退出”、“向上/加1”、“向下/右移”、“确认/保存”,这些按键用于设置3路模拟量的上下限值和其他的一些系统参数。整个系统不算复杂,但程序稍微繁琐,调试较费时。PCB绘制好,正准备制版,等焊好了再发上来吧
因为赶时间,并且项目对运行时间无要求,程序中使用了较多的浮点数,导致HEX文件较大。菜单程序使用了全局变量screen_status来记录菜单的状态。
对于AD值的处理,我使用了一种自己摸索出来的滤波方法,对于AD值在正负2以内的跳动非常有效。具体如下实现:用一个全局变量last_ad来存放上一次AD转换的值,每次显示AD值时都要拿本次的AD值与last_ad做比较,若比last_ad大1,则本次值减1,大2则减2,依此类推,并把处理之后的AD值放入last_ad中作为下次比较的值。这样就可以滤出正负2以内的跳动(对于这样的跳动,平均值滤波是无能为力的,具体原因嘛,自己试验一下便知道了)
使用ATMANAVR4.5编译通过,GCC版本为3.4.1GCC提供了较为丰富的库函数,这个程序中的AD、浮点、EEPROM等都是使用函数完成的,稍后我会贴一篇专门介绍浮点数应用的文章,敬请关注。
另外我把12864液晶的驱动单独做了一个范例文件,放在另一个帖子里了
注:仅供学习使用,请勿用于其他用途
项目文件,包括SCH、熔丝、程序
点击此处下载armok0166341.rar
项目硬件
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166326.JPG
正常画面
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166327.JPG
主菜单1
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166328.JPG
主菜单2
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166329.JPG
主菜单3
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166330.JPG
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166331.JPG
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166332.JPG
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166333.JPG
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166334.JPG
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166335.JPG
测试模式,显示AD值、电压值、电流值
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166336.JPG
项目中使用的焊接式变压器
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166337.JPG
电流转电压芯片RCV420
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166338.JPG
液晶近照
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166339.JPG
液晶近照
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166340.JPG
-----此内容被Jacky于2005-08-30,21:46:04编辑过 不错啊! 哇! 谢谢,谢谢!
为Jacky的无私交流加200分! 哇,好啊!这里好久没有出现过这样的英雄了
这才叫真正的无私嘛。 精神可嘉,真正的英雄.
我想问一下,AD转换时转换后的值跳动一二百,你有什么好的建议吗?
-----此内容被dengchongguang于2005-08-31,00:21:55编辑过 向楼主致敬!! 不错 “跳动一二百”,单靠软件滤波可能对付不了,我想你的硬件电路可能还有问题。 下了,好好研究一下 Thanks XIE XIE!!! 我编译怎么通不过,GCCAVR是在OURAVR下的;
请问这个sig-avr.h我那里面怎么没有列?
楼主能不把 "float.h" 也贴上来咯!
提示为:
j.c:24:21: sig-avr.h: No such file or directory
j.c:48: error: syntax error before "float"
j.c:51: error: syntax error before "float"
j.c:54: error: syntax error before "float"
j.c:56: error: syntax error before "float"
j.c:59: error: syntax error before "float"
j.c:61: error: syntax error before "float"
j.c:64: error: syntax error before "float"
j.c:67: error: syntax error before "float"
j.c:69: error: syntax error before "float"
j.c:200: warning: return type defaults to `int'
j.c:200: warning: function declaration isn't a prototype
j.c: In function `SIGNAL':
j.c:200: warning: type of "__vector_8" defaults to "int"
j.c:231: warning: implicit declaration of function `cbi'
j.c:237: warning: implicit declaration of function `sbi'
j.c: At top level:
j.c:252: warning: return type defaults to `int'
j.c:252: warning: function declaration isn't a prototype
j.c:252: error: redefinition of 'SIGNAL'
j.c:200: error: previous definition of 'SIGNAL' was here
j.c: In function `SIGNAL':
j.c:252: warning: type of "__vector_14" defaults to "int"
j.c:254: error: `ADCW' undeclared (first use in this function)
j.c:254: error: (Each undeclared identifier is reported only once
j.c:254: error: for each function it appears in.)
j.c: In function `lcm_init':
j.c:349: warning: implicit declaration of function `delay'
rm -f j.elf
make.exe: *** Error 1 注意:“使用ATMANAVR4.5编译通过,GCC版本为3.4.1”
我使用的编译器是ATMANAVR4.5,它虽然是使用GCC内核的,但是在WINAVR下我不知道能否编译通过。我上传的是完整的工程文件,在ATMANAVR4.5是绝对可以编译通过的。
至于float.h,只要你安装了ATMANAVR4.5,在它的安装目录下就可以找到了。
http://cache.amobbs.com/bbs_upload782111/files_3/armok0166526.jpg
-----此内容被Jacky于2005-08-31,20:30:19编辑过 哦,看来我还的另外装一个拉!谢谢! 好像没有破解的列!有没有咯!浪子,能把你的破解版传上来,共享,行不咯! 那个液晶啥型号,多少钱一块呀,谢谢,我喜欢上了它 将以上范例改写为winavr下的代码。(未测试)
点击此处下载armok0166586.rar
可以用PN打开项目。 LCM128645,北京青云创新科技生产,零售价120左右,建议购买成都飞宇达的,与之兼容(管脚不兼容),大概90多吧,还有几种颜色可选,北京网上中发也有买的 烧入16楼的HEX代码测试了一下,系统一直不停的复位 英雄
楷模 顶一下,别让他沉下去了! 谁把他改成GCC或ICC的撒! 致敬,等待你12864液晶的例子!!! 不简单, 真是精神可嘉.
还有我也是用ATMANAVR的人, 再次感谢你. to: fangmcu 方谭
12864范例早已经贴出来了呢 有很多厂家作LCD,128X64的30~40元,只是没有外框(放在设备里面也不需外框)。我们公司用的很多。 不错的东西!好!顶了! 支持支持~
我也期待自己的这一天,嘿嘿~~./emotion/em005.gif 如此好贴真不简单,谢谢楼主。不过对滤波算法不太理解, 25楼,avr1008你好,能否给出128X64 30~40元的厂家联系方式? 这个贴子怎么掉下来了啊.找了半天才给找回来.浇点水!!
感觉像是用来做空调或制冷机类控制的吧.
-----此内容被gongcsf于2005-09-25,20:12:07编辑过 好啊!我喜欢! 看到了,谢谢 不错,挺好。 现在很少有这样的开源精神的人了。支持一下! 支持,是呀精神可佳,学习...... 强烈支持 好,顶上去! 晕~~~函数dtostrf()在什么地方??? include <stdlib.h>
char *dtostrf (double __val, char __width, char __prec, char * __s); 我顶! 向楼主致敬!
ATMANAVR4.5的破解版在哪里可以下到?我的是4.4的 没找到破解 用的郁闷死 ./emotion/em040.gif
有ICC版本的代码吗? 可以上网找一个破解包。
ICC的版本没有 谢谢的紧 楼主好样的!向你学习! 好帖 对于AD值的处理,我使用了一种自己摸索出来的滤波方法,对于AD值在正负2以内的跳动非常有效。具体如下实现:用一个来存放上一次AD转换的值,每次显示AD值时都要拿本次的AD值与last_ad做比较,若比last_ad大1,则本次值减1,大2则减2,依此类推,并把处理之后的AD值放入last_ad中作为下次比较的值。
我也来聊下对于AD显示数据跳动的处理吧 同样是用全局变量last_ad但我还加多两个标志位和一个计数寄存器 标志位用来标志数据是上升还是下降计数寄存器用来计算上升或下降时比较的次数AD值计算出来后 与last_ad 比较上升还是下降标志不同的标志位同时计数寄存器加1当然显示数值由“升转降或 “降转升”都清计数寄存器 连续为升且计数寄存器为3次以上才能变化否则不变 并把处理之后的AD值放入last_ad中作为下次比较的值 这样可以减少显示跳动的次数 呵呵...继续浇水...支持 那个LCD真的不错,清晰度很高!很清爽 滤波程序也不错.刚试了一下,效果很好.谢谢楼主和linzhai 顶! 好帖,感谢楼主 感谢LZ的无私奉贤顶在说 3Q!感谢楼主。 真不错
顶 不错的东西,下载试试 来晚了,下载中。谢谢,4-20mA的电流信号检测。这东西是不是用在反应炉什么上的?
但是看图片你没做一个硬件异常保护措施。万一超温超压怎么办?如果是真的是反应炉,爆了可就惨了。如果只是负责显示和报警的功能,那就没什么事,嘿嘿,当年在学校的时候俺没考虑到,结果烧了学校3W多,被骂了好几个星期。(新手,问错不要骂。嘻嘻!毕业到现在没碰过工控。白学那专业了)
-----此内容被chen112于2006-08-04,14:01:36编辑过
-----此内容被chen112于2006-08-04,14:02:22编辑过 先支持再看! 高手啊! 看看先! 衷心感谢! 好,谢谢楼主.download来看看 好,收藏了。
只是:滤波程序不理解,那样的分度不就是3了吗? 滤波程序不会改变分辨率的,分辨率还是1,只不过更稳定了 to :chen112
不是用在反应炉上的,只用来显示。
如果用来控制带有一定危险性的压力容器我们一般使用两个传感器来测量压力,一个4-20mA输出的用来测量具体的数值,兼做保护。一个开关量输出的压力传感器,用来做到达极限压力时最后的保护。以避免其中的一个传感器失效时出现爆炸事故。并且压力容器一般还会设置机械安全阀,所有的电子控制测量手段失效后机械安全阀会排出压力。
-----此内容被Jacky于2006-08-25,10:47:32编辑过 支持开源! 很好! 对于这个帖子我是坚决要顶,从中得到很多启发,因为是刚搞AVR,整整一个月,参考网上例子,一个控制项目马上就要完工了。滤波程序帮我解决了大问题,困扰了我一周。终于稳定了。OK, 顶 请问12864液晶的驱动文件在哪儿呢?谢谢! 十分感谢楼住的的无私奉献!
向楼主学习! to starfan :搜索一下我的帖子,有一个LCD的范例,里面就有驱动,这个帖子也有,慢慢找 好东西呀,我是新手,顶个先!! 好东西,顶 好东西,收藏。。
这才叫无私嘛。
呵呵 楼主你好!
看到你的范例觉得很好,但是您知道RCV420芯片到那能买到吗??我在沈阳,电子市场没有。谢谢!
我得EMAIL:chengbaozhigy@163.com 非常感谢楼主的这种精神。 谢谢 学习了,等看了再发问请教,真是好人!!! 多谢楼主的分享,呵呵,晶土电子之前送了一套5.x的正版AtmanAVR给我,正好作为参考! 如果大家都有这种精神,中国腾飞,指日可待啊! 好东西,感谢楼主!! 好东西,感谢楼主!! 确实不错,但是WinAVR无法编译啊楼主!
-----此内容被fuanzwg于2006-10-31,13:18:50编辑过 实在不好意思。这段没有看懂。
uint read_ad( uchar channel )
{
uint ad;
uint sum_ad = 0;
uchar i = 0;
for( i=0;i<50;i++ )
{
ad = ( read_adc(channel)>>6 );//右移6位?
sum_ad += ad;
asm("wdr");
}
...
...
} 继续顶啊 感谢楼主的无私,向楼主学习 hao 多谢搂住边城浪子强人!!! 顶顶哈,如此好贴,高手才鸟公享 十分感谢楼住的的无私奉献! 谢谢! 谢谢! 感谢楼主 感谢楼主 十分感谢楼主的的无私奉献! 你好啊。你用的是什么压差传感器?怎么没有看到型号?麻烦告诉一声。谢谢。 ding! 记号 GOOD! 楼主好样的,顶一下
给好帖增加点生命力