📄 pwm_m.c
字号:
//
// TMDX ALPHA RELEASE
// Intended for product evaluation purposes
//
//###########################################################################
//
// FILE: DSP28_Example.c
//
// TITLE: DSP28 CPU_Timer example program.
//
//###########################################################################
//
// Ver | dd mmm yyyy | Who | Description of changes
// =====|=============|======|===============================================
// 0.55| 06 May 2002 | S.S. | EzDSP Alpha Release
// 0.57| 27 May 2002 | L.H. | No change
//###########################################################################
// Step 0. Include required header files
// DSP28_Device.h: device specific definitions #include statements for
// all of the peripheral .h definition files.
// DSP28_Example.h is specific for the given example.
//#include "DSP28_Device.h"
//void main(void)
//{
/*初始化系统*/
// InitSysCtrl();
/*关中断*/
// DINT;
// IER = 0x0000;
// IFR = 0x0000;
/*初始化PIE控制寄存器*/
// InitPieCtrl();
/*初始化PIE矢量表*/
// InitPieVectTable();
/*初始化EV*/
// InitEv();
// EINT;
// ERTM;
// for(;;)
// {
// KickDog();
// }
//}
//实现了SPWM的输出
// #include "DSP281x_Device.h"
#include "DSP28_Device.h"
#include "stdio.h"
#include "math.h"
#include "float.h"
#define NX 404
#define PI 3.1415925
float M=0.8;
int k0=0,h1=0;
double a[NX];
void zkb();
interrupt void eva_T1UFINT_ISR(void);
unsigned int n=0;
float q,l,j;
void main(void)
{
InitSysCtrl(); //系统初始化
DINT; //禁止全局中断
IER=0x0000;
IFR=0x0000;
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x00FF; // EVA PWM 1-6 pins
EDIS;
InitPieCtrl();
InitPieVectTable();
EALLOW; //使能定时器1下益中断
PieVectTable.T1UFINT=&eva_T1UFINT_ISR;
EDIS;
IER|=M_INT2; //开中断2
// PieCtrlRegs.PIEIER2.bit.INTx6=1; //开下益中断
PieCtrl.PIEIER2.bit.INTx6=1; //by jjun
// PieCtrl.PIEIER2.all = M_INT4;
////////////////////
while (n<=NX)
{
q=(n+0.75); //为消除偶次偕波,减少谐波角度出发,选择从A相3/4周期进行采样
q=q*2*PI;
q/=405;
j=sin(q);
l=1875*(1+M*j);//M为振幅调制比 //计算占空比表达式
//if(l>=187&l<=1687)(此处网友设置为错误的)
if(l>=375&l<=3375)
a[n]=l;
else
{
if(l>3375)
a[n]=3375;
else
a[n]=375;
}
n=n+1;
}
//////////////////////////////
///init_eva
///////////////////////////////
EvaRegs.ACTRA.all=0x0666; //比较方式控制器,
// EvaRegs.DBTCONA.all = 0x0000; // Disable deadband
EvaRegs.DBTCONA.all = 0x0FBC; //by jjun
EvaRegs.COMCONA.all = 0xa600; //使能比较操作,选择禁止SVPWM模式
// EvaRegs.COMCONA.all = 0x8200; //by jjun
// EvaRegs.COMCONA.all = 0x8600; //by jjun
EvaRegs.EVAIMRA.all=0x0200;
//EVAIMRA(EVA的中断屏蔽寄存器A).T1UIINT(通用定时器1的下溢中断使能)
EvaRegs.EVAIMRB.all=0x0000;
EvaRegs.EVAIMRC.all=0x0000;
EvaRegs.EVAIFRA.all=0xffff;//EVAIFRA(EVA的中断标志寄存器.T1UIINT(通用定时器1的下溢中断标志)
EvaRegs.EVAIFRB.all=0xffff;//写1清除定时器1的下溢中断标志
EvaRegs.EVAIFRC.all=0xffff;
EvaRegs.CMPR1=0; //初始化寄存器的值
EvaRegs.CMPR2=0;
EvaRegs.CMPR3=0;
EvaRegs.GPTCONA.all=0x0041;//通用定时控制器。各定时器独立出发逻辑,输出低有效
//周期必须大于最大的正弦表格值
EvaRegs.T1PR = 3750; // Timer1 period PWM载波周期为 65536个定标的定时器时钟周期
//EvaRegs.T1PR = 0xffff;
//EvaRegs.T1CNT = 937; // Timer1 counter
EvaRegs.T1CNT = 937;
//EvaRegs.T1CON.all = 0x0b4e; // 选择模式产生PWM波10
EvaRegs.T1CON.all = 0x0b4e;
EINT;
// return;
///////////////////////////
EvaRegs.T1CON.all=EvaRegs.T1CON.all|0x0040; //启动定时器1
for(;;);
}
interrupt void eva_T1UFINT_ISR(void) // EV-A
{
int h2;
int flag;
flag=(EvaRegs.EVAIFRA.all)&0x0200; //T1UFINT中下益中断标志位置1
if(flag!=0x0200)
{
EINT;
return;
}
else
{
if(k0<=NX)
{
h1=k0+135; //B相表达式
if(h1>=404)
h1=h1-404;
h2=k0+270; //C相表达式
if(h2>=404)
h2=h2-404;
EvaRegs.CMPR1=a[k0];
EvaRegs.CMPR2=a[h1]; //更新比较寄存器2的值
EvaRegs.CMPR3=a[h2]; //更新比较寄存器3的值
k0=k0+1;
}
else
{
k0=0;
}
}
EvaRegs.EVAIMRA.bit.T1UFINT=1; //清除中断屏蔽标志
EvaRegs.EVAIFRA.bit.T1UFINT=1; //清楚中断使能标志
// PieCtrlRegs.PIEACK.all=0x0002; //响应同组中断
PieCtrl.PIEACK.all=0x0002;
EINT; //开全局中断
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -