Part Number: TMS320F28335
Other Parts Discussed in Thread: C2000WARE
Tool/software: Code Composer Studio
Use C# to read the value of the temperature sensor, set it in .txt, read .txt through TMS320F28335, and change the frequency of epwm.
I want to change instantly.Temperature changes, then frequency changes.
This is my code.
#include "DSP28x_Project.h"
#include <stdio.h>
void InitEPwm1(void);
void Gpio_Setup(void);
interrupt void A(void);
int F;
FILE *fp_G;
char t[1];
int main()
{
InitSysCtrl();
InitEPwm1Gpio();
Gpio_Setup();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM1_INT = &A;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;
EDIS;
InitEPwm1();
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
IER |= M_INT3;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
EINT;
ERTM;
for(;;){
__asm(" NOP");
}
}
void Gpio_Setup(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=1; //GPIO配置為ePWM1A功能
GpioCtrlRegs.GPAMUX1.bit.GPIO1=1; //GPIO1配置為ePWM1B功能
GpioCtrlRegs.GPAMUX1.bit.GPIO12=1; //TZ1 - Trip zone 1
GpioCtrlRegs.GPAMUX2.bit.GPIO16=3; //TZ5 - Trip zone 5
EDIS;
}
void InitEPwm1(void)
{
// Setup TBCLK
EPwm1Regs.TBPRD =F; // TBPRD=150M/f-1
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0 (相位為0)
EPwm1Regs.TBCTR = 0; //时基计数器清0
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; //时基时钟分频 1倍分频
// Setup shadowing
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; //CMPA影子装载模式
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //CTR=0 影子寄存器A装载update it
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
// Set actions
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // CTR上升至CMPA值 置1 ePWMA输出高
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // CTR下降至CMPA值 置0 ePWMA输出低
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; // CTR上升至CMPB值 置1 ePWMB输出高
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // CTR下降至CMPB值 置0 ePWMB输出低
// Interrupt where we will change the Compare Values
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD; // Select INT on PRD event
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 1ST event
//Set dead band
EPwm1Regs.DBCTL.bit.IN_MODE = 0; //ePWMxA是雙邊沿延時輸入源
EPwm1Regs.DBCTL.bit.OUT_MODE = 3; //使能雙邊沿沿時
EPwm1Regs.DBCTL.bit.POLSEL = 2; //ePWMxA不翻轉,ePWMxB翻轉
EPwm1Regs.DBFED =625; //100ns*150M
EPwm1Regs.DBRED =625;
//Set Trip-Zone
EALLOW;
EPwm1Regs.TZSEL.bit.OSHT1 = 1; //启用TZ1作为PWM1的错误源
EPwm1Regs.TZSEL.bit.OSHT5 = 1;
EPwm1Regs.TZCTL.bit.TZA = 2; //EPWM1A will be forced low on a trip event.
EPwm1Regs.TZCTL.bit.TZB = 2;
EPwm1Regs.TZEINT.bit.OST = 1; // Enable OST interrupt
EDIS;
EPwm1Regs.CMPA.half.CMPA=0;
}
interrupt void A(void)
{
fp_G=fopen("D:\\XIANG\\fp\\fp.txt","r");
fread(t,2,1,fp_G);
if(t[1]==28)
{F=2000;
EPwm1Regs.CMPA.half.CMPA=F/2;
EPwm1Regs.CMPB=F/2;
EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP3;
}
else
{ F=2500;
EPwm1Regs.CMPA.half.CMPA=F/2;
EPwm1Regs.CMPB=F/2;
EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP3;
}
}