您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机AVR 模拟比较器使用范例 正文
AVR 模拟比较器使用范例

AVR 模拟比较器使用范例

点击数:7835 次   录入时间:03-04 11:53:18   整理:http://www.55dianzi.com   AVR单片机
 
    只有一个电位器时,可以变通
    1 可以使能ACBG,利用1.23V内部能隙基准源代替AIN0作模拟比较器的正输入端。
        ACSR=(1<<ACIE)|(1<<ACBG);
    2 可以使能ADC的内部2.56V电压基准,然后把AIN0或AIN1连接到PIN32 AREF脚。
           ADCSRA=(1<<ADEN);  //需要打开ADC
           ADMUX=(1<<REFS1)|(1<<REFS0);

*/


/*
    模拟比较器控制和状态寄存器-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 寄存器的中断使能位来禁止模拟比较器中断。否则有可能在改变这两位时产生中断。
    */

/**********************************
** file_name delay.h             **
** describe  软件延时函数头文件  **
** auther    古欣                **
** Time      2007-1-31           **
**********************************/
#ifndef _delay_
#define _delay_

//晶振大小,保证延时的准确性
#define xtal 8
//#define xtal 4
//1us
extern void delay_1us(void);
//1ms
extern void delay_1ms(void);
//1s
extern void delay_1s(void);
//nus
extern void delay_us(unsigned int n);
//nms
extern void delay_ms(unsigned int n);
//ns
extern void delay_s(unsigned int n);

#endif

/****************************
** file_name delay.c       **
** describe  软件延时函数  **
** auther    古欣          **
** Time      2007-1-31     **
*****************************/
#include "delay.h"
/***********************
** 8M晶振下 1us
** 也可以宏定义 8个asm("nop");
** #define delay_1us asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
***********************/
void delay_1us(void)
{
 asm("nop");
}

/***********************
**8M时为 1000.25us
**4M时为 999.5us
**xtal 为晶振频率,单位为MHz
************************/
void delay_1ms(void)
{
 unsigned int i;
 for(i=(xtal*143-2);i>0;i--)
  ;
}

/***********************
** 1S延时,误差可能稍大
** 250ms*4=1000ms
************************/
void delay_1s(void)
{
 unsigned int i;
   for(i=250;i>0;i--)   //250ms*4=1000ms
   delay_1ms();
   for(i=250;i>0;i--)
   delay_1ms();
   for(i=250;i>0;i--)
   delay_1ms();
   for(i=250;i>0;i--)
   delay_1ms();
}

/***********************
**微秒级延时
************************/
void delay_us(unsigned int n)
{
 unsigned int i;
 for(i=n;i>0;i--)
 delay_1us();
}

/***********************
**毫秒级延时
************************/
void delay_ms(unsigned int n)
{
 unsigned int i;
 for(i=n;i>0;i--)
 delay_1ms();
}

/***********************
**秒级延时,太浪费资源,不建议使用
************************/
void delay_s(unsigned int n)
{
 unsigned int i,j;
 for(j=n;j>0;j--)
  {
   for(i=250;i>0;i--)   //250ms*4=1000ms
   delay_1ms();
   for(i=250;i>0;i--)
   delay_1ms();
   for(i=250;i>0;i--)
   delay_1ms();
   for(i=250;i>0;i--)
   delay_1ms();
  }
}



上一页  [1] [2] 


本文关键字:暂无联系方式AVR单片机单片机-工控设备 - AVR单片机