AVR模拟比较器(mega16系列单片机)

源代码在线查看: main._c

软件大小: 28 K
上传用户: ddddong
关键词: mega AVR 16 模拟比较器
下载地址: 免注册下载 普通下载 VIP

相关代码

				// ICC-AVR application builder : 2007-3-15 8:22:58
				// Target : M16
				// Crystal: 7.3728Mhz
				// AVR 模拟比较器使用范例
				
				/*
				AVR的模拟比较器模块可以用来比较接在AIN0(mega16 PB2的第二功能)和AIN1(PB3)两个引脚的电压大小。
				程序操作流程:初始化 >> 开中断 >> 中断服务程序判断,比较结果将会同步到
				模拟比较器控制和状态寄存器-ACSR的第五位ACO,检测ACO的值就可以得出比较结果。AIN0AIN1(ACO=1)
				*/
				#include 
				#include 
				#include "delay.h"
				
				//管脚定义
				#define LED0		0 	//PB0
				#define AIN_P		2 	//PB2(AIN0)
				#define AIN_N		3 	//PB3(AIN1)
				
				//宏定义
				#define LED0_ON()		PORTB|= (1				#define LED0_OFF()		PORTB&=~(1				
				//常量定义
				/*
					模拟比较器的正输入端由 ACBG位决定,=0选择AIN0引脚,=1选择1.23V内部能隙基准源
				
				  模拟比较器多工输入 (不常用,因为ADC将无法使用)
					可以选择ADC7..0 之中的任意一个来代替模拟比较器的负极输入端。
					ADC复用器可用来完成这个功能。
					当然,为了使用这个功能首先必须关掉ADC。
					如果模拟比较器复用器使	能位(SFIOR 中的ACME) 被置位,且ADC 也已经关掉(ADCSRA 寄存器的ADEN 为0),
					则可以通过ADMUX 寄存器的MUX2..0 来选择替代模拟比较器负极输入的管脚,
					如果ACME 清零或ADEN 置位,则模拟比较器的负极输入为AIN1。
					
				*/
				#define AC_ADC0		 	0x00		//ADC0
				#define AC_ADC1		 	0x01		//ADC1
				#define AC_ADC2		 	0x02		//ADC2
				#define AC_ADC3		 	0x03		//ADC3
				#define AC_ADC4		 	0x04		//ADC4
				#define AC_ADC5		 	0x05		//ADC5
				#define AC_ADC6		 	0x06		//ADC6
				#define AC_ADC7		 	0x07		//ADC7
				
				void port_init(void)
				{
				 PORTA = 0x00;
				 DDRA  = 0x00;
				 PORTB = ~((1				 DDRB = (1				 PORTC = 0x00; //m103 output only
				 DDRC  = 0x00;
				 PORTD = 0x00;
				 DDRD  = 0x00;
				}
				
				/*
				初始化的步骤,关中断,更改ACSR的值,配置模拟比较器,开中断。
				*/
				//Comparator initialize
				// trigger on: Output toggle
				void comparator_init(void)
				{
				 ACSR = ACSR & 0xF7; //ensure interrupt is off before changing
				 //上面一句会使ACIE为零,不允许中断
				 ACSR=(1				  // 使能模拟比较器中断,比较器输出变化即可触发中断,AIN0为正输入端,AIN1为负输入端。
				}
				
				#pragma interrupt_handler ana_comp_isr:17
				void ana_comp_isr(void)
				{
				 //analog comparator compare event
				     //硬件自动清除ACI标志位
				    delay_us(10);
				    if ((ACSR&(1					   						//Bit 5 ACO: 模拟比较器输出	模拟比较器的输出经过同步后直接连到ACO。
				    	LED0_ON();			//如果AIN0				    else
				    	LED0_OFF();			//否则 LED灭
				    delay_ms(200); 		//当电压差接近0V时,模拟比较器会产生临界抖动,故延时200mS令肉眼能看到  
				}
				
				//call this routine to initialize all peripherals
				void init_devices(void)
				{
				 //stop errant interrupts until set up
				 CLI(); //disable all interrupts
				 port_init();
				 comparator_init();
				
				 MCUCR = 0x00;
				 GICR  = 0x00;
				 TIMSK = 0x00; //timer interrupt sources
				 SEI(); //re-enable interrupts
				 //all peripherals are now initialized
				}
				
				void main(void)
				{
				 init_devices();
				 while(1)
				 ;
				}
				
				/*
				程序测试:
				
				       VCC      VCC
				        |        |
				       | |      | |               
				 AIN0--|W|      |W|--AIN1  PB0---R---LED--
				       | |      | |                       |
				        |        |                        |
				       GND      GND                      GND
				 
					两个电位器,一端接VCC,一端接地,构成电位器分压电路
				    AIN0和AIN1都分别接到电位器的中心抽头。
				    PBO输出串电阻驱动LED,高电平有效。
				    然后分别旋转电位器,增减抽头的电压,将会发现PB0的输出(LED0)会根据 AIN0/AIN1的电压关系变动
				    由于电源纹波,IO电流及外界干扰的影响,当电压差接近0V时,模拟比较器会产生临界抖动,AIN0/AIN1对地并上小电容可以改善这种情况。
				 
				    只有一个电位器时,可以变通
				    1 可以使能ACBG,利用1.23V内部能隙基准源代替AIN0作模拟比较器的正输入端。
					    ACSR=(1				    2 可以使能ADC的内部2.56V电压基准,然后把AIN0或AIN1连接到pin32 AREF脚。
				   		ADCSRA=(1				   		ADMUX=(1				
				*/
				
				
				/*
				    模拟比较器控制和状态寄存器-ACSR
				    
				    Bit 7 – ACD: 模拟比较器禁用
				    模拟比较器上电默认是已经工作中的,跟其他的模块有所不同
				    ACD置位时,模拟比较器的电源被切断。可以在任何时候设置此位来关掉模拟比较器。
				    这可以减少器件工作模式及空闲模式下的功耗。
				    改变ACD位时,必须清零ACSR 寄存器的ACIE位来禁止模拟比较器中断。否则ACD改变时可能会产生中断
				    
				    Bit 6 – ACBG: 选择模拟比较器的能隙基准源
					ACBG 置位后,模拟比较器的正极输入由1.23V能隙基准源所取代。否则, AIN0 连接到模拟比较器的正极输入。
					
					Bit 5 – ACO: 模拟比较器输出
					模拟比较器的输出经过同步后直接连到ACO。同步机制引入了1-2 个时钟周期的延时。
					
					Bit 4 – ACI: 模拟比较器中断标志
					当比较器的输出事件触发了由ACIS1 及ACIS0 定义的中断模式时,ACI 置位。
					如果ACIE	和SREG 寄存器的全局中断标志I 也置位,那么模拟比较器中断服务程序即得以执行,同时ACI 被硬件清零。
					ACI 也可以通过写"1” 来清零。
					
					Bit 3 – ACIE: 模拟比较器中断使能
					当ACIE 位被置"1” 且状态寄存器中的全局中断标志I 也被置位时,模拟比较器中断被激活。
					否则中断被禁止。
				    
				    Bit2 – ACIC: 模拟比较器输入捕捉使能
					这个功能用于检测一些微弱的触发信号源,节省一个外部运放。
				    ACIC置位后允许通过模拟比较器来触发T/C1 的输入捕捉功能。
				    此时比较器的输出被直接连接到输入捕捉的前端逻辑,从而使得比较器可以利用T/C1 输入捕捉中断逻辑的噪声抑制器及触发沿选择功能。
					为了使比较器可以触发T/C1 的输入捕捉中断,定时器中断屏蔽寄存器TIMSK 的TICIE1	必须置位。
				    ACIC 为"0” 时模拟比较器及输入捕捉功能之间没有任何联系。
					
					Bits 1, 0 – ACIS1, ACIS0: 模拟比较器中断模式选择
					这两位确定触发模拟比较器中断的事件。
					ACIS1 ACIS0 	中断模式
					  0 	0 比较器输出变化即可触发中断
					  0 	1 保留
					  1 	0 比较器输出的下降沿产生中断
					  1 	1 比较器输出的上升沿产生中断
					需要改变ACIS1/ACIS0 时,必须清零ACSR 寄存器的中断使能位来禁止模拟比较器中断。否则有可能在改变这两位时产生中断。
				    */
							

相关资源