daniao 发表于 2008-4-10 23:09:39

请问马老师,关于Mega8的T/C2匹配中断后,OC2输出的电平问题?

马老师您好,我用mega8的T/C2的CTC模式,并在匹配时翻转OC2的输出电平,结果出来的方波是+-2.5V,为什么不是0和5V呢?

daniao 发表于 2008-4-11 00:17:07

补充:就是您主编的《AVR单片机嵌入式系统原理与应用实践》一书中,P257例8.5,用示波器交流状态看到输出的方波为什么是+-2.5V的?而不是0或5V?

machao 发表于 2008-4-11 01:14:00

为什么用交流状态?

daniao 发表于 2008-4-11 10:01:42

示波器的直流和交流耦合状态都有示数,交流耦合的示数是稳定的,而且显示的频率是我设定需要的方波频率,而直流示数确实是0/5V,但是不稳定,也不知道频率多少。我原先的意图是想把OC2输出的0/5V脉冲信号,输入到TC4427,利用TC4427(输入必须为正)的驱动能力把脉冲幅度提高,结果把OC2接到TC4427的输入端后不久,发现Mega8烧坏了,然后再看OC2的输出波形,才发现原来Mega8会输出负电平,试了一下您书中的例8.6输出的pwm波也是+-2.5V,百思不得其解,希望马老师指点一下怎么回事?如果要实现我上面所说的功能,是不是只能通过不断改变普通I/O口的电平实现?

daniao 发表于 2008-4-11 11:37:59

#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, 直流也是脉冲,可是频率不知道多少?

machao 发表于 2008-4-11 18:09:07

AVR不会输出负电平.

你的电子基础实在不敢恭维,示波器也不会使用.数字逻辑实验中没有学习过如何测量0-5V脉冲信号?

用直流看输出信号,将示波器的触发调到0V以上就能看到稳定的0-5V的脉冲波,频率也可测量.

daniao 发表于 2008-4-12 10:52:41

不好意思马老师,我不是学电子出身,所以电子基础真是半桶水,但上述问题不是我不会用示波器的原因,我使用的是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);
      };
}

machao 发表于 2008-4-12 14:16:55

请使用直流档看波形!!

示波器的交流档内部有隔直电容.
页: [1]
查看完整版本: 请问马老师,关于Mega8的T/C2匹配中断后,OC2输出的电平问题?