打印
[AVR单片机]

求助:应用MEGA16定时器1产生SPWM出现的问题

[复制链接]
2274|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stoneke|  楼主 | 2010-4-20 22:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做输出频率可变的是SPWM波,用了MEGA16的定时器1的PWM功能,选择了波形产生模式8(相位与频率修正PWM,计数上限TOP=ICR1,OCR1x更新时刻:BOTTOM),我的思路是设置ICR1的值来改变三角波载波频率从而改变输出的PWM频率,设置OCR1A,OCR1B产生从PD4,PD5产生两路互补输出占空比可调的SPWM波,想在TCNT1达到TOP(ICR1)时置位ICF1时产生输入捕捉中断程序中改变ICR1A,ICR1B的值,但是一直进不了定时器1的输入捕捉中断函数,不知道是不是思路有问题还是其他原因(各寄存器设置应该都没问题),请求帮助~~  
程序代码
#include<iom16v.h>
#include<macros.h>
#include<math.h>

#define uint unsigned int
#define uchar unsigned char

#define PI 3.1415926
#define N 60   //载波比
#define FS 50  //基波频率
#define M 0.5  //调制比
#define FCLK 8000000//晶振
#define DeadTime 32  //死区时间控制系数
//#pragma interrupt_handler timer1_ovf:9 //T/C1的溢出中断
#pragma interrupt_handler timer1_capt:6 //T/C1的输入捕捉中断

double sin_temp[N];//占空比
uint TOP;
void port_init(void)
{
   DDRD|=BIT(4)|BIT(5);// OC1A,OC1B互补输出
}
void timer1_init(void)
{     
   TCCR1A=0XB0;//1011 0000
TCCR1B=0X11;//0001 0001,PWM模式8
TIMSK=0X20;  //开输入捕捉中断
ICR1=(uint)(FCLK/(2*N*FS));
TOP=ICR1;
OCR1A=(uint)(TOP*sin_temp[0])-DeadTime;
OCR1B=(uint)(TOP*sin_temp[0])+DeadTime;
TCNT1=0;
}

void main(void)
{
   uchar i;
port_init();
for(i=0;i<N;i++)
{
    sin_temp=0.5+0.5*M*sin(i*2*PI/N);
}
timer1_init();
SREG|=BIT(7);//开总中断
while(1)
{
   
}
}


void timer1_capt(void)
{
   uchar i;
i+=1;
if(i<=N)
{
   OCR1A=(uint)(TOP*sin_temp)-DeadTime;
OCR1B=(uint)(TOP*sin_temp)+DeadTime;
}
else
i=0;
}


但是调了好久发现进不了中断,不知为什么,特此请教!

相关帖子

沙发
xiaomifan| | 2010-5-15 12:22 | 只看该作者
没看懂···

使用特权

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

本版积分规则

2

主题

5

帖子

0

粉丝