ldhavr 发表于 2012-8-8 13:48:57

请教MEGA48定时器无法得到所需频率方波的问题

我使用系统时钟1M(片内RC8M震荡)定时器2比较匹配中断,想从某一个IO口输出500KKH(200左右都行)的方波 。但是最大得到12KHz的波形(使用仿真和示波器看都是如此)。
特意请教问题所在望回复谢谢! (由于OC2X已被占用未使用比较匹配发生时OC2A 取反输出模式)。采用定时器溢出方式时最大只得到得到5K的方波。
附程序(使用ICCAVR7.22编译)


/********************
*   头文件声明区    *
********************/

#include <iom48v.h>         
                                                      //调入48的库函数
#include <macros.h>         
                                                  //(宏函数库)
#include "RD_UseAVRPORTBit.h"
                                                      //位操作支持库

       
                                       
void inint (void)
{
DDRC = 0xff;
TCCR2B = 0x00; //stop
TCCR2A|=(1<<WGM21);   //CTC模式
TIMSK2|= (1<<OCIE2A); //输出比较匹配 A 中断使能
TCCR2B=1;             //1分频
OCR2A=1;               //500K

}
/***********************************************************
*   函数声明:定时器 比较匹配中断服务子函数                *
*                                        *
***********************************************************/
#pragma interrupt_handler timerS_ovf_isr:8
void timerS_ovf_isr (void)
{
_PC1 ^= 1;                                                           //时钟输出
}                                               
                       
void main (void)               

{
inint();                       // 初始化
SEI ();                   //全局中断能使
while(1)         //空循环
    {}
       
}

xiaojiong886 发表于 2012-8-9 16:59:06

我怎么感觉用1M的内部时钟根本做不出500K的波形

Gorgon_Meducer 发表于 2012-8-10 09:54:58

用定时器的硬件PWM输出模式才有可能。用定时器中断的方式无法用1M的系统时钟产生100K以上的方波。

ldhavr 发表于 2012-8-10 11:09:00

哦,是不是由于使用C 的原因?使用汇编应该会好点。

Gorgon_Meducer 发表于 2012-8-10 15:47:19

本帖最后由 Gorgon_Meducer 于 2012-8-10 15:50 编辑

ldhavr 发表于 2012-8-10 11:09 static/image/common/back.gif
哦,是不是由于使用C 的原因?使用汇编应该会好点。

如果你去了解下中断的过程你就知道,即便用汇编,在执行中断处理程序的时候也会消耗一定的周期数,如果我没有记错
好像至少是4个周期,那么就算反转端口用2个指令周期加上RETI的2个指令周期,这样一个中断处理程序也
需要消耗8个指令周期。如果你跑1M,那么显然就只有128K了。考虑到端口反转两次才是一个PWM周期,所以实际的PWM
波形只有128K/ 2也就是64K。

反之,如果你不用定时器来做,而是不用任何中断,只在主循环里面通过写PIN寄存器(没错是PIN寄存器)来实现端口翻转
则能输出大约250K的频率。
DDRC |= BIT(PC1);
do {
    PINC = BIT(PC1);    //翻转一次PC1
} while(1);

ldhavr 发表于 2012-8-14 16:08:56

感谢解惑{:smile:}
页: [1]
查看完整版本: 请教MEGA48定时器无法得到所需频率方波的问题