请教马老师关于PWM输出问题 中国电子开发网(www.ourdev.cn)
来源:百度文库 编辑:神马文学网 时间:2024/04/28 04:21:51
产生SPWM用于逆变器控制H桥,从而产生频率和电压幅值可变的正弦波输出
思路是:用MEGA16的定时器1产生SPWM输出,每个采样点时刻的占空比存入这个数组sin_temp[j]=0.5+0.5*M*sin(j*2*PI/N);如果采用pwm输出模式8的话,则ICR1的值为TOP值,那么OCR1A,OCR1B中的寄存器值就为 (uint)(TOP*sin_temp[i]),我想在进入比较匹配中断的时候(或者溢出中断的时候)改变OCR1A,OCR1B的值,这样输出就能产生两路互补的SPWM波,其中ICR1的值改变载波频率,M为调制度(用于改变电压幅值),N为载波比(改变输出电压频率)
但是我调试了好久都是只输出一个固定占空比的PWM
这是我的调试程序:
#include
#include
#include
#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 16 //死区时间控制系数
float sin_temp[N];//占空比
uint TOP1;
uint temp[N];
uchar count=1;
void port_init(void)
{
DDRD|=BIT(4)|BIT(5);// OC1A,OC1B互补输出
}
void timer1_init(void)
{
TCCR1A=0XB0;//1011 0000 OC1A,OC1B互补输出
//TCCR1A=0XB3;
TCCR1B=0X10;//0001 0000,PWM模式8,关定时器
//TIMSK|=BIT(TOIE1); //开输入捕捉中断
TIMSK|=BIT(OCIE1A)|BIT(OCIE1B);//比较匹配中断
//TIMSK|=BIT(TICIE1);//输入捕获中断开
ICR1=(uint)(FCLK/(2*N*FS));
OCR1A=temp[0]-DeadTime;
OCR1B=temp[0]+DeadTime;
}
/*#pragma interrupt_handler t1_capt: 6 // T/C1的输入捕捉中断
void t1_capt(void)
{
OCR1A=(uint)(TOP1*sin_temp[count++])-DeadTime;
OCR1B=(uint)(TOP1*sin_temp[count++])+DeadTime;
PORTB^=BIT(3);
if(count>N) count=0;
}
#pragma interrupt_handler timer1_ovf:9 //T/C1的溢出中断
void timer1_ovf(void)
{
count++;
if(count<=N)
{
//OCR1A=(uint)(TOP1*sin_temp[i])-DeadTime;
//OCR1B=(uint)(TOP1*sin_temp[i])+DeadTime;
OCR1A=temp[count]-DeadTime;
OCR1B=temp[count]+DeadTime;
PORTB^=BIT(3);
}
else
count=0;
}*/
#pragma interrupt_handler timer1_compa:7//比较匹配A中断
void timer1_compa(void)
{
if(count<=N)
{
OCR1A=temp[count++]-DeadTime;
}
else
count=0;
}
#pragma interrupt_handler timer1_compb:8//比较匹配B中断
void timer1_compb(void)
{
if(count<=N)
{
OCR1B=temp[count++]+DeadTime;
}
else
count=0;
}
void main(void)
{
uchar j;
CLI();
TOP1=(uint)(FCLK/(2*N*FS));
port_init();
for(j=0;j {
sin_temp[j]=0.5+0.5*M*sin(j*2*PI/N);//各采样点的占空比
temp[j]=(uint)(TOP1*sin_temp[j]);
}
timer1_init();
TIFR=0;
TCNT1=0;
SEI();//开总中断
TCCR1B=0X11;//PWM模式8,开定时器
DDRB|=BIT(3);
PORTB&=~BIT(3);
while(1);
}
思路是:用MEGA16的定时器1产生SPWM输出,每个采样点时刻的占空比存入这个数组sin_temp[j]=0.5+0.5*M*sin(j*2*PI/N);如果采用pwm输出模式8的话,则ICR1的值为TOP值,那么OCR1A,OCR1B中的寄存器值就为 (uint)(TOP*sin_temp[i]),我想在进入比较匹配中断的时候(或者溢出中断的时候)改变OCR1A,OCR1B的值,这样输出就能产生两路互补的SPWM波,其中ICR1的值改变载波频率,M为调制度(用于改变电压幅值),N为载波比(改变输出电压频率)
但是我调试了好久都是只输出一个固定占空比的PWM
这是我的调试程序:
#include
#include
#include
#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 16 //死区时间控制系数
float sin_temp[N];//占空比
uint TOP1;
uint temp[N];
uchar count=1;
void port_init(void)
{
DDRD|=BIT(4)|BIT(5);// OC1A,OC1B互补输出
}
void timer1_init(void)
{
TCCR1A=0XB0;//1011 0000 OC1A,OC1B互补输出
//TCCR1A=0XB3;
TCCR1B=0X10;//0001 0000,PWM模式8,关定时器
//TIMSK|=BIT(TOIE1); //开输入捕捉中断
TIMSK|=BIT(OCIE1A)|BIT(OCIE1B);//比较匹配中断
//TIMSK|=BIT(TICIE1);//输入捕获中断开
ICR1=(uint)(FCLK/(2*N*FS));
OCR1A=temp[0]-DeadTime;
OCR1B=temp[0]+DeadTime;
}
/*#pragma interrupt_handler t1_capt: 6 // T/C1的输入捕捉中断
void t1_capt(void)
{
OCR1A=(uint)(TOP1*sin_temp[count++])-DeadTime;
OCR1B=(uint)(TOP1*sin_temp[count++])+DeadTime;
PORTB^=BIT(3);
if(count>N) count=0;
}
#pragma interrupt_handler timer1_ovf:9 //T/C1的溢出中断
void timer1_ovf(void)
{
count++;
if(count<=N)
{
//OCR1A=(uint)(TOP1*sin_temp[i])-DeadTime;
//OCR1B=(uint)(TOP1*sin_temp[i])+DeadTime;
OCR1A=temp[count]-DeadTime;
OCR1B=temp[count]+DeadTime;
PORTB^=BIT(3);
}
else
count=0;
}*/
#pragma interrupt_handler timer1_compa:7//比较匹配A中断
void timer1_compa(void)
{
if(count<=N)
{
OCR1A=temp[count++]-DeadTime;
}
else
count=0;
}
#pragma interrupt_handler timer1_compb:8//比较匹配B中断
void timer1_compb(void)
{
if(count<=N)
{
OCR1B=temp[count++]+DeadTime;
}
else
count=0;
}
void main(void)
{
uchar j;
CLI();
TOP1=(uint)(FCLK/(2*N*FS));
port_init();
for(j=0;j
sin_temp[j]=0.5+0.5*M*sin(j*2*PI/N);//各采样点的占空比
temp[j]=(uint)(TOP1*sin_temp[j]);
}
timer1_init();
TIFR=0;
TCNT1=0;
SEI();//开总中断
TCCR1B=0X11;//PWM模式8,开定时器
DDRB|=BIT(3);
PORTB&=~BIT(3);
while(1);
}
请教马老师关于PWM输出问题 中国电子开发网(www.ourdev.cn)
ARM 开发软件及实用工具介绍 中国电子开发网(www.ourdev.cn)
请不要做浮躁的嵌入式系统工程师 中国电子开发网(www.ourdev.cn)
请不要做浮躁的嵌入式系统工程师 中国电子开发网(www.ourdev.cn)
ARM 开发软件及实用工具介绍 中国电子开发网(www.ourdev.cn)
转来的一篇文章:#ifdef的用法 中国电子开发网(www.ourdev.cn)
分享我的STM32开发板 (www.ourdev.cn)
STM32外部中断进不去啊 (www.ourdev.cn)
STM32 深入浅出 (新手必看) (www.ourdev.cn)
51单片机做电子相册-fat32文件系统 (www.ourdev.cn)
中国五金电子行业门户 http://www.wjdz88.cn
请教关于强肾问题
关于中国如何开发服务业的问题
关于中国大芬油画专卖网 www.painting.net.cn
关于国内葡萄酒上市公司的介绍- 中国红酒网 www.winechina.cn
中国竹刻网 www.zhuke.cn
用DSP56F805 PWM模块输出高频正弦波
请教一下关于中医方面的问题
请教:关于所得税的季度预缴问题
关于航空运输营业税纳税地点等问题的函 财税法规 中国财务总监网 www.chinacfo....
请教个关于吊销公司处罚的问题 - 〖 登记注册 〗 - 中国红盾论坛 - |工商论坛|红盾...
特色英语词汇--X1 - 中国英语网 www.chinaenglish.com.cn
特色英语词汇--Y5 - 中国英语网 www.chinaenglish.com.cn
特色英语词汇--Y6 - 中国英语网 www.chinaenglish.com.cn