📄 v_nd_spwm.c
字号:
#include "DSP281x_Device.h" // DSP281x Headerfile Include File
#include "DSP281x_Examples.h" // DSP281x Examples Include File
#include "float.h"
#include "math.h"
#define PI 3.1415926
//发送数据包括:f_s=1~400(0x0001~0x0190需要两个字节)调制度N=0~99(放大100倍0x00~0x63需要1个字节)
//串口中断变量
volatile unsigned char ReceiveData[3]={0x00,0x00,0x00};//一次接收三个数据,以发送16进制发送,但是认为是10进制数.
//定时器变量
volatile unsigned int f_s=50,N,i;/*f_s:信号频率,N:调制比*/
volatile float M=0.5,sindata,Tz,M_new=0;
volatile float *pa,*Dataram;
volatile long int ftime=15000;//CPU频率为150M=150 00*10000
volatile unsigned int f_s_new=0;
//子程序声明
void scia_fifo_init(void);
void sci_check(void);
//中断声明
interrupt void T1P_PWMISR(void);
interrupt void sciaRxFifoIsr(void);
//********************定时器周期中断********************************
#pragma CODE_SECTION(T1P_PWMISR, "ramfuncs");
#pragma CODE_SECTION(sciaRxFifoIsr, "ramfuncs");
interrupt void T1P_PWMISR(void) // EV-A
{
// Insert ISR Code here
// To receive more interrupts from this PIE group, acknowledge this interrupt
// PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
// Next two lines for debug only to halt the processor here
// Remove after inserting ISR Code
if(EvaRegs.EVAIFRA.all&&0x0080)
{
if(i>=N)
i=0;
EvaRegs.CMPR1=(EvaRegs.T1PR>>1)*(1-M*(*(pa+i)));
}
i++;
EvaRegs.EVAIFRA.bit.T1PINT=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|= PIEACK_GROUP2; // Issue PIE ack
asm(" clrc INTM");
}
//*******************SCI-A receive interrupt****************
interrupt void sciaRxFifoIsr(void)
{
unsigned char k;
unsigned long j;
unsigned char ReceiveData_hold=0;
for(k=0;k<3;k++)
{
ReceiveData[k]=SciaRegs.SCIRXBUF.all; // Read data
for(j=0;j<2000;j++)
{asm(" NOP");}
}
f_s_new=(ReceiveData[0]&&0x0f)*100;
ReceiveData_hold=ReceiveData[1];
f_s_new=(ReceiveData_hold&&0x0f)*1+f_s_new;
ReceiveData_hold=((ReceiveData_hold&&0x0f0)>>4);
f_s_new+=((ReceiveData_hold&&0x0f)*10);
ReceiveData_hold=ReceiveData[2];
M_new=(ReceiveData_hold&&0x0f);
ReceiveData_hold=((ReceiveData_hold&&0x0f0)>>4);
M_new+=(ReceiveData_hold&&0x0f)*10;
M_new=M_new/100.0;
EINT;
EnableInterrupts();
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|= PIEACK_GROUP9; // Issue PIE ack
}
//*******************************************************************
void Init_spwm(void)
{
// f_s=1;
// M=0.9;
N=99;//对应于f_s=400,fc=39.6k
while((N*f_s)<=40000)
N+=3;
Tz=10000*1.0/(f_s*N);
}
//Gpio 初始化
void Init_Gpio(void)
{EALLOW;
GpioMuxRegs.GPAMUX.all=0x0003;//pwm0 1
GpioMuxRegs.GPADIR.all=0x0003;//OUT
GpioMuxRegs.GPDMUX.all=0x0000;//state
GpioMuxRegs.GPADIR.all=0x0000;
//scia
GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
EDIS;
}
//EVA 初始化
void Init_EVA(void)
{/*T1 time 比较输出*/
EvaRegs.GPTCONA.all=0xe065;
EvaRegs.ACTRA.all=0x0666;//比较方式控制
EvaRegs.T1PR=Tz*ftime/2;
EvaRegs.CMPR1=(EvaRegs.T1PR>>1)*(1-M*(*(pa+i)));
EvaRegs.DBTCONA.all=0x0f35;//死区1us
EvaRegs.T1CNT=0x0000;
EvaRegs.COMCONA.all=0x4b00;
EvaRegs.COMCONA.all=0xcb00;//使能比较
EvaRegs.T1CON.all=0xc80c;
EvaRegs.T1CON.all=0xc84c;
}
//sin值
void Init_sindata(void)
{ sindata=0;
Dataram=(float*)0x100000;
for(i=1;i<=N;i++)
{sindata=2*PI;
sindata=sindata*f_s;
sindata=sindata*i*Tz/10000;
sindata=sin(sindata);
*Dataram++=sindata;
}
}
//*****************************************scia init*****************
void scia_fifo_init(void)
{
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// parity:EVEN, 8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.bit.TXINTENA =1; //enable TX interrupt
SciaRegs.SCICTL2.bit.RXBKINTENA =1; //enable RX interrupt
SciaRegs.SCIHBAUD = 0x0001;//0x000f;//0x0007;//0x0000;//0x0001;//1200/2400/4800/9600/
SciaRegs.SCILBAUD = 0x00E7;//0x0041;//0x00a0;//0x0079;//0x00E7;
SciaRegs.SCICCR.bit.LOOPBKENA =0; // Disable loop back
SciaRegs.SCIFFTX.all=0xC027;//0xE040; 1100 0000 0010 0111
SciaRegs.SCIFFRX.all=0x2023;//0x204F;
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1; //Relinquish TXFIFO from Reset
SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //Relinquish RXFIFO from Reset
}
/*void sci_check(void)
{
unsigned char i;
unsigned long j;
for(i=0;i<3;i++)
{
ReceiveData[i]=SciaRegs.SCIRXBUF.all; // Read data
for(j=0;j<2000;j++)
{asm(" NOP");}
}
f_s_new=(ReceiveData[0]&&0x0f)*100;
f_s_new+=(((ReceiveData[1]&&0x0f0)>>4)*10+ReceiveData[1]&&0x0f);
M_new=((ReceiveData[2]&&0x0f0)>>4)*10+ReceiveData[2]&&0x0f;
M_new=M_new/100;
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
}
*/
void vvvf_change(void)
{ unsigned long j;
if((f_s!=f_s_new||M!=M_new)&&i==0)
{
f_s=f_s_new;
M=M_new;
Init_spwm();
Init_sindata();//重新计算查表值
for(j=0;j<2000;j++)
{ asm(" NOP");}
}
}
void main(void)
{ unsigned long j;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
InitSysCtrl();
for(j=0;j<2000;j++)
{ asm(" NOP");}
EALLOW;
SysCtrlRegs.HISPCP.all = 0x0000;
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
EDIS;
Init_Gpio();
Init_spwm();
Init_sindata();
i=0;
pa=(float*)0x100000;
scia_fifo_init(); // Init SCI-A
Init_EVA();
DINT;
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;//开INT2 CPU 中断
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.T1PINT = &T1P_PWMISR;
PieVectTable.RXAINT = &sciaRxFifoIsr; //scia receive
EDIS;
PieCtrlRegs.PIECRTL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER2.bit.INTx4 = 1;
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; //scia
EvaRegs.EVAIMRA.all=0x0080;//开T1周期中断
EvaRegs.EVAIFRA.all=0x0080;//清T1周期中断
// Enable all SCIA RXINT interrupt
IER|= M_INT2;//开INT2 CPU 中断
IER |= 0x0100; // enable PIEIER9, and INT9
EnableInterrupts();
pa=(float*)0x100000;
for(j=0;j<20000;j++)
{ asm(" NOP");}
while(1)
{
vvvf_change();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -