请教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) //空循环
{}
} 我怎么感觉用1M的内部时钟根本做不出500K的波形 用定时器的硬件PWM输出模式才有可能。用定时器中断的方式无法用1M的系统时钟产生100K以上的方波。 哦,是不是由于使用C 的原因?使用汇编应该会好点。 本帖最后由 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);
感谢解惑{:smile:}
页:
[1]