ATMAGE16内部ADC的使用程序_第1页
ATMAGE16内部ADC的使用程序_第2页
ATMAGE16内部ADC的使用程序_第3页
ATMAGE16内部ADC的使用程序_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、atm age 16内部adc的使用程序程序说明:木例程是控制atmage16内部的 ad进行转换,然后将转换结果转换成 电压,显示到数码管上。木人刚开始用avr这是写的第一 个程序,可能思路上会有很多问题, 忘个位网友看后指出,我的邮箱是 462511238欢迎和我交流。写这个程序的目的是为了用ad采 集一个模拟量,在网上看了些历程, 很多都是用查询发写的。就是启动 adc转换以后,等待adc转换完成, 然后就将数据读出,显示出来。这种 程序也就只能自己玩玩,毫无实用价 值。因为在实际产品中,会有很多干 扰信号,采集一次就显示,得到的数 据往往是干扰信号。要消除这些干扰, 需要在adc的输入

2、通道上加上滤波电 容,当然更重要的是在程序中进行处 理。这也就是所谓的数字滤波了,由 于单片机运算能力有限,很多pc上的 一些算法对于单片机来说就过于复杂 to我在这个程序中,只是采用多次 采集数据,然后求平均值的算法进行 最简单的滤波的,但这在要求不高的 场合已经能够满足要求了。采用查询法,一直查询adc是否 转换结束是非常浪费cpu时间的。因 此我们需要开启adc的中断,但是每 隔多久进行一次转换呢,一直都不停 的转换,其实对我们得到准确的数据 意义不大,(我采集的是桥式应变片经 过差分放大的信号)。并且数据刷新太 快,用于显示,会给人不稳定的感觉, 还没看清楚显示的是什么,就乂刷新 to

3、由于avr的adc可以用定时的 溢出来触发转换。于是我想到,用定 时器来定时,每隔0.1s采集一次,1s 刷新一次显示,也就是每次显示的数 据是采集十次数据的平均值,这样做 出来还是比较稳定的。程序实现思路:将atmage16的定时器1设置为 普通计数模式,并且将时钟256分频 作为定时器1的工作脉冲(我采用的 是4mhz晶振)。然后将adc设置为 定时器1溢出触发,当定时器溢出后, 将触发adc转换,adc转换完成后, 进入adc中断,读取数据,并对定时 器进行重装初值。这样,就可以保证, 每次进行adc转换的间隔时间基木是 一样的。连续转换十次以后,将达到 的数据求平均值,就是我们要的数据

4、。下面是木程序的全部源代码,加注 释,显示函数可以完成送入任何一个 数据,自动显示。包括判断小数点的 位置。由于显示函数比较简单,所以 没有注释,忘谅解。程序说明:公司:宁水科技项目:小流量侦测传感器开发人:徐飞飞功能描述,采用定时器1作为adc的 触发源,每隔0.1秒触发一次ad转换,转换15次以后将 其求平均值,输出到数码管显示。使用到了 avr单片机的 adc转换完成中断和定时器1的普通计数模式。* a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a * *

5、 a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a * * a */#include<iom 16v.h>#include"show.hn#include <macros.h>#pragmainterrupt_handleradc_conventer: 15uchar num二0;float buffer=0.0;float result=0.0;uint addata=0;void adc_conventer()/ad 转换中断 程序,当定时1发生溢

6、出时,将触发 ad转换,连续十次转换,将得到的结 果取平均数,然后保存到result中addata=adcl;addata=addata+adch*256;/ 进入 中断程序以后,先从adc的结果寄存 器重读出adc转换的值tcnt1h 二0xf9;tcnt1l二0xe4;/对定时器进行重 装初值,确保每次触发转换的时间基 本一致buffer+=addata:5/1024.0;/ 算 出 当 前adc转换对应的电压值if(num>=15)result 二 buffer/15; result=result-0.073; if(result<=0)result=0.0;num=0;bu

7、ffer=0.0;num+;void init_adc()/对 adc 进行初始化 的函数ddra&二bit(o);porta&二bit(0);将端口进行初 始化,设置为输入模式,并且关闭上 拉admux=0xc0;/设置 adc 转换的 参考电压为内部参考电压sfior|=bit(7)|bit(6);/设置 adc 转换的触发方式为定时器一溢岀触发timsk|=bit(2);/ 开启总中断adcsr|=bit(aden)|bit(adate )|bit(adie);/使能adc转化器,允许 adc被自动触发,开启adc中断 void init_timerl()tccr1b=o

8、xo4;/设置定时器1的 时钟源tcnt1h 二0xf9;tcnt 1 l=0xe4;/为定时器装初值sregi二bit;开启定时器1的 中断(用定时器1的溢出作为adc的 触发源,必须要开启定时器1的中断 否则不能触发)int main()init_adc();init_timerl(); while(l)show(result);return 0;portd|=oxff;程序说明:公司:宁水科技项fi:小流量侦测传感器开发人:徐飞飞功能描述:将送入的任何一个数据可 以直接显示到数码管上,程序自动完 成小数点位置的判断if(num<=9999)&&(num>=10

9、00) temp=num; for(i=0;i<4;i+)portc|=oxof;portd=duan f temp% 10;portc=weii;temp=temp/10;portd| 二 oxff;uchar wei =0xf7,0xfb,0xfd,0xfe;ucharduan=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,ox79,0x71;uchar error= oxco,0x88,0x88,0x86;void show(float num)uchar i;uint temp;ddrd

10、=0xff;ddrc=0x0f; portd|=oxff; portc|=oxof;if(num>9999)for(i=0;i<4;i+)portc|=oxof;portd=errorfi;portc=weifil;if(num<=999.9)&&(num>= 100.0)temp=n um*10; for(i=0;i<4;i+)portc|=oxof;portd 二duantemp%10; portc=weii;temp=temp/10; portd| 二 oxff; portc|=oxof; portd=ox7f; portc=oxf7;if(num<=99.99)&&(num>= 10.00) temp=n um*100;for(i=0;i<4;i+)portc|=oxof;portd 二duantemp% 10; portc=weii;temp 二 temp/10;portd|=oxff; portc|=oxof;portd=ox7f; portc=oxfd;if(numv=9999)&&(num>=0.000)temp 二 num* 10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论