**** AVR 模拟比较器使用范例 ***
**** 编译器:WINAVR20050214 ***
***********************************************/
/*
本程序简单的示范了如何使用ATMEGA16的模拟比较器
模拟比较器的设置
中断方式--较常用
查询方式不常用,检测ACO即可,可用作DELTA-SIGMA A/D CONVERTER,校正后精度比较高,但速度低,用汇编可以略为提高速度。
出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器
*/
#i nclude
#i nclude
#i nclude
#i nclude
/*
宏INTERRUPT 的用法与SIGNAL 类似,区别在于:
SIGNAL 执行时全局中断触发位被清除、其他中断被禁止
INTERRUPT 执行时全局中断触发位被置位、其他中断可嵌套执
另外avr-libc 提供两个API 函数用于置位和清零全局中断触发位,它们是经常用到的。
分别是:void sei(void) 和void cli(void) 由interrupt.h定义
注: 内部函数_delay_ms() 最高延时 262.144mS@1MHz
该函数可以实现较精确的定时,但用JTAG仿真时较麻烦---会进入机器码窗口(DISAssembeler).注意跳开该语段。
一旦JTAG仿真进入该内部函数语句,会变得像"死机"一样(其实在运行中),可以先[break],然后在后面的C语句设[breakpoint],[RUN]跳过
for()/while()语句计算延时时间较麻烦。
为了使 _delay_ms()函数的延时正确,须在makefile中设定F_CPU为实际的系统时钟频
本范例为1MHz内部RC振荡器 即 F_CPU=1000000
*/
//管脚定义
#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
SIGNAL(SIG_COMPARATOR) //模拟比较器中断服务程序
{
//硬件自动清除ACI标志位
_delay_us(10);
if ((ACSR&(1< //检测ACO
LED0_ON(); //如果AIN0亮
else
LED0_OFF(); //否则 LED灭
_delay_ms(200); //当电压差接近0V时,模拟比较器会产生临界抖动,故延时200mS令肉眼能看到
}
int main(void)
{
//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻
PORTA=0xFF;
PORTC=0xFF; //不用的管脚使能内部上拉电阻。
PORTD=0xFF;
PORTB=~((1< //作模拟比较器输入时,不可使能内部上拉电阻。
DDRB= (1< //PB0作输出
/*
模拟比较器控制和状态寄存器-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 也被置位时,模拟比较器中断被激活。
否则中断被禁止。
本文关键字:暂无联系方式AVR单片机,单片机-工控设备 - AVR单片机