打印
[AVR单片机]

我用m16的计数器产生方波,为什么频率最高只能到达128k?

[复制链接]
1979|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
94179411|  楼主 | 2007-8-23 21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
时钟源用的是外部8.192mHz,无论怎么设置计数初值,方波输出的最高频率就是128k
源程序:
//***********************************************************************|
// 功能:        256K和8K方波产生
// 功能说明:    系统时钟采用外部8.192M晶体,T/C0计数法产生256KHz方波, T/C0的
//              时钟源采用系统时钟(不分频)即每记一次数(TCNT0增加1)   需要
//              1/8.192 us的时间。256KHz的时钟周期为1/256ms=1000/256us, 因此
//                 半周期需要计数1000/256/2/(1/8.192)=16次,即TCNT0初始值为
//                256-16=240=0XF0
// MCU:            ATmega16
// 编程语言:    AVR-ICC
// 工具软件:    ICCAVR和PonyProg2000
// 系统时钟:    外部8.192MHz晶振
// 熔丝位设置:    CKOPT=1 CKSEL3..0=1111 SUT1..0=10(1表示未编程,0表示编程)
// 作者:        靖文(http://94179411.21ic.org/)
//***********************************************************************|
#include <iom16v.h>
#include <macros.h>

#define set_bit(x,y)  (x|=(1<<y))//置位寄器x的第y位
#define clr_bit(x,y)  (x&=~(1<<y))//清零寄器x的第y位

void main(void)
{
 unsigned int i;
 unsigned char n;
 
 DDRB|=BIT(1)
 
 set_bit(TCCR0,CS00);// T/C0采用系统时钟不分频
 set_bit(TIMSK,TOIE0);//允许定时器T/C0溢出中断
 TCNT0=240;//256K方波产生的计数初始值
 SEI();//开中断
 while(1);
}
 
 #pragma interrupt_handler F256K:iv_TIMER0_OVF//指定中断服务程序的入口
void F256K(void)//产生256KHz的方波信号
{
   TCNT0=240;
   PORTB^=BIT(1);//翻转PB1口电平
}
 

相关帖子

沙发
一级菜鸟| | 2007-8-23 22:06 | 只看该作者

LZ原来用51的吧

TCNT不需要在中断内重新赋值,使用CTC模式定时器,设定好OCR0即可

使用特权

评论回复
板凳
stycx| | 2007-8-23 22:59 | 只看该作者

理论上 PWM频率 * 精度 = 时钟频率 / 分频比

最大值为
PWM频率 = 时钟频率 / 分频比 / 精度=8.192MHz/1/2=4.096MHz

不知道是否能实现

使用特权

评论回复
地板
hotpower| | 2007-8-23 23:02 | 只看该作者

为何不用自带的PWM模块???

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

191

帖子

1

粉丝