您的位置 首页 应用

AVR模仿比较器运用典范

/***************************************************AVR模拟比较器使用范例*******编译器:WINAVR20050214***********

/***********************************************

**** 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<

*/

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/275906.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部