***************普通 SPWM 程序************************/
#ifndef _NORMAL_SPWM_H
#define _NORMAL_SPWM_H
//SPWM 表结构体 三项公用一个表
typedef struct _SPWM_table
{
Uint16 TableSize; //表大小 即表中所有数据
Uint16 SpwmSize; //SPWM 表大小
volatile Uint16 *p_SPWM_A; //A 相指针
volatile Uint16 *p_SPWM_B; //B 相指针
volatile Uint16 *p_SPWM_C; //C 相指针
Uint16 *p_HeadTable; //表头指针 指向 SPWM 表
}SPWM_TABLE;
extern SPWM_TABLE g_SPWM_Table; //全局SPWM表
void InitSpwm(void);
void StartSpwm(void);
interrupt void ISR_T1UFINT_NORMAL_FUNC(void);
void CalcSpwmWithSym(float32 a/*调制比*/,float32 w_Hz/*调制频率*/,float32 z_Hz/*载波频 率*/);
void CalcSpwmWithImSym(float32 a/*调制比*/,Uint16 w_Hz/*调制频率*/,Uint32 z_Hz/*载波 频率*/);
void CalcSpwmWithArea(float32 a/*调制比*/,Uint16 w_Hz/*调制频率*/,Uint32 z_Hz/*载波频 率*/);
#endif
源文件
#include \"DSP281x.h\"
#include \"SPWM.h\"
#include \"float.h\"
#include \"math.h\"
#define MAX_BUF 400
#define PI 3.1415926
Uint16 g_spwm_data[MAX_BUF]; //表的数据存储
SPWM_TABLE g_SPWM_Table; //全局SPWM表
//SPWM 初始化程序
void InitSpwm(void)
{
g_SPWM_Table.p_HeadTable=g_spwm_data; //指向数据表
g_SPWM_Table.TableSize=MAX_BUF; //存储表的大小
EALLOW;
PieVectTable.T1UFINT=&ISR_T1UFINT_NORMAL_FUNC;
EDIS;
IER|=M_INT2; //开中断2
PieCtrlRegs.PIEIER2.bit.INTx6=1; //开下益中断
EvaRegs.EVAIFRA.bit.T1UFINT=1; //清楚中断标志
PieCtrlRegs.PIEACK.bit.ACK2 = 1; //响应同组中断
}
void StartSpwm(void)
{
EvaRegs.EVAIMRA.bit.T1UFINT = 1; //打开下益 中断
}
//对称规则采样法
void CalcSpwmWithSym(float32 a/*调制比*/,float32 w_Hz/*调制频率*/,float32 z_Hz/*载波频 率*/)
{
Uint16 tmp_PR; //T1 周期值
volatile Uint16 i,n,*p;
float32 m;
m = z_Hz/w_Hz ; //求出载波比
g_SPWM_Table.SpwmSize =(Uint16)m;
tmp_PR=g_T1_Clk/(2*z_Hz); //计算出其周期值
p=g_SPWM_Table.p_HeadTable; //得到数据表头指针
for(i=0;i<(Uint16)m;i++)
{
n=tmp_PR*(0.5-0.5*a*sin((i+0.75)*2*PI/m));
*p=n;
p++;
}
}
//不对称规则采样法
void CalcSpwmWithImSym(float32 a/*调制比*/,Uint16 w_Hz/*调制频率*/,Uint32 z_Hz/*载波 频率*/)
{ Uint16 tmp_PR; //T1 周期值
volatile Uint16 i,n,*p;
float32 m;
m = z_Hz/w_Hz ; //求出载波比
g_SPWM_Table.SpwmSize =(Uint16)m;
tmp_PR=g_T1_Clk/(2*z_Hz); //计算出其周期值
p=g_SPWM_Table.p_HeadTable; //得到数据表头指针
for(i=0;i<(Uint16)m;i++)
{
n=tmp_PR*(0.5-0.25*a*(sin((i+0.25)*2*PI/m)+sin((i+0.75)*2*PI/m)));
*p=n; p++;
}
}
//面积法
void CalcSpwmWithArea(float32 a/*调制比*/,Uint16 w_Hz/*调制频率*/,Uint32 z_Hz/*载波频 率*/)
{
//Uint16 tmp_PR; //T1 周期值
volatile Uint16 i,n,*p;
float32 m,n1,n2;
m=z_Hz/w_Hz; //求出载波比
g_SPWM_Table.SpwmSize =(Uint16)m;
//tmp_PR=g_T1_Clk/(2*z_Hz);//计算出其周期值
p=g_SPWM_Table.p_HeadTable; //得到数据表头指针
n=m;
m/=2; //除去一半 计算半波
n1=(float32)g_T1_Clk/(8.0*m*w_Hz); //计算首相
n2=(float32)g_T2_Clk/(8.0*PI*w_Hz)*a;
for(i=0;i *p=n1-n2*(cos(i*PI/m)-cos((i+1)*PI/m)); p++; } } //中断程序 interrupt void ISR_T1UFINT_NORMAL_FUNC(void) { static Uint16 cnt=0 ; //计数 EvaRegs.CMPR1 = g_spwm_data[cnt]; cnt++; if(cnt>=g_SPWM_Table.SpwmSize) cnt = 0; EvaRegs.EVAIFRA.bit.T1UFINT=1; PieCtrlRegs.PIEACK.bit.ACK2 = 1; EINT; } 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务