AVR模拟比较器使用范例

发布者:DelightfulGaze最新更新时间:2016-07-18 来源: eefocus关键字:AVR  模拟比较器  使用范例 手机看文章 扫描二维码
随时随地手机看文章
/***********************************************

****       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 也被置位时,模拟比较器中断被激活

       否则中断被禁止。

 

    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<

*/

关键字:AVR  模拟比较器  使用范例 引用地址:AVR模拟比较器使用范例

上一篇:PC键盘与AVR单片机连接的C语言源程序
下一篇:基于74HC595 74HC165 的AVR单片机程序例子

推荐阅读最新更新时间:2024-03-16 15:00

基于AVR单片机和DS18B20的多点温度测量系统
1DS18B20和BASCOM-AVR简介   DS18B20是美国DALLAS公司生产的单总线数字温度传感器,从DS18B20读出或写入的信息仅需要一根口线。在单总线工作方式下,允许一条信号线上挂接多个DS18B20,特别适合于构成远距离多点温度测控系统,从而大大简化了系统布线,提高了可靠性,降低了成本,而实现这些的关键在于每片DS18B20都有唯一的ROM代码(64位产品序列号)。在多点温度测控系统中,ROM代码是识别和操作DS18B20的基础;无论读取还是选择对某一个传感器进行操作,主机必须发送64位ROM代码。   BASCOM-AVR是MSC Electronics公司推出的基于AVR系统的软件开发仿真平台。程序语
[单片机]
基于<font color='red'>AVR</font>单片机和DS18B20的多点温度测量系统
AVR单片机红外解码程序
avr单片机源程序如下: //ICC-AVR application builder : 2018/1/11 10:02:04 // Target : M16 // Crystal: 8.0000Mhz #include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int #define pind2 PIND&0x04 uchar shujuma ={0,0},IrValue ={0,0,0,0}; uchar Time; void delay_us(unsigned char nus) { unsigned c
[单片机]
AVR单片机1602液晶程序
端口定义在程序里面采用8位数据模式,程序测试通过. #include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int #pragma data:code uchar shu; const uchar table ={ yinqing@163.com }; const uchar table1 ={ www.51hei.com }; /**********************************/ /************延时子程序************/ /*****************
[单片机]
avr0~5V数字式直流电压表设计
一、实验目的 1. 掌握A/D转换程序的设计; 2. 掌握数据采集与显示的应用; 3.掌握数据处理的方法; 二、实验内容 1. 参照课本P383页 0~5V数字式直流电压表实验 程序,并编译、仿真,见下图所示。 注意:由于用proteus ISIS仿真时,数码管模型显示的闪烁现象和缓存现象,需要对其进行短延时和清屏,否则,显示将出现乱码现象。可在main()主函数里加入两条语句: Delay(1); PORTA=0; (1)修改错误。 比较程序第25行 ADMUX=0XC7 以及程序第71行 x=(5000*(long)i)/1023 所指参考电压不一致,导致输入模拟电压值与数码管显示电压值不一致,有哪几种
[单片机]
基于AVR单片机的多通道温湿度传感器检定系统
    随着地面自动气象站的投入业务使用,山东省的大监自动气象站和区域自动气象站已经建成1 500多个,使我省的业务水平大幅提高,随着业务量增加的同时,也给计量检定工作能力提出了新的要求。但近些年来温湿度传感器的检定很大程度上仍停留在人工检定阶段。这种检定方法耗时、检定效率低,因此迫切设计出一套自动检定温湿度传感器的系统,为了改善这种状况,在VC 6.0环境下使用MSComm通信控件和数据库技术,开发了自动站温湿度传感器数据采集及处理系统,实现8路温湿传感器的数据批量采集,用以提高温湿度传感器的检定效率和准确度。 1 系统的整体结构及功能描述     该设计以AVR单片机和高精度A/D转换芯片ADS1232为核心,能对温湿度传感器进
[嵌入式]
bascom avr tiny45驱动74hc595
如题,代码如下: $regfile = attiny45.dat '指定单片机型号 $crystal = 8000000 '指定频率 $hwstack = 2 $swstack = 8 $framesize = 24 Config Portb = Output '定义B口为输出 Config Portb.4 = Input '定义C.0口为输入 Config Adc = Single , Prescaler =
[单片机]
AVR熔丝位设置让我在吃苦头中成长
有一小段时间没有来空间扫一扫雪了,前段日子把避障小车终于做了出来,时间比较忙还来不及拿出来和大家分享,这些天因为要公司要做一款UNO控制板,之前感觉自己比较停留在对单片机的编写程序上,忽略了对单片机内部的一些寄存器的了解上,当然在学习PIC的时候会去了解里面的结构,比如AD和DA的分频,中断里面寄存器的控制,SPI控制的结构等。但是在AVR这方面还真是大大的欠缺。 UNO是arduino一个开源的产品,基本上驱动程序,bootload等都可以在其官方上找到,不过说句实在的,因为一直没有成功写进atmega8u2-mc这款控制器里面,一直在怀疑着自己找到的是不是正确的bootload的。就这样子弄了两个星期无果,自己郁闷,公司估计也很
[单片机]
<font color='red'>AVR</font>熔丝位设置让我在吃苦头中成长
AVR单片机的RTOS-AVRX应用
引 言   随着技术的发展,嵌入式系统的设计及应用对人们的生活产生了很大的影响,并将逐渐改变人们未来的生活方式。在特定的操作系统上开发应用程序,可以使开发人员忽略掉很多底层硬件细节,使得应用程序调试更方便、易于维护、开发周期缩短并且降低开发成本,因而嵌入式操作系统深得开发人员的青睐。   AVR微处理器是Atmel公司开发的8位嵌入式RISC处理器,它具有高性能、高保密性、低功耗、非易失性等优点,而且程序存储器和数据存储器可独立编址,并具有独立访问的哈佛结构。AVR单片机内核有丰富的指令集,通过32个通用寄存器直接与逻辑运算单元相连接,允许在一个周期内一条单一指令访问两个独立的寄存器,这样的结构使代码的执行效率比传统的复杂指令集
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved