使者0123 发表于 2012-4-27 14:23:56

avr输出频率

我用的是atmega88,想通过用定时器0来输出pwm,频率为1MHz,不知道怎么回事,只能到29.3KHz,我用的是pc3输出的
给我指点一下
代码如下:
void Timer0_Init()
{
TCCR0A = 0X02; //
TCCR0B = 0X00; //关闭timer0
TCNT0= 0X00; //计数寄存器
OCR0B= 0X80; //比较 寄存器
TCCR0B = 0X01; //开启timer
}

使者0123 发表于 2012-4-28 12:20:52

着急用啊,都来看看啊
{:mad:}{:dizzy:}

zhanan 发表于 2012-4-28 12:46:02

TCCR0A设置不对,M88的pc3也没有PWM输出。
不看手册啊!

使者0123 发表于 2012-4-28 13:56:03

zhanan 发表于 2012-4-28 12:46 static/image/common/back.gif
TCCR0A设置不对,M88的pc3也没有PWM输出。
不看手册啊!

我用的是中断,比较中断的时候置1,溢出中断的时候置0,
用的是快速pwm
void Timer0_Init()
{
TCCR0A = 0X03; //
TCCR0B = 0X00; //关闭timer0
TCNT0= 0X00; //计数寄存器
OCR0A= 0X20; //top值
OCR0B= 0X10; //比较 寄存器
TCCR0B = 0X09; //开启timer
}

zhanan 发表于 2012-5-1 09:07:11

本帖最后由 zhanan 于 2012-5-1 09:08 编辑

哪有这样用PWM的,还想达到1M频率。
就算用16M晶振,快速PWM也只能达到16000/(20+1)=762Khz。
OCR0A=15,理论上达到1M频率了,但4位分辨率的PWM有实际用途吗?

用中断实现的话,进出中断用的时间在这里就相当可观了。

xsh2005105326 发表于 2012-5-1 09:46:35

使者0123 发表于 2012-4-28 12:20 static/image/common/back.gif
着急用啊,都来看看啊

仔细看看手册就知道了,1M的频率是达不到的

wzyllgx 发表于 2012-5-1 10:21:06

PWM模式1M是输出不了的,CTC模式到是可以,但是占空比不可调是否有用?
8位的MCU要做到1M的PWM输出还是比较少的,500K可以的话可以看一下ATTINY25 26 261之类的。

使者0123 发表于 2012-5-2 10:12:49

zhanan 发表于 2012-5-1 09:07 static/image/common/back.gif
哪有这样用PWM的,还想达到1M频率。
就算用16M晶振,快速PWM也只能达到16000/(20+1)=762Khz。
OCR0A=15, ...

我也不想这么用啊,但是那些引脚都被占用了,没得用了

如果不用中断的话,可以输出1M吗?

使者0123 发表于 2012-5-2 10:15:26

wzyllgx 发表于 2012-5-1 10:21 static/image/common/back.gif
PWM模式1M是输出不了的,CTC模式到是可以,但是占空比不可调是否有用?
8位的MCU要做到1M的PWM输出还是比较 ...

我的CTC模式,最高能到80.2KHz
怎么让它到1M,占空比不可调也没关系

wzyllgx 发表于 2012-5-2 11:31:52

根据CTC的计算工式:fOCnA = fclk_I/O / 2 ⋅ N ⋅ (1 + OCRnA),但这必须是CTC输出IO,你看IO对就的第二功能。

iProduct 发表于 2012-5-2 12:09:45

LZ的现在实现是否是这样的:
只用定时器来产生中断(而不是直接输出PWM波形,因输出引脚被占用),在中断服务程序中翻转PC3,从而产生波形。
如LS所示,T0的CTC模式输出波形频率最快可达fclk_I/O / 2,中断产生频率最快可达fclk_I/O(当然不能使用这么快),
所以要产生1M的波形,关键取决于进出中断的时间和系统时钟。

使用较高的系统时钟 优化代码 即可实现1Mhz的波形输出,占空比也很可观。

使者0123 发表于 2012-5-2 12:25:45

ok明白了
只有特定的IO才能按照公式去计算频率,才能产生更高的频率

使者0123 发表于 2012-5-2 12:25:59

iProduct 发表于 2012-5-2 12:09 static/image/common/back.gif
LZ的现在实现是否是这样的:
只用定时器来产生中断(而不是直接输出PWM波形,因输出引脚被占用),在中断服 ...

嗯 ,就是你说的那样

使者0123 发表于 2012-5-2 12:26:14

谢谢大家的回答,让我懂得了很多

raxb 发表于 2012-5-16 12:53:48

使者0123 发表于 2012-5-2 12:26 static/image/common/back.gif
谢谢大家的回答,让我懂得了很多

定时0.5us中断,中断到就取反

machao 发表于 2012-5-17 13:28:34

本帖最后由 machao 于 2012-5-17 13:29 编辑

raxb 发表于 2012-5-16 12:53 static/image/common/back.gif
定时0.5us中断,中断到就取反

产生一个固定频率的方波,定时器应该采用比较匹配输出的方式,根本不需要用任何的中断。使用16M系统时钟,AVR可以产生最高4M的方波序列,同时还有充足的时间做其它的事情。

中断取反,是老51的概念,以经OUT、OUT、呕吐了,怎么还是抱着老的东西舍不得丢弃。关于这个问题,我在的这个讨论组中曾经发过专贴“http://www.ourdev.cn/forum.php?mod=viewthread&tid=3737664&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1”

楼上的朋友,购买一本我的教材吧,认真从基础扎实的学起。

raxb 发表于 2012-5-17 14:15:00

machao 发表于 2012-5-17 13:28 static/image/common/back.gif
产生一个固定频率的方波,定时器应该采用比较匹配输出的方式,根本不需要用任何的中断。使用16M系统时钟 ...

多谢马老师批评指正,很受教,只是我是很不熟悉AVR,不知道其它单片机是否有此功能...

machao 发表于 2012-5-17 14:25:56

raxb 发表于 2012-5-17 14:15 static/image/common/back.gif
多谢马老师批评指正,很受教,只是我是很不熟悉AVR,不知道其它单片机是否有此功能... ...

新的控制器中,定时器都是这样。AVR\STM32\M8......就是改良的51,定时器也有此功能。你找STC51的新型51数据手册看一下吧。
这也是我推荐学习AVR的原因之一。学习要学新的东西,掌握好的技术。
现在大学中这个领域的教育和教师,都是OUT的,所以学生也是OUT的。更可怕的是,还没有清楚的认识到,大谈什么“创新”教育,连目前在技术上发展的新东西,新方法、新思路都不知道,还谈什么“创新”?呕吐!

使者0123 发表于 2012-5-25 18:28:38

machao 发表于 2012-5-17 14:25 static/image/common/back.gif
新的控制器中,定时器都是这样。AVR\STM32\M8......就是改良的51,定时器也有此功能。你找STC51的新型51 ...

说的太好了,就该掌握新技术,大学里面教的东西都太落后了,早就跟社会拖节了
页: [1]
查看完整版本: avr输出频率