AVR的模拟比较器功能实验

发布者:MindfulBeing最新更新时间:2016-10-26 来源: eefocus关键字:AVR  模拟比较器 手机看文章 扫描二维码
随时随地手机看文章
/*===================================================================

                      AVR的模拟比较器功能实验
       
AVR的模拟比较器模块可以用来比较接在AIN0(mega16 PB2的第二功能)和AIN1(PB3)
两个引脚的电压大小。程序操作流程:初始化 >> 开中断 >> 中断服务程序判断,
比较结果将会同步到模拟比较器控制和状态寄存器-ACSR的第五位ACO,检测ACO
的值就可以得出比较结果。AIN0AIN1(ACO=1)

===================================================================*/
// ICC-AVR application builder : 2007-3-15 8:22:58
// Target : M16
// Crystal: 7.3728Mhz
// AVR 模拟比较器使用范例
#include
#include
//管脚定义
#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
//===================延时函数========================
//5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
//==================================================
void delay_us(unsigned int us)    
{
    unsigned int i;
  us=us*5/4;         //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
  for( i=0;i }
void delay_ms(unsigned int ms)    
{
    unsigned int i,j;
  for( i=0;i   for(j=0;j<1141;j++);  //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}
void port_init(void)
{
//PORTA = 0x00;
//DDRA = 0x00;
PORTB |= ~((1< DDRB |= (1< //PORTC = 0x00; //m103 output only
//DDRC = 0x00;
//PORTD = 0x00;
//DDRD = 0x00;
}
//初始化的步骤,关中断,更改ACSR的值,配置模拟比较器,开中断。
//Comparator initialize
// trigger on: Output toggle
void comparator_init(void)
{
ACSR = ACSR & 0xF7; //ensure interrupt is off before changing
//上面一句会使ACIE为零,不允许中断
ACSR=(1< // 使能模拟比较器中断,比较器输出变化即可触发中断,AIN0为正输入端,AIN1为负输入端。
}
#pragma interrupt_handler ana_comp_isr:17
void ana_comp_isr(void)
{
//analog comparator compare event
//硬件自动清除ACI标志位
delay_us(10);
if ((ACSR&(1< //Bit 5 ACO: 模拟比较器输出 模拟比较器的输出经过同步后直接连到ACO。
LED0_ON(); //如果AIN0 else
LED0_OFF(); //否则 LED灭
delay_ms(200); //当电压差接近0V时,模拟比较器会产生临界抖动,故延时200mS令肉眼能看到 
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
comparator_init();

MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void main(void)
{
init_devices();
while(1)
;
}


//--------------------------------------------------------------------------------

/*
程序测试:

       VCC      VCC
        |        |
       | |      | |               
 AIN0--|W|      |W|--AIN1  PB0---R---LED--
       | |      | |                       |
        |        |                        |
       GND      GND                      GND


两个电位器,一端接VCC,一端接地,构成电位器分压电路
AIN0和AIN1都分别接到电位器的中心抽头。
PBO输出串电阻驱动LED,高电平有效。
然后分别旋转电位器,增减抽头的电压,将会发现PB0的输出(LED0)会根据 AIN0/AIN1的电压关系变动
由于电源纹波,IO电流及外界干扰的影响,当电压差接近0V时,模拟比较器会产生临界抖动,AIN0/AIN1对地并上小电容可以改善这种情况。

只有一个电位器时,可以变通
1 可以使能ACBG,利用1.23V内部能隙基准源代替AIN0作模拟比较器的正输入端。
ACSR=(1< 2 可以使能ADC的内部2.56V电压基准,然后把AIN0或AIN1连接到pin32 AREF脚。
ADCSRA=(1< ADMUX=(1<

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

关键字:AVR  模拟比较器 引用地址:AVR的模拟比较器功能实验

上一篇:ST7920控制显示程序
下一篇:基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计

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

AVR微控制器在BLDC电机控制中的应用
引言 许多汽车应用,包括从最小的阀门到笨重的座椅,都含有运动部件,而速度可能从每分钟数十转到数千转不等。一直以来,有刷电机在汽车应用中占主导地位,因为它们成本低,而且只需简单的继电器就能加以控制。不过,有刷电机较重,而且电刷会产生噪声和电火花,并会随着使用时间的增加而磨损。 现代汽车中电机的数量在不断增加,因此制造商需要体积更小更轻、转矩和速度更高并受到精确控制的电机。防倾斜(anti-pitch)车窗升降电机就是一个很好的示例,其他还有刹车和转向助力、通风、冷却,以及推拉门等应用。另外,进气和涡轮增压器控制则是比较新颖的领域,这时电机及其控制器可能处于150℃的高温下,远远超过125℃的标准温度。 目
[单片机]
<font color='red'>AVR</font>微控制器在BLDC电机控制中的应用
AVR M16 ADC应用设计要点
1、预分频与转换时间 在通常情况下,ADC的逐次比较转换电路要达到最大精度时,需要50kHz~200kHz之间的采样时钟。在要求转换精度低于10位的情况下,ADC的采样时钟可以高于200kHz,以获得更高的采样率。 ADC模块中包含一个预分频器的ADC时钟源,它可以对大于100KHz的系统时钟进行分频,以获得合适的ADC时钟提供ADC使用。预分频器的分频系数由ADCSRA寄存器中的ADPS位设置的。一旦寄存器ADCSRA中的ADEN位置 1 (ADC开始工作),预分频器就启动开始计数。ADEN位为 1 时,预分频器将一直工作;ADEN位为 0 时,预分频器一直处在复位状态。 AVR的ADC完成一次转换的时间见表6.2.5。从表中
[单片机]
AVR单片机—(五)、ATMEGA16的USART与PC机串行通信—03
五、ATMEGA16的USART与PC机串行通信 五—(03)、PC机发送控制指令控制单片机工作~(这个控制还是比较简单的~~ ,不过个人认为还是有水平的~) 还是先上图片~~,然后程序,程序师模块化的,我尽量贴全点~~ 然后就是程序了 IAR5_2.c //------------------------------------------------------------------------------ //控制指令的定义(个人感觉这个才是真正应用呢~~给力~) //上位机界面中,用户需要输入控制下位机的指令 //由于传送的数据比较简单,因此控制指令也可定义的相对简单一些((*^__^*) 嘻嘻……,那本书上
[单片机]
<font color='red'>AVR</font>单片机—(五)、ATMEGA16的USART与PC机串行通信—03
avr键盘程序
键盘扫描有中断方式和查询方式 #i nclude jn8515def.h /******以下是键盘排列图****** | | | PC0 ___1|__2|__3|__ | | | PC1 ___4|__5|__6|__ | | | PC2 ___7|__8|__9|__ | | | PC3 ___C|__0|__S|__ | | | | | | PC4 PC5 PC6 ****************************
[单片机]
Atmel三款带10位ADC的AVR单片机
Atmel三款带10位ADC的AVR单片机Atmel今天宣布推出针对电池充电器、传感器终端和低端马达控制应用的 AVR(R) 闪存微控制器系列的三个新成员。 三款最新14管脚 tinyAVR(R) 产品加入到广泛的 AVR 闪存微控制器系列中。三款设备都具有管脚兼容的特点,仅在闪存、EEPROM 和静态随机存取存储器 (SRAM) 的存储容量上有所不同。ATtiny24 的自编程闪存容量为 2 KB,而 ATtiny44 和 ATtiny84 则分别为 4 KB 和 8 KB。这三款新设备在 20 MHz 工作频率下的吞吐量均可达到 20 MIPS(每秒百万指令)。 由于具备与生俱来的低功耗特点和三种可单独选择的低功耗休眠模式,
[单片机]
AVR单片机串口红外线传输试验程序
为了验证串口红外传输速度,我搭建了这个小系统。 问题从红外线接收头开始,我使用现成的红外遥控接收头,这就省去了搭建放大整形等等麻烦,但限制也就此产生,后述。红外头内部有40KHZ的选通,所以数字信号必须搭载在40KHZ上。 用74LS00作40KHZ方波发生器,使用如图阻容,产生的方波大致在需求范围。 先想用40KHZ晶振,拆了两个遥控器,445KHZ,不能用,所以还是阻容法,这个50000P是我反复调整的结果。 选用74LS00主要看上它有与门,我们用10脚、9脚入,8脚出这个与非门,把数字信号和载波信号“与”在一起。 遥控接收的要求是,无信号就无载波,串口输出等待状态为高电平,所以用与非门反向一下,13、12脚入,11脚出即是
[单片机]
<font color='red'>AVR</font>单片机串口红外线传输试验程序
avr单片机proteus仿真第四课:控制继电器
继电器(Relay),作用是用弱电控制强电。比如,我们用avr单片控制一个220V电压的灯泡,这就必须用到继电器。 本课用avr单片机来控制继电器的吸合与断开。 Proteus仿真实验器件: 1 atmega128一块 2 button,按键一个 3 relay,通用继电器一个,并把继电器的Component Value设置为5V 4 pnp三极管一个 5 LAMP,灯泡一个改为220V 6 resistor 1k 7 DIODE 二极管一个 这个程序实际上很简单,主要要学习继电器的用法,注意的是,继电器必须接一个二极管。 仿真程序如下: #include avr/io.h #include util/delay.
[单片机]
<font color='red'>avr</font>单片机proteus仿真第四课:控制继电器
avr单片机的AD转换实验
AD转换实验。 1、AD转换实验。程序进行周期AD转换,在并转换值显示在数码管上。 2、使用内部1 M晶振。 3、进行此实验需要插上:JP1的所有8个短路块、JP9(A/D)。 4、此实验采用项目化管理,主要文件有ADC、DISP、主程序。 */ #include "iom16v.h" #include macros.h #include "iom16v.h" #include macros.h extern unsigned char get_ad(void);/*AD采样函数*/ extern void Disp_Init(void);/*显示初始化*/ extern unsigned char led_buf ;/*
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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