请问马老师,关于Mega8的T/C2匹配中断后,OC2输出的电平问题?
马老师您好,我用mega8的T/C2的CTC模式,并在匹配时翻转OC2的输出电平,结果出来的方波是+-2.5V,为什么不是0和5V呢? 补充:就是您主编的《AVR单片机嵌入式系统原理与应用实践》一书中,P257例8.5,用示波器交流状态看到输出的方波为什么是+-2.5V的?而不是0或5V? 为什么用交流状态? 示波器的直流和交流耦合状态都有示数,交流耦合的示数是稳定的,而且显示的频率是我设定需要的方波频率,而直流示数确实是0/5V,但是不稳定,也不知道频率多少。我原先的意图是想把OC2输出的0/5V脉冲信号,输入到TC4427,利用TC4427(输入必须为正)的驱动能力把脉冲幅度提高,结果把OC2接到TC4427的输入端后不久,发现Mega8烧坏了,然后再看OC2的输出波形,才发现原来Mega8会输出负电平,试了一下您书中的例8.6输出的pwm波也是+-2.5V,百思不得其解,希望马老师指点一下怎么回事?如果要实现我上面所说的功能,是不是只能通过不断改变普通I/O口的电平实现? #include <delay.h>#include <mega8.h>
unsigned char temp=0xe1;
#define key_up PIND.2
#define key_down PIND.3
// External Interrupt 0 service routine
interrupt void ext_int0_isr(void)
{
delay_ms(20);
if(!key_up)
{
//while(key_up);
//OCR2 = --temp;
++temp;
if(temp <= 0xf1) TCNT0 = temp;
else
{
temp = 0xf1;
TCNT0 = temp;
}
}
}
// External Interrupt 1 service routine
interrupt void ext_int1_isr(void)
{
delay_ms(20);
if(!key_down)
{
//while(key_down);
//OCR2 = ++temp;
--temp;
if(temp >= 0xdf) TCNT0 = temp;
else
{
temp = 0x1f;
TCNT0 = temp;
}
}
}
// Timer 0 overflow interrupt service routine
interrupt void timer0_ovf_isr(void)
{
TCNT0 = temp;
PORTB.3 = ~PORTB.3;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x03;
TCNT0=temp;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
GICR|=0xC0;
MCUCR=0x0A;
GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
我改成上面这个程序也是,从PB3输出的有直流和交流两种成分,交流脉冲的频率是我想要的,可是是+-2.5V, 直流也是脉冲,可是频率不知道多少? AVR不会输出负电平.
你的电子基础实在不敢恭维,示波器也不会使用.数字逻辑实验中没有学习过如何测量0-5V脉冲信号?
用直流看输出信号,将示波器的触发调到0V以上就能看到稳定的0-5V的脉冲波,频率也可测量. 不好意思马老师,我不是学电子出身,所以电子基础真是半桶水,但上述问题不是我不会用示波器的原因,我使用的是Tektronix的数字示波器,另外我又用89c51试了一下实现同样功能的程序,89c51也出现同样的情况,后来问了电子系的同学,同学把高电平和低电平的变换时间分别延长到200ms之后(见下面程序),发现示波器上一个个类似电容充放电的过程的波形,而且有正负,猜想可能是单片机引脚内部电容所致或是数字示波器有延时?后来换了一台IWATSU的模拟示波器测后,就不存在上述问题了,仍然非常感谢马老师的耐心解释。
#include <delay.h>
#include <mega8.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
DDRB=0x08;
while (1)
{
PORTB=0x00;
delay_ms(200);
PORTB=0x08;
delay_ms(200);
};
} 请使用直流档看波形!!
示波器的交流档内部有隔直电容.
页:
[1]