📄 avr模拟比较器使用范例.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<!-- saved from url=(0047)http://www.avrvi.com/avr_examples/avr_comp.html -->
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>AVR 新手入门</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="AVR 新手入门 单片机 AVR与虚拟仪器网站提供" name=description>
<META content="古欣 guxin[at]mail.sdu.edu.cn" name=author>
<META content="AVR 单片机 新手入门 手把手教程 avr程序 avr范例" name=keywords>
<STYLE title=css_design_by_guxin type=text/css media=all>@import url( ../inc/article.css );
</STYLE>
<LINK media=all href="AVR模拟比较器使用范例.files/article.css" type=text/css
rel=stylesheet>
<META content="MSHTML 6.00.2900.3199" name=GENERATOR></HEAD>
<BODY>
<DIV class=m>
<H1 class=c>AVR与虚拟仪器 www.avrvi.com</H1></DIV>
<DIV class=m>
<DIV id=head>
<P class=c>AVR与虚拟仪器致力于提供最优质的AVR和labview技术服务,最全的技术资料,最好的开发板方案。</P>
<P class=c>我们将以AVR DB-CORE Ver2.3 Atmega16开发板为平台,一步一步,教会大家AVR单片机编程。</P>
<P class=c>本站所有范例都采用ICC编写,ICC编译器加AVR Studio下载调试,下载器为JTAG&ISP下载编程器。
</P></DIV></DIV>
<DIV class=m>
<DIV id=now>你现在的位置:<A href="http://www.avrvi.com/">AVR与虚拟仪器</A>>><A
href="http://www.avrvi.com/index_avr_examples.html">AVR使用范例</A>>>AVR模拟比较器使用范例<SPAN><A
title=AVR与虚拟仪器论坛 href="http://bbs.avrvi.com/">论坛</A></SPAN></DIV></DIV>
<DIV class=m>
<H3>AVR使用范例--AVR模拟比较器使用范例</H3>
<DIV class=pad10>
<P>AVR的模拟比较器模块可以用来比较接在AIN0(mega16 PB2的第二功能)和AIN1(PB3)两个引脚的电压大小。<BR>程序操作流程:初始化
>> 开中断 >>
中断服务程序判断,比较结果将会同步到<BR>模拟比较器控制和状态寄存器-ACSR的第五位ACO,检测ACO的值就可以得出比较结果。AIN0<AIN1(ACO=0);AIN0>AIN1(ACO=1)
<P>论坛相关链接:<A
href="http://www.avrvi.com/bbs/read.php?fid=30&tid=1569&toread=1">http://www.avrvi.com/bbs/read.php?fid=30&tid=1569&toread=1</A><BR>
<HR SIZE=1>
// ICC-AVR application builder : 2007-3-15 8:22:58<BR>// Target : M16<BR>//
Crystal: 7.3728Mhz<BR>// AVR 模拟比较器使用范例<BR>#include <iom16v.h><BR>#include
<macros.h><BR>#include "delay.h"
<P></P>
<P>//管脚定义<BR>#define LED0 0 //PB0<BR>#define AIN_P 2 //PB2(AIN0)<BR>#define
AIN_N 3 //PB3(AIN1)</P>
<P>//宏定义<BR>#define LED0_ON() PORTB|= (1<<LED0) //输出高电平,灯亮<BR>#define
LED0_OFF() PORTB&=~(1<<LED0) //输出低电平,灯灭</P>
<P>//常量定义<BR>/*<BR>模拟比较器的正输入端由 ACBG位决定,=0选择AIN0引脚,=1选择1.23V内部能隙基准源</P>
<P>模拟比较器多工输入 (不常用,因为ADC将无法使用)<BR>可以选择ADC7..0
之中的任意一个来代替模拟比较器的负极输入端。<BR>ADC复用器可用来完成这个功能。<BR>当然,为了使用这个功能首先必须关掉ADC。<BR>如果模拟比较器复用器使
能位(SFIOR 中的ACME) 被置位,且ADC 也已经关掉(ADCSRA 寄存器的ADEN 为0),<BR>则可以通过ADMUX 寄存器的MUX2..0
来选择替代模拟比较器负极输入的管脚,<BR>如果ACME 清零或ADEN 置位,则模拟比较器的负极输入为AIN1。<BR>*/<BR>#define
AC_ADC0 0x00 //ADC0<BR>#define AC_ADC1 0x01 //ADC1<BR>#define AC_ADC2 0x02
//ADC2<BR>#define AC_ADC3 0x03 //ADC3<BR>#define AC_ADC4 0x04 //ADC4<BR>#define
AC_ADC5 0x05 //ADC5<BR>#define AC_ADC6 0x06 //ADC6<BR>#define AC_ADC7 0x07
//ADC7</P>
<P>void port_init(void)<BR>{<BR>PORTA = 0x00;<BR>DDRA = 0x00;<BR>PORTB =
~((1<<AIN_P)|(1<<AIN_N)); //作模拟比较器输入时,不可使能内部上拉电阻。<BR>DDRB =
(1<<LED0); //PB0作输出<BR>PORTC = 0x00; //m103 output only<BR>DDRC =
0x00;<BR>PORTD = 0x00;<BR>DDRD = 0x00;<BR>}<BR></P>
<P>//初始化的步骤,关中断,更改ACSR的值,配置模拟比较器,开中断。<BR>//Comparator initialize<BR>// trigger
on: Output toggle<BR>void comparator_init(void)<BR>{<BR>ACSR = ACSR & 0xF7;
//ensure interrupt is off before
changing<BR>//上面一句会使ACIE为零,不允许中断<BR>ACSR=(1<<ACIE);<BR>//
使能模拟比较器中断,比较器输出变化即可触发中断,AIN0为正输入端,AIN1为负输入端。<BR>}</P>
<P>#pragma interrupt_handler ana_comp_isr:17<BR>void
ana_comp_isr(void)<BR>{<BR>//analog comparator compare
event<BR>//硬件自动清除ACI标志位<BR>delay_us(10);<BR>if ((ACSR&(1<<ACO))==0)
//检测ACO<BR>//Bit 5 ACO: 模拟比较器输出 模拟比较器的输出经过同步后直接连到ACO。<BR>LED0_ON();
//如果AIN0<AIN1(ACO=0),LED亮 <BR>else<BR>LED0_OFF(); //否则 LED灭<BR>delay_ms(200);
//当电压差接近0V时,模拟比较器会产生临界抖动,故延时200mS令肉眼能看到 <BR>}</P>
<P>//call this routine to initialize all peripherals<BR>void
init_devices(void)<BR>{<BR>//stop errant interrupts until set up<BR>CLI();
//disable all interrupts<BR>port_init();<BR>comparator_init();</P>
<P>MCUCR = 0x00;<BR>GICR = 0x00;<BR>TIMSK = 0x00; //timer interrupt
sources<BR>SEI(); //re-enable interrupts<BR>//all peripherals are now
initialized<BR>}</P>
<P>void main(void)<BR>{<BR>init_devices();<BR>while(1)<BR>;<BR>}</P>
<HR SIZE=1>
<P class=gray>/*<BR>程序测试:</P><PRE class=gray> VCC VCC
| |
| | | |
AIN0--|W| |W|--AIN1 PB0---R---LED--
| | | | |
| | |
GND GND GND
</PRE>
<P><SPAN
class=gray><BR>两个电位器,一端接VCC,一端接地,构成电位器分压电路<BR>AIN0和AIN1都分别接到电位器的中心抽头。<BR>PBO输出串电阻驱动LED,高电平有效。<BR>然后分别旋转电位器,增减抽头的电压,将会发现PB0的输出(LED0)会根据
AIN0/AIN1的电压关系变动<BR>由于电源纹波,IO电流及外界干扰的影响,当电压差接近0V时,模拟比较器会产生临界抖动,AIN0/AIN1对地并上小电容可以改善这种情况。<BR><BR>只有一个电位器时,可以变通<BR>1
可以使能ACBG,利用1.23V内部能隙基准源代替AIN0作模拟比较器的正输入端。<BR>ACSR=(1<<ACIE)|(1<<ACBG);<BR>2
可以使能ADC的内部2.56V电压基准,然后把AIN0或AIN1连接到pin32 AREF脚。<BR>ADCSRA=(1<<ADEN);
//需要打开ADC<BR>ADMUX=(1<<REFS1)|(1<<REFS0);<BR></SPAN><SPAN
class=gray><BR>模拟比较器控制和状态寄存器-ACSR<BR><BR>Bit 7 – ACD:
模拟比较器禁用<BR>模拟比较器上电默认是已经工作中的,跟其他的模块有所不同<BR>ACD置位时,模拟比较器的电源被切断。可以在任何时候设置此位来关掉模拟比较器。<BR>这可以减少器件工作模式及空闲模式下的功耗。<BR>改变ACD位时,必须清零ACSR
寄存器的ACIE位来禁止模拟比较器中断。否则ACD改变时可能会产生中断<BR><BR>Bit 6 – ACBG: 选择模拟比较器的能隙基准源<BR>ACBG
置位后,模拟比较器的正极输入由1.23V能隙基准源所取代。否则, AIN0 连接到模拟比较器的正极输入。<BR><BR>Bit 5 – ACO:
模拟比较器输出<BR>模拟比较器的输出经过同步后直接连到ACO。同步机制引入了1-2 个时钟周期的延时。<BR><BR>Bit 4 – ACI:
模拟比较器中断标志<BR>当比较器的输出事件触发了由ACIS1 及ACIS0 定义的中断模式时,ACI 置位。<BR>如果ACIE 和SREG
寄存器的全局中断标志I 也置位,那么模拟比较器中断服务程序即得以执行,同时ACI 被硬件清零。<BR>ACI 也可以通过写"1” 来清零。<BR><BR>Bit
3 – ACIE: 模拟比较器中断使能<BR>当ACIE 位被置"1” 且状态寄存器中的全局中断标志I
也被置位时,模拟比较器中断被激活。<BR>否则中断被禁止。<BR><BR>Bit2 – ACIC:
模拟比较器输入捕捉使能<BR>这个功能用于检测一些微弱的触发信号源,节省一个外部运放。<BR>ACIC置位后允许通过模拟比较器来触发T/C1
的输入捕捉功能。<BR>此时比较器的输出被直接连接到输入捕捉的前端逻辑,从而使得比较器可以利用T/C1
输入捕捉中断逻辑的噪声抑制器及触发沿选择功能。<BR>为了使比较器可以触发T/C1 的输入捕捉中断,定时器中断屏蔽寄存器TIMSK 的TICIE1
必须置位。<BR>ACIC 为"0” 时模拟比较器及输入捕捉功能之间没有任何联系。<BR><BR>Bits 1, 0 – ACIS1, ACIS0:
模拟比较器中断模式选择<BR>这两位确定触发模拟比较器中断的事件。<BR>ACIS1 ACIS0 中断模式<BR>0 0 比较器输出变化即可触发中断<BR>0
1 保留<BR>1 0 比较器输出的下降沿产生中断<BR>1 1 比较器输出的上升沿产生中断<BR>需要改变ACIS1/ACIS0 时,必须清零ACSR
寄存器的中断使能位来禁止模拟比较器中断。否则有可能在改变这两位时产生中断。<BR>*/</SPAN></P>
<P>ICC avr下的工程文件下载:<A
href="http://www.avrvi.com/down.php?file=examples/avr_comp.rar">avr_comp.rar</A><BR></P></DIV></DIV>
<DIV class=m>
<H4 id=link><A href="http://www.avrvi.com/">AVR 与虚拟仪器</A>欢迎交换链接,请与小古联系
avrvi【at】163.com </H4>
<SCRIPT src="AVR模拟比较器使用范例.files/links.js" type=text/javascript></SCRIPT>
<SCRIPT src="AVR模拟比较器使用范例.files/footer.js" type=text/javascript></SCRIPT>
</DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -