AVR的模拟比较器功能实验
AVR的模拟比较器模块可以用来比较接在AIN0(mega16 PB2的第二功能)和AIN1(PB3)
两个引脚的电压大小。程序操作流程:初始化 >> 开中断 >> 中断服务程序判断,
比较结果将会同步到模拟比较器控制和状态寄存器-ACSR的第五位ACO,检测ACO
的值就可以得出比较结果。AIN0
===================================================================*/
// 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)
//宏定义 //常量定义 模拟比较器多工输入 (不常用,因为ADC将无法使用) MCUCR = 0x00; void main(void) /* VCC VCC 只有一个电位器时,可以变通 模拟比较器控制和状态寄存器-ACSR Bit 7 – ACD: 模拟比较器禁用 Bit 6 – ACBG: 选择模拟比较器的能隙基准源 Bit 5 – ACO: 模拟比较器输出 Bit 4 – ACI: 模拟比较器中断标志 Bit 3 – ACIE: 模拟比较器中断使能 Bit2 – ACIC: 模拟比较器输入捕捉使能 Bits 1, 0 – ACIS1, ACIS0: 模拟比较器中断模式选择
#define LED0_ON() PORTB|= (1<
/*
模拟比较器的正输入端由 ACBG位决定,=0选择AIN0引脚,=1选择1.23V内部能隙基准源
可以选择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
}
void port_init(void)
{
//PORTA = 0x00;
//DDRA = 0x00;
PORTB |= ~((1<
//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<
}
#pragma interrupt_handler ana_comp_isr:17
void ana_comp_isr(void)
{
//analog comparator compare event
//硬件自动清除ACI标志位
delay_us(10);
if ((ACSR&(1<
LED0_ON(); //如果AIN0
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();
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
{
init_devices();
while(1)
;
}
//--------------------------------------------------------------------------------
程序测试:
| |
| | | |
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<
ADCSRA=(1<
模拟比较器上电默认是已经工作中的,跟其他的模块有所不同
ACD置位时,模拟比较器的电源被切断。可以在任何时候设置此位来关掉模拟比较器。
这可以减少器件工作模式及空闲模式下的功耗。
改变ACD位时,必须清零ACSR 寄存器的ACIE位来禁止模拟比较器中断。否则ACD改变时可能会产生中断
ACBG 置位后,模拟比较器的正极输入由1.23V能隙基准源所取代。否则, AIN0 连接到模拟比较器的正极输入。
模拟比较器的输出经过同步后直接连到ACO。同步机制引入了1-2 个时钟周期的延时。
当比较器的输出事件触发了由ACIS1 及ACIS0 定义的中断模式时,ACI 置位。
如果ACIE 和SREG 寄存器的全局中断标志I 也置位,那么模拟比较器中断服务程序即得以执行,同时ACI 被硬件清零。
ACI 也可以通过写"1” 来清零。
当ACIE 位被置"1” 且状态寄存器中的全局中断标志I 也被置位时,模拟比较器中断被激活。
否则中断被禁止。
这个功能用于检测一些微弱的触发信号源,节省一个外部运放。
ACIC置位后允许通过模拟比较器来触发T/C1 的输入捕捉功能。
此时比较器的输出被直接连接到输入捕捉的前端逻辑,从而使得比较器可以利用T/C1 输入捕捉中断逻辑的噪声抑制器及触发沿选择功能。
为了使比较器可以触发T/C1 的输入捕捉中断,定时器中断屏蔽寄存器TIMSK 的TICIE1 必须置位。
ACIC 为"0” 时模拟比较器及输入捕捉功能之间没有任何联系。
这两位确定触发模拟比较器中断的事件。
ACIS1 ACIS0 中断模式
0 0 比较器输出变化即可触发中断
0 1 保留
1 0 比较器输出的下降沿产生中断
1 1 比较器输出的上升沿产生中断
需要改变ACIS1/ACIS0 时,必须清零ACSR 寄存器的中断使能位来禁止模拟比较器中断。否则有可能在改变这两位时产生中断。
*/
上一篇:ST7920控制显示程序
下一篇:基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计
推荐阅读最新更新时间:2024-03-16 15:17
设计资源 培训 开发板 精华推荐
- 逛东芝电子在线展会,上百份礼品等您拿!
- 免费申请评测:欧时电子(RS Components)树莓派3来袭,待你玩耍带你飞
- 悦读 TI 工业应用精选方案,闯关赢好礼喽!
- 答题赢好礼|ADI技术直通车 工业自动化控制及边缘计算
- 电工也疯狂!玩游戏,晒得分,赢4G U盘!
- 有奖直播|是德科技感恩月—遇见KeysightCare - 贵重仪器安全避坑指南
- Digi-Key KOL视频来袭~欢迎进入MicroPython的奇妙世界
- 如何“配齐”脉冲负载的电源设计需求
- 改变你对万用表的看法!福禄克首款热成像万用表Fluke-279FC功能畅想大征集!
- 是德科技感恩月直播已结束|高速示波器基础与是德新品示波器解析