📄 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"
#include "math.h"
#define FC 3000 //In Hz PWM Frequency
#define FR 50 //In Hz sinewave Frequency
//#define KeyAdd GpioDataRegs.GPADAT.bit.GPIOA0
#define KeyAdd GpioDataRegs.GPADAT.bit.GPIOA4
#define KeySub GpioDataRegs.GPADAT.bit.GPIOA1
#define KeyNeg GpioDataRegs.GPADAT.bit.GPIOA2
#define KeyPos GpioDataRegs.GPADAT.bit.GPIOA3
#define Add 0x01
#define Sub 0x02
#define Neg 0x04
#define Pos 0x08
unsigned char flag;
//unsigned int kb1;
unsigned int changePWM;
unsigned int F_PosNeg;
unsigned int kb;
void InitTimer1(void);
interrupt void ISRTIMER1(void);
unsigned char ScanKey(void);
unsigned int PWchange(void);
void KeyGpio(void);
void Delay1(int t);
void InitTimer1(void)
{
EvaRegs.EVAIFRA.bit.T1PINT = 1;
EvaRegs.EVAIMRA.bit.T1PINT = 1;
PieCtrl.PIEIER2.bit.INTx4 = 1;
EALLOW;
PieVectTable.T1PINT = &ISRTIMER1;
EDIS;
IER |= M_INT2;
}
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE控制寄存器*/
InitPieCtrl();
/*初始化PIE矢量表*/
InitPieVectTable();
/*初始化EV*/
InitEv();
InitTimer1();
/*开中断*/
IER |= M_INT14;
EINT;
ERTM;
///*************************/////
// The following two functions are used to set the width
// and frequency of PWM repectively.
// changePWM = EvaRegs.T1PR;
////////////////////////////
//50%占空比运行
InitGpio();
KeyGpio();
changePWM = 0x0005;
F_PosNeg = 1;
EvaRegs.T2CMPR = EvaRegs.T2PR;
EvaRegs.T1CMPR = 0x7FF;
while(1)
{
PWchange();
}
}
interrupt void ISRTIMER1(void)
{
EvaRegs.EVAIFRA.bit.T1PINT = 1;
PieCtrl.PIEACK.bit.ACK2 = 1;
}
void KeyGpio(void)
{
EALLOW;
//GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0 = 0;
GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4 = 0;
GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1 = 0;
GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2 = 0;
GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3 = 0;
//GpioMuxRegs.GPADIR.all=0xFFF0;
GpioMuxRegs.GPADIR.all=0xFFE1;
GpioMuxRegs.GPAQUAL.all = 0x0080;
EDIS;
}
void Delay1(int t)
{
int i,j;
for(i=0;i<t;i++)
{ for(j=0;j<2;j++); }
}
unsigned char ScanKey(void)
{
unsigned int keytmp;
unsigned char KeyData;
//GpioDataRegs.GPASET.all = 0x000F;
GpioDataRegs.GPASET.all = 0x001E;
//GpioDataRegs.GPACLEAR.all = 0xFFF0;
GpioDataRegs.GPACLEAR.all = 0xFFE1;
keytmp = GpioDataRegs.GPADAT.all;
//if(keytmp == 0x000F)
if(keytmp == 0x001E)
{
flag = 0;
while(flag == 0)
{
//keytmp = GpioDataRegs.GPADAT.all & 0x000F;
keytmp = GpioDataRegs.GPADAT.all & 0x001E;
flag = 1;
}
}
switch(keytmp)
{
//case 0x000E:
case 0x000E:
KeyData = Add;
break;
//case 0x000D:
case 0x001C:
KeyData = Sub;
break;
//case 0x000B:
case 0x001A:
KeyData = Neg;
F_PosNeg = 0;
break;
//case 0x0007:
case 0x0016:
KeyData = Pos;
F_PosNeg = 1;
break;
default:
KeyData = 0x00;
break;
}
return(KeyData);
}
unsigned int PWchange(void)
{
//加按键程序,调节T1CMPR
//kb = ScanKey();
do
{
kb = ScanKey();
}while(kb == 0x00);
if(kb== Pos)
{
//正转调速
EvaRegs.T2CMPR = EvaRegs.T2PR;
EvaRegs.T1CMPR = 0xF00;
}
else if(kb == Neg)
{
//反转调速
EvaRegs.T1CMPR = EvaRegs.T1PR;
EvaRegs.T2CMPR = 0x0F00;
}
else
{
switch(kb)
{
case Add:
Delay1(10000);
if(kb == Add )
{
do
{
Delay1(8000);
-- changePWM;
if(changePWM < 0x0001)
{changePWM = 0;}
else
{
if(F_PosNeg == 1)
{
EvaRegs.T1CMPR = changePWM;
EvaRegs.T2CMPR = EvaRegs.T2PR;
}
else
{
EvaRegs.T2CMPR = changePWM;
EvaRegs.T1CMPR = EvaRegs.T1PR;
}
}
} while(ScanKey() == Add);
}
break;
case Sub:
Delay1(10000);
if(kb == Sub)
{
do
{
Delay1(8000);
++changePWM;
if(changePWM > 0x0FFE )
{changePWM = 0x0FFF;}
else
{
if(F_PosNeg == 1)
{
EvaRegs.T1CMPR = changePWM;
EvaRegs.T2CMPR = EvaRegs.T2PR;
}
else
{
EvaRegs.T2CMPR = changePWM;
EvaRegs.T1CMPR = EvaRegs.T1PR;
}
}
} while(ScanKey() == Sub);
}
break;
default:
break;
}
}
return(changePWM);
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -