原创 【ATMEGA16L】实验二九:模拟比较器实验

2009-8-14 09:39 3769 9 9 分类: MCU/ 嵌入式

》》点此进入      http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛


【相关实验】


实验一:流水灯实验(八种LED点亮模式)


实验二:有源蜂鸣器驱动实验


实验三:按键扫描(用KEY选择对应LED点亮)


实验四:键盘扫描+8种LED亮灭模式控制


实验二四:四线制LCD1602B驱动实验        


实验二五:八线制LCD1602B驱动实验


实验二八:USART综合实验


***********************************************************************


        今天搞定了模拟比较器,现将案例呈上,欢迎交流!程序已经调试通过,仅供参考!


/******************************************************************************
Platform: AVR mega16学习板(www.iccavr.com
Project : 实验二九:模拟比较器实验
Clock F : 3.6864MHz
Software: ICCAVR7.14C
Author  : 林夕依然
Version : 09.03.23
Updata  :
comments:
1、模拟比较器标准配置时,AIN0正极选内部参考电源1.23V,AIN1负极选择默认PB3;
2、模拟比较器多路输入时,选择ADC1(PA1)来代替模拟比较器的负极输入端;
   芯片内部一个固定的能隙(Bandgap)参考电源1.23V代替AIN0的输入,
   作为模拟比较器的正极输入端,调电位器RW2可改变负极输入电压;
3、做此实验,
   1)标准配置时需取下JP9短路块,用导线将RW2电位器可调端同AIN1(PB3)相连;
   2)多路复用配置时需取下JP9短路块,用导线将RW2电位器可调端同PA1(ADC1)相连;
4、不同配置的情况下,调节电位器RW2,PA1或PB3点电位在1.23V左右会发生模拟比较器
   中断,对应的LED0亮,灭;
5、参考:AVR与虚拟仪器 http://www.avrvi.com "综合板应用-模拟比较器的使用"和
   "AVR 模拟比较器使用范例"
problem :
1、
*******************************************************************************/
//头文件
#include <iom16v.h>
#include <macros.h>


//管脚定义
#define LED0     0   // PB0


//宏定义
#define LED0_OFF()      PORTB|= (1<<LED0)   // 输出高电平,灯灭
#define LED0_ON()       PORTB&=~(1<<LED0)   // 输出低电平,灯亮


/*********************************************************************************
  模拟比较器的正输入端由 ACBG位决定,=0选择AIN0引脚,=1选择1.23V内部能隙基准源
  模拟比较器多工输入 (不常用,因为ADC将无法使用)
  可以选择ADC7..0 之中的任意一个来代替模拟比较器的负极输入端。
  ADC复用器可用来完成这个功能。
  当然,为了使用这个功能首先必须关掉ADC。
  如果模拟比较器复用器使能位(SFIOR 中的ACME) 被置位,且ADC 也已经关掉(ADCSRA
  寄存器的ADEN 为0),则可以通过ADMUX 寄存器的MUX2..0 来选择替代模拟比较器负极输入
  的管脚,如果ACME 清零或ADEN 置位,则模拟比较器的负极输入为AIN1。
*********************************************************************************/


/*-----------------------------------------------------------------
函数名称: void port_init(void)
函数功能: 端口初始化
说    明:
返 回 值: 无
-----------------------------------------------------------------*/
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0X00;
DDRB = (1<<LED0);        
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}


/*-----------------------------------------------------------------
函数名称: void comparator_init01(void)
函数功能: 模拟比较器初始化(标准)
说    明: AIN0正极选内部参考电源1.23V,AIN1负极选择默认PB3;比较匹配中断。
返 回 值: 无
-----------------------------------------------------------------*/
void comparator_init01(void)
{
ACSR  = 0X00;  // 先清除ACSR寄存器中的中断允许位,当这些位被改变时,会发生中断;
ACSR  = 0X48;  // 选择模拟比较器的能隙基准源,开比较中断;
}


/*-----------------------------------------------------------------
函数名称: void comparator_init02(void)
函数功能: 模拟比较器初始化(多路复用)
说    明: AIN0正极选内部参考电源1.23V,AIN1负极选择ADC1;比较匹配中断。
返 回 值: 无
-----------------------------------------------------------------*/
void comparator_init02(void)
{
ACSR  = 0X00;  // 先清除ACSR寄存器中的中断允许位,当这些位被改变时,会发生中断;
ACSR  = 0X48;  // 选择模拟比较器的能隙基准源,开比较中断;
SFIOR = 0X08;  // 模拟比较器多路使能(1<<ACME)
ADCSRA= 0X00;  // 模数转换(ADC)功能被关闭,允许使用ADC多路复用器选择;
ADMUX = 0X01;  // ADC1模拟输入端口作为模拟比较器反向端的输入信号源;
}


#pragma interrupt_handler ana_comp_isr:17
void ana_comp_isr(void)
{
  if ((ACSR&(1<<ACO))==0)   // 检测ACO
                            // Bit 5 ACO: 模拟比较器输出   模拟比较器的输出经过同步后直接连到ACO。
    LED0_ON();              // 如果AIN0<AIN1(ACO=0),LED亮    
  else
    LED0_OFF();             // 否则LED灭,AIN0>AIN1(ACO=0)
}


/*-----------------------------------------------------------------
函数名称: void init_devices(void)
函数功能: 器件初始化
说    明: 使能全局中断
返 回 值: 无
-----------------------------------------------------------------*/
void init_devices(void)
{
CLI();
port_init();
comparator_init01();
//comparator_init02();


MCUCR= 0x00;
GICR = 0x00;
TIMSK= 0x00;
SEI();     //使能全局中断
}


/*-----------------------------------------------------------------
函数名称: void main(void)
函数功能: 主函数
说    明:
返 回 值: 无
-----------------------------------------------------------------*/
void main(void)
{
init_devices();
while(1)
   ;
}

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条