》》点此进入 http://bbs.armavr.com/ ARM-AVR嵌入式开发论坛
【相关实验】
实验一:流水灯实验(八种LED点亮模式)
实验二:有源蜂鸣器驱动实验
实验四:键盘扫描+8种LED亮灭模式控制
***********************************************************************
今天搞定了模拟比较器,现将案例呈上,欢迎交流!程序已经调试通过,仅供参考!
/******************************************************************************
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条评论)
登录后参与讨论