打印
[AVR单片机]

纳闷的PWM问题

[复制链接]
3044|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guxiang|  楼主 | 2007-6-3 21:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何使用PWM中的方式15?原程序如下:
//ICC-AVR application builder : 2007-5-28 19:25:02
// Target : T2313
// Crystal: 7.3728Mhz

#include <iot2313v.h>
#include <macros.h>
#pragma ctask timer1_init,port_init,uart0_init,init_devices,interrupt_handler timer1_capt_isr

unsigned char icpl,icph,flag;
 
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00; 
 PORTB = 0x00;
 DDRB  = 0x10; 
 PORTD = 0x00;
 DDRD  = 0x3C; 
}

//TIMER1 initialize - prescale:1
// WGM: 15) PWM fast, TOP=OCRnA
// desired value: 550uSec
// actual value: 549.995uSec (0.0%)

void timer1_init(void)
{
 TCCR1B = 0x00; //stop timer
 TCNT1H = 0x00; //set count value
 TCNT1L = 0x00;
  OCR1AH  = 0xFF; //set compare value
 OCR1AL  = 0xFF;
 OCR1BH  = 0xF0; //set compare value
 OCR1BL  = 0x29;
 TCCR1A = 0x23;
 TCCR1B = 0x99; //start Timer

}

#pragma  interrupt_handler timer1_capt_isr:4
void timer1_capt_isr(void)
{
 //timer 1 input capture event, read (int)value in ICR1 using;
 if(!flag)
{
 icpl=ICR1L;   //Read low byte first (important)
 icph=ICR1H;    //Read high byte and shift into top byte
 flag=1;
}
}

/*
#pragma interrupt_handler timer1_compb_isr:13
void timer1_compb_isr(void)
{ //compare occured TCNT1=OCR1A
}

#pragma interrupt_handler timer1_ovf_isr:6
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 TCNT1H = 0xF0; //reload counter high value
 TCNT1L = 0x2A; //reload counter low value
}
*/

//UART0 initialize
// desired baud rate: 19200
// actual: baud rate:19200 (0.0%)
void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 
 UCSRA = 0x00;
 UCSRC = 0x06;
 UBRRH = 0x00; //set baud rate upper
 UBRRL = 0x17; //set baud rate lower
 UCSRB = 0x18; //enable
}

//call this routine to initialize all peripherals
 
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer1_init();
 uart0_init();

 MCUCR = 0x00;
 GIMSK = 0x00;
 TIMSK = 0x08;
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

//
void main(void)
{
 init_devices();
 //insert your functional code here...
while(1)
{
if(flag)
{
while(!(UCSRA&0x20));
UDR=icph;
while(!(UCSRA&0x20));
UDR=icpl;
flag=0;
}

}

}

软件仿真调试时虽然设置的还是模式15,但是却变成模式9下工作,硬件运行时用示波器观察波形周期,也是在模式9下工作.OCRA和OCRB的高6位被舍弃一样,为什么?

相关帖子

沙发
zhiwei| | 2007-6-3 21:40 | 只看该作者

avrstudio

的问题,

使用特权

评论回复
板凳
guxiang|  楼主 | 2007-6-4 11:01 | 只看该作者

2楼的兄弟

2楼的兄弟,我有证据认为不是AVRSTUDIO的问题。我把程序写到ATTINY2313中去,用面包板搭建一个硬件测试电路,晶振用的是11.059MHz的(程序是用7.3728Mhz),然后测试PWM管脚输出波形,测得周期为93us,对照晶振频率,TOP计数值(OCR1A)大约就在1024左右(0x3ff),而用AVRSTUDIO软件仿真时初始化中OCR1A被设置成0XFFFF,过后不知为何自己就变成了0x3fff,而前6位变成空的且不可设置。两种试验方法结果都一样。
我测试高电平时间为3.8us,相当于计数值为0x29,而OCR1B中设置的是OXF029,用AVRSTUDIO软件仿真时初始化中OCR1B被设置成0XF029,过后OCR1A变成了0x3fff的同时OCR1B变成了0X0029。
我的程序是否有问题还是AVR单片机根本就不支持PWM模式15?

使用特权

评论回复
地板
dadodo| | 2007-6-4 12:19 | 只看该作者

可以肯定

单片机本身是没有问题的

使用特权

评论回复
5
zhiwei| | 2007-6-4 12:40 | 只看该作者

我上次也是

调PWM,软件仿真时模式10变成了8,但是硬件照常运行。所以有理由怀疑avrstudio。如果你不肯定的话把测试程序发给atmel,看他们怎么说。

使用特权

评论回复
6
Ascarikz1| | 2007-6-25 16:04 | 只看该作者

免费软件的郁闷!!

我也做过PWM实验.程序使用的是T/C1,使用vmlab软件仿真,但是令人非常郁闷的是:设置不了模式为8~15.因为不管怎么样设置TCCR1B的WGM13位,去查看timer 1的位4,始终是0.然而实际的硬件仿真却是没问题.

使用特权

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

本版积分规则

6

主题

23

帖子

1

粉丝