📄 dsp-spwm.c
字号:
}
CTRLCDCMDR=LCDCMDVERADDRESS+16; // 起始列=16,操作页=5,屏幕右侧显示"吴莹"的下半字
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<32;i++ )
{
CTRLCDRCR=ledwords4[1][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
CTRLCDCMDR=LCDCMDPAGE+7; // 设置操作页=7,显示当日时间,如"2008/03/28"
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( k=24,n1=8002;k<64;k=k+8 ) // n1为年份,共4位,需到写
{
CTRLCDCMDR=LCDCMDVERADDRESS+k; // 起始列=24
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<8;i++ )
{
if ( n1==0 ) // "年份"结束用"/"分隔
{
CTRLCDLCR=lednumber[10][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
else
{
CTRLCDLCR=lednumber[n1%10][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
}
n1=n1/10;
}
for ( k=0,n2=30;k<16;k=k+8 ) // n2为月份,共2位,也需到写
{
CTRLCDCMDR=LCDCMDVERADDRESS+k; // 起始列=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<8;i++ )
{
CTRLCDRCR=lednumber[n2%10][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
n2=n2/10;
}
CTRLCDCMDR=LCDCMDVERADDRESS+k; // 起始列=16,在"月份"结束后用"/"分隔
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for( i=0;i<8;i++ )
{
CTRLCDRCR=lednumber[10][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
k=k+8;
for ( n3=82;k<40;k=k+8 ) // n3为日期,共2位,也需到写
{
CTRLCDCMDR=LCDCMDVERADDRESS+k; // 起始列=24
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<8;i++ )
{
CTRLCDRCR=lednumber[n3%10][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
n3=n3/10;
}
}
/* ----- 测试状态显示程序 ----- */
void TestLCD()
{
unsigned char ledwords5[2][32]= // "参数",第一行为其上半字,第二行为其下半字
{
{0x20,0x20,0x20,0x28,0xA8,0x6C,0x3B,0x28,0xA8,0x6A,0xAC,0x28,0x20,0x30,0x20,0x00,
0x10,0x92,0x54,0x30,0xFF,0x50,0x94,0x32,0xD8,0x17,0x10,0x10,0xF0,0x18,0x10,0x00},
{0x04,0x84,0x82,0x81,0x4A,0x4A,0x49,0x25,0x24,0x12,0x10,0x09,0x02,0x06,0x02,0x00,
0x02,0x82,0x4E,0x33,0x22,0x52,0x8E,0x40,0x23,0x14,0x08,0x16,0x61,0xC0,0x40,0x00}
};
unsigned char ledwords6[2][32]= // "检测",第一行为其上半字,第二行为其下半字
{
{0x10,0x10,0xD0,0xFF,0x10,0x50,0x20,0x50,0x4C,0x43,0x4C,0x50,0x20,0x60,0x20,0x00,
0x10,0x22,0x6C,0x00,0x80,0xFC,0x04,0xF4,0x04,0xF4,0x04,0xF8,0x00,0xFE,0x00,0x00},
{0x04,0x03,0x00,0xFF,0x41,0x42,0x42,0x5C,0x40,0x5F,0x40,0x50,0x4E,0x64,0x40,0x00,
0x04,0x04,0xFE,0x01,0x40,0x27,0x10,0x0F,0x10,0x67,0x00,0x47,0x80,0x7F,0x00,0x00}
};
unsigned char symbol1[3][18]= // 6×6点阵字符,字母和符号
{
{0x7E,0x80,0x80,0x80,0x7E,0x00,0x40,0xA8,0xA8,0xA8,0xF0,0x00,0x28,0x28,0x28,0x28,0x28,0x00}, // "Ua="
{0x00,0x82,0xFE,0x82,0x00,0x00,0x40,0xA8,0xA8,0xA8,0xF0,0x00,0x28,0x28,0x28,0x28,0x28,0x00}, // "Ia="
{0x00,0x88,0xFA,0x80,0x00,0x00,0x40,0xA8,0xA8,0xA8,0xF0,0x00,0x28,0x28,0x28,0x28,0x28,0x00} // "ia=",表示无功电流
};
unsigned char symbol2[3][18]= // 6×6点阵字符,字母和符号
{
{0x7E,0x80,0x80,0x80,0x7E,0x00,0xFE,0x88,0x88,0x88,0x70,0x00,0x28,0x28,0x28,0x28,0x28,0x00}, // "Ub="
{0x00,0x82,0xFE,0x82,0x00,0x00,0xFE,0x88,0x88,0x88,0x70,0x00,0x28,0x28,0x28,0x28,0x28,0x00}, // "Ib="
{0x00,0x88,0xFA,0x80,0x00,0x00,0xFE,0x88,0x88,0x88,0x70,0x00,0x28,0x28,0x28,0x28,0x28,0x00} // "ib=",表示无功电流
};
unsigned char symbol3[3][18]= // 6×6点阵字符,字母和符号
{
{0x7E,0x80,0x80,0x80,0x7E,0x00,0x70,0x88,0x88,0x88,0x88,0x00,0x28,0x28,0x28,0x28,0x28,0x00}, // "Uc="
{0x00,0x82,0xFE,0x82,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x00,0x28,0x28,0x28,0x28,0x28,0x00}, // "Ic="
{0x00,0x88,0xFA,0x80,0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x00,0x28,0x28,0x28,0x28,0x28,0x00} // "ic=",表示无功电流
};
unsigned char symbol4[3][6]= // 6×6点阵字符,字母和符号
{
{0x3E,0x40,0x80,0x40,0x3E,0x00}, // "v"
{0xFC,0x22,0x22,0x22,0xFC,0x00}, // "A"
{0xFC,0x22,0x22,0x22,0xFC,0x00} // "A"
};
unsigned char symbol5[58]= // 8×8点阵字符,字母和符号,在右半屏第7页从第8列开始显示
{
0x08,0x08,0xFC,0x0A,0x0A,0x00, // "f"
0x28,0x28,0x28,0x28,0x28,0x00, // "="
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// " "
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// " "
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// " "
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// " "
0xFE,0x10,0x10,0x10,0xFE,0x00, // "H"
0x88,0xC8,0xA8,0x98,0x88,0x00 // "z"
};
int i,k;
CTRLCDCMDR=LCDCMDPAGE; // 设置操作页=0,左半屏显示"参数"的上半字
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDVERADDRESS+32; // 起始列=32
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<32;i++ )
{
CTRLCDLCR=ledwords5[0][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
CTRLCDCMDR=LCDCMDVERADDRESS; // 起始列=0,操作页=0,右半屏显示"检测"的上半字
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<32;i++ )
{
CTRLCDRCR=ledwords6[0][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
CTRLCDCMDR=LCDCMDPAGE+1; // 设置操作页=1,左半屏显示"参数"的下半字
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDVERADDRESS+32; // 起始列=32
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<32;i++ )
{
CTRLCDLCR=ledwords5[1][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
CTRLCDCMDR=LCDCMDVERADDRESS; // 起始列=0,操作页=1,右半屏显示"检测"的下半字
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<32;i++ )
{
CTRLCDRCR=ledwords6[1][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
for( k=2;k<5;k++ )
{
CTRLCDCMDR=LCDCMDVERADDRESS; // 起始列=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDPAGE+k; // 设置操作页=2~4,起始列=0,左右半屏分别显示"Ua=","Ia=","ia=";"Uc=","Ic=","ic="
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<18;i++ )
{
CTRLCDLCR=symbol1[k-2][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDRCR=symbol3[k-2][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
}
for( ;k<8;k++ )
{
CTRLCDCMDR=LCDCMDVERADDRESS; // 起始列=0
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDPAGE+k; // 设置操作页=5~7,起始列=0,左半屏显示"Ub=","Ib=","ib="
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<18;i++ )
{
CTRLCDLCR=symbol2[k-5][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
}
for( k=2;k<5;k++ )
{
CTRLCDCMDR=LCDCMDVERADDRESS+58; // 起始列=58
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDPAGE+k; // 设置操作页=2~4,起始列=58,左右半屏分别显示"V","A","A";"V","A","A"
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<6;i++ )
{
CTRLCDLCR=symbol4[k-2][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDRCR=symbol4[k-2][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
}
for( ;k<8;k++ )
{
CTRLCDCMDR=LCDCMDVERADDRESS+58; // 起始列=58
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
CTRLCDCMDR=LCDCMDPAGE+k; // 设置操作页=5~7,起始列=58,左半屏显示"V","A","A"
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<6;i++ )
{
CTRLCDLCR=symbol4[k-5][i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
}
CTRLCDCMDR=LCDCMDVERADDRESS+8; // 起始列=8,右半屏最底下页(第7页)显示"f= Hz"
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
for ( i=0;i<58;i++ )
{
CTRLCDRCR=symbol5[i];
Delay(LCDDELAY);
CTRLCDCR=0;
Delay(LCDDELAY);
}
}
/* ----- EVA模块的PWM初始化程序 ----- */
void init_eva_pwm() // 定时器T1作为产生PWM的时基,计数时钟75M
{
EALLOW;
PieVectTable.T1PINT = &t1pr_isr; // 把定时器1周期中断服务程序和向量表该中断对应起来
GpioMuxRegs.GPAMUX.all = 0x003F; // GPIOA口被配置为基本功能方式,也即引脚输出为PWM[1~6]
EDIS;
IER |= M_INT2; // CPU级可屏蔽中断INT2使能
PieCtrlRegs.PIEIER2.bit.INTx4 = 1; // 属于CPU级INT2中断中的T1PINT中断(INTx4)使能
EvaRegs.T1PR = 5814; // PWM载波周期为5814×2个定标的定时器时钟周期,PWM载波的初始频率为50×129Hz
// 5814=75M/(50*129)/2
EvaRegs.ACTRA.all = 0x0666; // 设置输出PWM1-高
// PWM2-低
// PWM3-高
// PWM4-低
// PWM5-高
// PWM6-低
EvaRegs.DBTCONA.all = 0x0FF0; // 配置死区控制器A:死区定时器1、2、3使能,即输出PWM[1~6]带有死区控制
// 死区值为15×16个HSPCLK时钟周期3.2us
EvaRegs.CMPR1 = 2907; // 初始占空比50%,T1PR/2
EvaRegs.CMPR2 = 2907; // 初始占空比50%,T1PR/2
EvaRegs.CMPR3 = 2907; // 初始占空比50%,T1PR/2
EvaRegs.COMCONA.all = 0x8200; // 使能比较操作
// 全比较输出使能
// 比较寄存器、比较行为控制寄存器重载条件:T1CNT=0
EvaRegs.T1CNT = 0x0000; // 定时器1的计数寄存器从0开始计数
EvaRegs.T1CON.all = 0x084C; // 配置定时器1的控制寄存器
// 选择连续增/减模式
// 使用内部时钟HSPCLK,分频系数为1,即定时器1计数时钟为HSPCLK=75M
// 使能定时器操作
// 定时器1比较寄存器重载条件:保留
// 禁止定时器的比较操作
EvaRegs.EVAIMRA.all = 0x0080; // 仅仅使能EVA模块的定时器1的周期中断T1PINT
EvaRegs.EVAIMRB.all = 0x0000;
EvaRegs.EVAIMRC.all = 0x0000;
}
/* ----- SPWM波占空比(比较寄存器CMPRx)计算子程序 ----- */
void cmpx_calculate(int i)
{
int k1,k2,k3;
k1 = 4*i+1; // A相电压、电流占空比索引值
k2 = 4*i+345; // B相电压、电流占空比索引值
k3 = 4*i+173; // C相电压、电流占空比索引值
// 全部采用Q15定标,调制度M=0.8
if( k1<=258 ) CMP1 = (long)(16384-((long)13107*sin_table[k1]>>15))*EvaRegs.T1PR>>15;
else CMP1 = (long)(16384+((long)13107*sin_table[k1-258]>>15))*EvaRegs.T1PR>>15;
if( k2>258 && k2<=516 ) CMP2 = (long)(16384+((long)13107*sin_table[k2-258]>>15))*EvaRegs.T1PR>>15;
else if( k2>516 && k2<=774 ) CMP2 = (long)(16384-((long)13107*sin_table[k2-516]>>15))*EvaRegs.T1PR>>15;
else CMP2 = (long)(16384+((long)13107*sin_table[k2-774]>>15))*EvaRegs.T1PR>>15;
if( k3<=258 ) CMP3 = (long)(16384-((long)13107*sin_table[k3]>>15))*EvaRegs.T1PR>>15;
else if( k3>258 && k3<=516 ) CMP3 = (long)(16384+((long)13107*sin_table[k3-258]>>15))*EvaRegs.T1PR>>15;
else CMP3 = (long)(16384-((long)13107*sin_table[k3-516]>>15))*EvaRegs.T1PR>>15;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -