搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2012-8-8 13:48:57 | 显示全部楼层 |阅读模式
我使用系统时钟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)           //空循环
    {}
       
}

出0入0汤圆

发表于 2012-8-9 16:59:06 | 显示全部楼层
我怎么感觉用1M的内部时钟根本做不出500K的波形

出0入296汤圆

发表于 2012-8-10 09:54:58 | 显示全部楼层
用定时器的硬件PWM输出模式才有可能。用定时器中断的方式无法用1M的系统时钟产生100K以上的方波。

出0入0汤圆

 楼主| 发表于 2012-8-10 11:09:00 | 显示全部楼层
哦,是不是由于使用C 的原因?使用汇编应该会好点。

出0入296汤圆

发表于 2012-8-10 15:47:19 | 显示全部楼层
本帖最后由 Gorgon_Meducer 于 2012-8-10 15:50 编辑
ldhavr 发表于 2012-8-10 11:09
哦,是不是由于使用C 的原因?使用汇编应该会好点。


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

反之,如果你不用定时器来做,而是不用任何中断,只在主循环里面通过写PIN寄存器(没错是PIN寄存器)来实现端口翻转
则能输出大约250K的频率。

  1. DDRC |= BIT(PC1);
  2. do {
  3.     PINC = BIT(PC1);    //翻转一次PC1
  4. } while(1);
复制代码

出0入0汤圆

 楼主| 发表于 2012-8-14 16:08:56 | 显示全部楼层
感谢解惑
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 17:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表