/***********************************************
**** AVR 模仿比较器运用典范 ***
**** 编译器:WINAVR20050214 ***
***********************************************/
/*
本程序简略的演示了怎么运用ATMEGA16的模仿比较器
模仿比较器的设置
中止avr.com/news/2008-01/1999.htm&rn=751440&v=1&ref=http%3A//www.picavr.com/news/c37/defaultp7.htm&province=%u5E7F%u4E1C&city=%u5E7F%u5DDE” qs_is_on_div=”” rel=”nofollow” target=”_blank”>方法–较常用
查询方法不常用,检测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 也被置位时,模仿比较器中止被激活。
不然中止被制止。
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 寄存器的中止使能位来制止模仿比较器中止。不然有可能在改动这两位时发生中止。
*/
ACSR=(1<
// 使能模仿比较器中止,比较器输出改动即可触发中止,AIN0为正输入端,AIN1为负输入端。
sei(); //使能大局中止
while (1); //主程序没有使命。任何状况都有必要是一个无限循环。
}
/*
程序测验:
两个电位器,一端接VCC,一端接地,构成电位器分压电路。
AIN0和AIN1都别离接到电位器的中心抽头。
PBO输出串电阻驱动LED,高电平有用。
然后别离旋转电位器,增减抽头的电压,将会发现PB0的输出(LED0)会依据 AIN0/AIN1的电压联系变化。
因为电源纹波,IO电流及外界搅扰的影响,当电压差挨近0V时,模仿比较器会发生临界颤动,AIN0/AIN1对地并上小电容能够改进这种状况。
在运用AVR51试验板时,因为只要一个电位器,需求变通:
1、能够使能ACBG,运用1.23V内部能隙基准源替代AIN0作模仿比较器的正输入端。
ACSR=(1<
2、能够使能ADC的内部2.56V电压基准,然后把AIN0或AIN1连接到pin32 AREF脚。
ADCSRA=(1< //需求翻开ADC
ADMUX=(1<
*/