AVR综合应用实例:[原创] 基于Atmega88的 迷你多功能仪表
受L_C_CE_METER制作资料的启发,决定设计制作一款功能更强的迷你测量仪为了追求精简,精确,多功能,费尽了心计,经过半年时间的不断试验摸索,终得一果,心中充满喜悦
发帖与大家分享
所有程序都已调试完成,原理图也整理好了,但我对于如何把原理图(PROTRL格式),照片贴上来
竟是不知道如何操作,请哪位先指教一下
关于开源问题:全部是汇编,交流比较困难,程序比较复杂,我回答问题也会吃力
打算逐步分模块介绍实现原理和编程思路,与大家一起探讨
先把实现的功能,性能指标介绍如下:
1. L_METER测量电感,原理和方法与L_C_CE_METER制作资料相同
分辨率0.1uH,测量范围0-----16H
2. C_CE_METER 测量电容和电解电容的电容量以及电容的漏电阻
分辨率1P,测量范围0-----10000uF
测量时不用区分 C,CE,也不用区分容量大小,一键操作
3. F_METER 测量频率,在 0-----1000kHz 全量程均显示********.***Hz
取样时间>1秒,测量结果稳定精确,与示波器显示值完全一致
4. 0---5V 电压表分辨率 1mV测量结果稳定
5. 0---65M 电阻表 分辨率 1 欧姆测量结果稳定
6. 基于DS1302的日历时钟以及对时功能和设定功能
7. 采用热敏电阻构建的温度计 分辨率 0.01度测量结果稳定
准确度依赖分度电阻表数据
8. 120Hz-----2000kHz 方波信号发生器
9. 1Hz------40000Hz正弦波信号发生器 无图无真相 本实例用到了AVR单片机的大部分资源和指令,并形成一个有实用价值的项目
所以称其为AVR综合应用实例
其采用的元件很少,MCU配置很低,顾冠以"迷你"
通过本实例,我想证明两点:
1.AVR 很好,很强大
2.ASM 很好,很强大 貌似很强大 期待上资料 "1Hz------40000Hz正弦波信号发生器"
应为:
1Hz------4000Hz正弦波信号发生器 争取明天能把原理图发上来
(晚上不在的) mark 期待中 被成功忽悠的漂过~~~ 继续跟踪。。 表示关注 支持!!! 期待。。。。。 期待中,看看 http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492173.JPG
原理图 (原文件名:Mini_meter_sch.JPG) 哈哈,终于明白如何"贴"图了,原来一直没注意发言框下方的"上传文件....",晕! 期待 期待 服了你了,图的分辨率太小,字看不见呀。把图改成pdf格式传上来行吗?要不我帮你转。 结合原理图作如下说明:
芯片: M88@16MHz
显示器: LCD1602,六线驱动模式
键盘: 四键ADC键盘,分别是 执行键EXEC,模式切换键MOD,加(INC),减(DEC)
DS1302时钟:独立的单元,可以摘除而不影响其它模块工作
串行下载接口兼LCD接口,未经验证
LM393,一路用于测电感,一路用于测温度
RS487,备用,INT0引脚(PD2)备用
工作接口:公共端COM,正弦波信号输出端SINE_WAVE,电感/频率输入端F_L_METER,
其它信号输入输出端OTHERS(原理图中L_METER应为F_L_METER)
其它就只剩下电阻电容了 回18楼:请把转换的方法说一下,我好再学一着 mark! 我用这个Acrobat_8_Pro.iso制作pdf,挺大的400M吧,你可以网上下,它可以读写pdf文件。可以吧其他文件转换成pdf,安装好后你会发现你多了一个打印机,一个虚拟打印机,吧文件打印成pdf。 mark protel99se的sch文件ourdev_492211.rar(文件大小:8K) (原文件名:Sheet3.rar) 原理图已上传,有兴趣的自己打开看吧,欢迎拍砖
需要说明的是,该制作属于学习型的,自娱自乐,山寨版作品,与真仪器的要求相差很远
各位拍砖时还望手下留情 很强的说!
手机上的,回去在研究 快快完成,俺们好仿一个。:D 谢楼主分享,顺便转换成PDF格式方便需要的兄弟们^_^
基于Atmega88的 迷你多功能仪表PDF格式ourdev_492233.pdf(文件大小:19K) (原文件名:main.pdf) 用手机拍了一些照片,以证明项目的真实性,效果好坏就不计较了
我在一块洞洞板上搭接了两套实验电路,都经过多次改动,所以很乱,难以见人所以都在镜头外
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492285.jpg
启动界面 (原文件名:IMG0244A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492286.jpg
日历时钟温度显示 (原文件名:IMG0245A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492287.jpg
测104电容 (原文件名:IMG0246A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492288.jpg
测某电感 (原文件名:IMG0247A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492289.jpg
测该电感时用频率计测得的频率值 (原文件名:IMG0248A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492290.jpg
输出方波 (原文件名:IMG0249A.jpg) http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492309.jpg
(原文件名:IMG0250A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492310.jpg
(原文件名:IMG0251A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492311.jpg
(原文件名:IMG0252A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492312.jpg
电压表,测DS1302的后备电池 (原文件名:IMG0253A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492313.jpg
测3.9欧电阻 (原文件名:IMG0254A.jpg)
http://cache.amobbs.com/bbs_upload782111/files_20/ourdev_492314.jpg
测100K电阻 (原文件名:IMG0255A.jpg) 非常好哦! 很好!MARK! LZ能介绍下原理么? 任何方面的原理和实现方法我都会介绍和回答
各位可以先看原理图,做一些思考
抱歉我晚上都不在线的 期待...... 不错 一、电容测量原理:
"电容的测量是基于对RC电路的时间常数的计算,由脉冲电路原理可知,电容的充电速度与R和C的大小有关,R与C的乘积越大,过渡时间就越长。这个RC的乘积就叫做RC电路的时间常数τ,即τ=R∙C。"----摘自"用M8制作电感,电容,电解电容测量仪表"
测量的原理就是:由被测电容和一确定的电阻组成的电路上加脉冲电压U,测量电容上电压从零升至0.632U所需时间τ
则有:C=τ/R 若R的单位用欧姆,τ的单位为秒,则C的单位为法拉
本制作采取测0.5τ
所需比较器采用M88内部的模拟比较器
0.5τ对应的比较电压为0.3935U,该电压由R5,R6建立并接到AIN1引脚
由比较器输出内部触发T/C1捕捉,获得时间测量值:TCNT1H,TCNT1L
期间如发生T/C1溢出,说明C太大,数据溢出,则改变T/C1的预分频系数或切换所用电阻R9改为R8
改变以后经过放电,重新测.由此实现从0p-----10000uF的自动适应
如何放电?----相关I/O口输出低电平即可,R0的作用是减小放电时的冲击电流 二.电压表,电阻表,电容漏电阻测量原理:
由原理图可知,电容测量接点(OTHERS)经R3接到ADC_1,后台运行的ADC模数转换程序随时将该点电压值转换,
并经过数字滤波,获得的测量值存放在相应单元,应用程序随时可以调用
经过计算就可得到电压或电阻的测量值 谢谢 顶 三. 温度测量
采用NTC热敏电阻
本制作与众不同的地方在于:
不经过转换成电压,然后ADC转换得到结果
而是采用测电容相同的原理,只不过是已知C反过来求得R,所以就是测量电阻
这种方法得到16BIT分辩率,高于ADC的10BIT
测量电路由热敏电阻R1,电容C13,电压比较器U3B组成
电压比较器U3B的输出接M88 PB0,用捕捉功能
电阻测出来以后通过查表加插值计算,获得分辩率至0.01度的温度测量值 自己顶一下
继续阐述觉得没动力了,看看情况再说
另外,稍后我会提供.hex运行文件 支持,LZ出个套件吧。
电感测量原理能介绍下么? 测量电感,原理和方法与L_C_CE_METER制作资料相同
可在本网站搜该帖,里面有详细说明
电路图也相同,参数有些不同C9=22000P,对照资料中为1800P
L1=20uH,对照资料中为86uH 感谢楼主,为了支持楼主,我向楼主和大家推荐个软件,这个软件安装后,你的打印机列表会增加了一个pdfFactory Pro,我喜欢把它设为默认的打印机,打印的东西(包括PROTEL, AUTOCAD)可以打印成PDF格式,方便传输,修改,也可以从它哪儿选物理的打印机打印。点击此处下载 ourdev_493391.rar(文件大小:2.51M) (原文件名:PDF_Factory_Pro_v2.50.rar) PDF版本的原理图在28楼已经有了
谢谢楼上的软件 这个软件不错,比我那个小多了~ 强悍 好,顶一下 呵呵,居然快沉到海底了! 我帮顶 好东西。支持LZ顶 谢谢 也许有人怀疑,如此简单的制作,测量的精度,稳定性究竟如何?
现在我来介绍一下频率计的测量精度以及实现方法:
我在一楼这样表述:
测量频率,在 0-----1000kHz 全量程均显示********.***Hz
取样时间>1秒,测量结果稳定精确,与示波器显示值完全一致
也许有人会说这0.001Hz的分辩率是虚假的,是故弄玄虚,可是我要告诉你,这是真的!
我在上面发的图片中有一测频率的例子,在该例情况下,连续反复测量几十次,
测量值的波动仅有0.008Hz
当然在频率较高的情况下,0.001Hz的分辨率没有多大意义,但在几赫兹几十赫兹时却是必须的
请看下面的方法:
输入信号经过整形变为等间隔方波脉冲,本制作中由LM393完成
精确的1秒延时;本制作的1秒延时程序采用统计1000个1ms定时中断的方法,不受其它中断影响
联合使用测频率法和测周期法:先测量周期,同时完成与信号沿同步,再测量频率(延时1秒),
接着立即测量"半周期",获取频率值的小数部分数据
计算得到测量结果
各位路过的高手请发表见解 mark 楼主能上传NTC测温那部分程序上来吗?贪心问多句:
温度查表的代码如何弄的? LZ整个套件吧,俺可以当仪表用。 本制作中采用了ADC键盘,目的是为了节省I/O口,并非这ADC键盘有什么好,相反是有缺点
这时钟也不实用,学习学习而已,如果去掉,省下的端口可改为键盘信号输入
我的ADC模数转换模块是这样工作的:
ADC中断读取数据,切换通道,但不启动转换
1ms定时中断里启动ADC转换,判断中断次数是否等于32*通道数,等于的话则更新测量值
每通道每次测量值读取后累加到该通道的累加和保存单元,累加32次的结果为测量结果
另外存放到测量结果单元,这样一来,工作程序不要考虑和干涉ADC,可从测量结果单元
随时调用任一通道测量值 //***************测温******************
.DSEG
r_tested_h: .byte 1
r_tested_l: .byte 1
ts: .byte 1 ;tempreture0~120 of -20~100
tem: .byte 1 ;温度
td: .byte 1 ;小数部分
.CSEG
TEMP_UPDATE:
in temp,DDRB ;SETTING ICP1
anditemp,0xFE
out DDRB,temp
sbi PORTB,0
lds temp,ACSR
anditemp,~(1<<ACIC)
ldi temp,0 ;禁止t2,adc中断
sts TIMSK2,temp
;ini_t1:
clr temp
sts TCCR1A,temp
sts TCCR1B,temp
lds temp,TIMSK1
ori temp,1<<TOIE1|1<<ICIE1
sts TIMSK1,temp
clr temp
sts TCNT1H,temp
sts TCNT1L,temp
cbr FLAG,1<<t1_ovf ;清中断发生标记
cbr FLAG,1<<ac_comp_out
ldi temp,1<<ICES1|1<<CS10
sts TCCR1B,temp
sbi PORTC,CE
wait_cap: ;等待中断
wdr
sbrcFLAG,t1_ovf
ret
sbrsFLAG,ac_comp_out
rjmpwait_cap
cli
cbi PORTC,CE
in temp,DDRB
ori temp,0x01
out DDRB,temp
cbi PORTB,0
ldi temp,1<<TOIE2
sts TIMSK2,temp
ldi temp,0x00
sts TIMSK1,temp
clrr1 ;数字滤波
movr2,xh
movr3,xl
lsrr2
rorr3
lsrr2
rorr3
ldsyh,r_tested_h
ldsyl,r_tested_l
lsryh
roryl
lsryh
roryl
ldsxh,r_tested_h
ldsxl,r_tested_l
subxl,yl
sbcxh,yh
addxl,r3
adcxh,r2
stsr_tested_h,xh
stsr_tested_l,xl
ldsr2,temp_factor_h;乘系数(<1)校准,电容选用比标准值偏大一点
ldsr3,temp_factor_l
rcall MUL16
ldiwz,(2*t_r_table);查表
lds temp,ts
dec temp
ldi temp3,2
mul temp,temp3
add zl,r0
adc zh,r1
dec temp
find_match:
inc temp
lpm r7,z+
lpm r6,z+
mov r2,xh
mov r3,xl
sub r3,r7
sbc r2,r6
brlo find_match
dec temp ;插值计算
sts ts,temp
sbiwz,4
lpm r5,z+
lpm r4,z+
mov r0,r4
mov r1,r5
sub r1,xl
sbc r0,xh
clr r2
clr r3
sub r5,r7
sbc r4,r6
rcall DIV16 ;计算小数部分值
lds temp,ts
cpi temp,20
brshplus_d ;正负调整
clr r0
clr r1
sub r1,r3
sbc r0,r2
mov r2,r0
mov r3,r1
plus_d:
rcall CONV3 ;二/十进制转换
sts td,r4
lds temp,ts
ldi temp3,20
sub temp,temp3
brminegtive
rjmpplus
negtive:
com temp
plus:
mov r3,temp
clr r1
clr r2
rcall CONV1 ;二/十进制转换
sts tem,r7
ret
t_r_table:
.dw 65535,65535,65535,65535,65535,64271,60922,57771,54806,52014
.dw 49383,46904,44567,42363,40283,38319,36465,34713,33057,31491
.dw 30011,28610,27284,26028,24839,23711,22643,21629,20669,19757
.dw 18891,18069,17288,16546,15840,15170,14632,13925,13347,12797
.dw 12273,11774,11298,10845,10412,10000,9607,9231,8873,8530
.dw 8203,7891,7592,7307,7034,6773,6523,6284,6055,5836
.dw 5626,5425,5232,5048,4871,4700,4538,4382,4232,4088
.dw 3950,3817,3689,3567,3449,3336,3227,3123,3022,2926
.dw 2832,2743,2656,2573,2493,2416,2342,2270,2201,2135
.dw 2071,2009,1949,1892,1836,1783,1731,1681,1633,1586
.dw 1541,1498,1456,1415,1376,1338,1301,1266,1231,1198
.dw 1166,1135,1104,1075,1047,1020,993,968,943,918
.dw 895,872,850,829,809,788,0
//******************************* 分度电阻表t_r_table中的数据不一定对,我是用公式算的,10000对应25度
只要该表数据正确,测出来的温度就会正确 mark 怀疑测量电容的准确性,不信可以试一试:在电容上串一只电阻看容量值是否改变,期待楼主的结果 做点pcb大家一起玩吧,看汇编头大。要是手头有这个成品就有兴趣了改c程序了。 哈哈,和hzn1948是同道阿!汇编个头小,速度快,个人感觉很好! 回62楼:你的要求有点苛刻,电容串了电阻我想就是用专业仪器也不会有相同的结果
也许我依据的测量原理使得串电阻的影响比较大一点(测量值偏小直至失去意义),并联电阻也会影响(测量值偏大)
我无法评价这种情况与专业仪器之间差距有多大
串联电阻的情况下,电容值愈大,影响也愈大(充电电流大,电阻上压降大)
试验数据如下:104电容,1K电阻,相差百分之二;10K电阻时相差百分之十
1000uF电容已无法测量而出错 回63楼:做PCB我觉得还没考虑成熟,我正在考虑进一步扩充使之成为一款使用方便,功能强大,有众多应用实例支持的学习开发板
目前这一部分不再改变,打算增加一片M88(或M16),互相通讯并增加其它功能,希望大家来出主意
有兴趣按本制作的原理图为硬件平台开发C应用程序的话,现在就可以行动了 关注。 怎么没穿酷子呀? 关注! 回68楼:
不穿裤子比穿裤子好,功能强大与否一目了然 如果你想这样扩展的话,不过加个ATmega128,再加个usb芯片比如d12,加个段式液晶,加个3.2寸的液晶接口。接个红外的接受头。再加个4x4的键盘。sd卡读写口。这样就差不多了吧。然后128的引脚都引出来。 楼上是否能考虑不要用M128,我倾向于用M16
理由:不宜太复杂,精简是原则
便于用直插器件,作为学习板有直观和方便更换的好处
扩展的FLASH存储器件应满足脱机烧写和语音/音乐实验需要
接个红外的接受头。再加个4x4的键盘-----这可以定下来
引脚都引出来-----不要引出来,尽量将能做的实验预先考虑设计好,这是区别于其它的特色 【42楼】 hzn1948
积分:297
派别:
等级:------
来自:
自己顶一下
继续阐述觉得没动力了,看看情况再说
另外,稍后我会提供.hex运行文件
2009-10-19,08:49:42
楼主什么时候上HEX呀 mark 【62楼】 kevintang
怀疑测量电容的准确性,不信可以试一试:在电容上串一只电阻看容量值是否改变,期待楼主的结果
————————————————————————————————————————
问题是没搞清电容测量原理。
假如测量用充电电阻改为恒流源效果更好,所费也不多;另外制作时电容测量驱动采样用四线制更能提高精度。 用恒流源充电的好处不明显,恒流源用的元器件多,业余条件下精度不会高,而电阻充电,只要这一个电阻准就可以了
另外楼上所说"电容测量驱动采样用四线制",能否进一步说明一下 楼主最好做个PCB,大家一起公摊费用好了。 楼主定下原理图,我们讨论下,然后画板,最好做到10x10的。这样打样也就100元10片。最近我们最好讨论电路设计,尽快定下来,东西拖到最后都不了了之了。
我的意见是,用M16尽量简洁我同意,但是我还是觉得把引脚引出并且尽量容易扩展才好。 8. 120Hz-----2000kHz 方波信号发生器
9. 1Hz------4000Hz正弦波信号发生器
对这个有点兴趣,应该输出的频率不是连续的吧? 下面的网页上有与本制作同类型的资料
推荐大家去看看,集思广益,然后再来这里讨论,取长补短,完善本制作
http://218.16.124.207/bbs/bbs_content.jsp?bbs_sn=3659526&bbs_page_no=1&bbs_id=3041 回79楼:
目前的程序比较不连续,因为受输入手段的限制,只有加/减控制,为了兼顾调节的速度
在连续性太好时加大了步距
另外,数字式控制本身产生不连续,不连续的程度在不同的频率范围是不同的
例如方波在最高频率2000KHZ一下子降到1600KHZ,然后1330,1142.....
本制作是用T/C0(T/C1 比较输出引脚被LCD1602使用)
如果用T/C1,就有办法改善 与大家分享一个深刻的经验教训:
手册里有一段话,....即使不用ADC,引脚AVCC也应与VCC相连接....
我为了证实我提供的原理图和初步设计的PCB是否有错,按PCB布局搭接了一块新的实验电路
但我采用分步的方法,先连接了与LCD1602相关的部分,然后通电试验,结果只有一行黑块
怎么弄都不行,郁闷了两个星期,首战失利就没继续下去
不知怎么想起AVCC引脚未连接可能有问题,直接连了一根线-----OK! 但是我有没接AVCC的,4位数据线的LCD1602一样正常工作阿。 不知楼上是否是M88直插
我又试了一次:重新将该连线剪断,回到变成一行黑块,再焊上就又好了 记号一下 MARK 是pdip的m48,见《用M8制作电感、电容、电解电容测量仪表》
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3279392
可能m48和m88不一样吧 究竟是M48还是M8?资料上用的是M8呀
M8和M88不一样很有可能,M48和M88应该一样啊 我做的是仿的,用的m48,在【186楼】
不过那个hex计算有BUG^_^ 为了弄清真相,我做了进一步试验,将原来16M外部晶振改为内部8M(只改融丝)
LCD1602工作正常,而且AVCC可以不接VCC
两种频率设置下如果AVCC不与VCC相连,用表量得AVCC脚的电压均为4.2V,而VREF脚电压不同
16M时VREF电压0.1V,8M时VREF4.2V
M88手册中还有一处,电气性能参数中说到AVCC允许最低电压为VCC-0.3V
所以还是按器件手册的要求处理AVCC为好,免得出莫名其妙的问题 没有弄明白的莫名其妙的问题还有一个:
在我的制作里,测量电容时如果电容很小,例如100P,测量结果会发生跳变:
100,115 两种结果交替出现
程序反复检查了不知多少遍了,仍未找到合理的解释
这也是至今未上传HEX的原因
有感兴趣的高手请帮助分析分析,有哪些可能的原因
测小电容时,1P相当于一个CPU周期0.0625us
模拟比较触发T/C1捕捉
望高手指教,先谢了! 如果用频率测小电容的话,100P跳变时,看频率各是多少,查查问题出自硬件还是软件。 我测电容时没有相关的频率的
请看我前面帖子的说明:
"2. C_CE_METER 测量电容和电解电容的电容量以及电容的漏电阻
分辨率1P,测量范围0-----10000uF
测量时不用区分 C,CE,也不用区分容量大小,一键操作"
"测量的原理就是:由被测电容和一确定的电阻组成的电路上加脉冲电压U,测量电容上电压从零升至0.632U所需时间τ
则有:C=τ/R 若R的单位用欧姆,τ的单位为秒,则C的单位为法拉
本制作采取测0.5τ
所需比较器采用M88内部的模拟比较器
0.5τ对应的比较电压为0.3935U,该电压由R5,R6建立并接到AIN1引脚
由比较器输出内部触发T/C1捕捉,获得时间测量值:TCNT1H,TCNT1L
期间如发生T/C1溢出,说明C太大,数据溢出,则改变T/C1的预分频系数或切换所用电阻R9改为R8
改变以后经过放电,重新测.由此实现从0p-----10000uF的自动适应 " 是不是放电时间不够?
要不一直测量,拿去极值平均值来显示? 别停呀,大家讨论起来 mark mark 印记一下,学习 MARK