请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28335 Thread 中讨论的其他器件:controlSUITE、 C2000WARE
工具/软件:Code Composer Studio
您好!
我一直在尝试对 eZdsp F28335进行编程、以便根据模拟电压输入提供可变脉宽、但它不起作用。
我同时使用 epwm1a 和 ADC 中断。 我正在使用 ePWM 来触发 ADC 中的转换启动。 我正在使用 ADC ISR 提取 ePWM ISR 设置为 CMPA 的数字值。
但这并没有给我带来预期的结果。 我只停留在100%占空比上、这是我正在使用的向上/向下计数的 CMPA = 0时的初始条件。 似乎几乎没有调用 ADC ISR。
任何想法/提示都将不胜感激。 谨随函附上这一守则。。 我使用 ccsv3.3...
提前感谢。
David。
#include "DSP2833x_Device.h"
extern void InitSysCtrl (void);
extern void InitPieCtrl (void);
extern void InitPieVectTable (void);
extern void InitCpuTimers (void);
extern void InitAdc (void);
extern void ConfigCpuTimer (struct CPUTIME_VARS *、float、float);
void Setup_GPIO (void);
void Setup_ePWM1A (void);
void Setup_ADC (void);
中断 void CpuTimer0_ISR (void);
中断 void ADC_ISR (void);
中断 void ePWM_ISR (void);
unsigned int Voltage_VR1;
void main()
{
InitSysCtrl();
EALLOW;
SysCtrlRegs.WDCR = 0x00AF;
EDIS;
DINT;
Setup_GPIO();
InitPieCtrl();
InitPieVectTable();
InitAdc();
Setup_adc();
SETUP_ePWM1A ();
EALLOW;
PieVectTable.TINT0 =&CpuTimer0_ISR;
PieVectTable.ADCINT =&ADC_ISR;
PieVectTable.EPWM1_INT =&ePWM_ISR;
EDIS;
InitCpuTimer();
ConfigCpuTimer (&CpuTimer0、150、100000);//100ms
PieCtrlRegs.PIEIER1.bit.INTx7=1;
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;PieCtrlRegs.PIEIER1.bit
=
0x000| INTR=0x1;PIEIERIER1.INT1= 0x1;PIEIINT.EINT1= 0x1
ERTM;
CpuTimer0Regs.TCR.bit.TSS = 0;
while (1)
{
while (CpuTimer0.InterruptCount = 0)
{
EALLOW;
SysCtrlRegs.WDKEY = 0x55;//服务 WD #1
EDIS;
}
CpuTimer0.InterruptCount = 0;
}
void SETUP_GPIO (void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.ALL = 0x0001;
//GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;GpioCtrlRegs.GPAMUX2.all
= 0x0;/GpioCtrlVR1.GPAMUX1
= 0;GPAMUX1 = All;GPAMU0 = 0 =所有;GPO = 0
GpioCtrlRegs.GPBMUX2.ALL = 0;
GpioCtrlRegs.GPCMUX1.ALL = 0;
GpioCtrlRegs.GPCMUX2.ALL = 0;
GpioCtrlRegs.GPADIR.ALL = 0;
GpioCtrlRegs.GPCMDIR.BIT.GPIO0 = 1;
GpioCtrlRegs.GPBDIR.ALL = 0;
GpioCtrlRegs.GPCDIR.ALL = 0;
EDIS;
}
void Setup_ePWM1A (void)
{
EPwm1Regs.TBCTL.bit.CLKDIV = 0;//150MHz/1
EPwmRegs.TBCLL
= 0;*
当 EPwCTL = 0时、TBDP.TBR1 = 0;EPwCTL = 0 = 0;EPwmCTL = 0。TBR1。 //请勿停止运行仿真
EPwm1Regs.TBPRD = 1875;//tbprds = 150MHz/2 (2x20kHz) ie 20kHz
EPwm1Regs.CMPA.half.CMPA = 0;//初始占空比
EPwm1Regs.AQCTLA.all = 0x0060;// Ep1.SOCTR=1
= 0;// Ep1.tmCtmCTR.EN.Ep1.Ctn = 1 = 1;EN.Ep1.tmCtmCTR1.CTR1.Ctn = 0;EN.EN.Ep1.TmCtmRtmRt.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.EN.//为 ePWM1
EPwm1Regs.ETSEL.bit.INTSEL 启用中断= 4;// CTR 上的中断= 0
EPwm1Regs.ETPS.ALL = 0x0101;// SOC 和第一个事件上的中断
}中断空 CpuTimer0_ISR (void)
{CpuTimer0.InterRegs.EDRV+
;// Evoid
= 0x0001.EADCR0.1+;= 0xEADCR.EADCR.E= 0xEADCR.ALY.RECOL = 0xADCR.REP.0_0_ADCR.REP.ADCR.REP.0+;
= 0xADCR.REP.ADCR.REP.ADCR.ALK = 0xADCR.ALK = 0xADCR.ALK = 0xADCR.AL
//清除所有位 int ADC 控制1寄存器
AdcRegs.ADCTRL1.bit.CPS = 0;//ADCCLK = FCLK/(0+1)= FCLK
AdcRegs.ADCTRL1.bit.ACQ_PS = 7;//采样窗口/采集窗口为8*ADCCLK AdcRegs.ADCTRL1.bit.ACQ_R1.RCOL
= 7;/ADCSCACTL1.R1.RQ_RCOL = 8
;ADCSCENDL.R1.RL.RCOP.RCOM.CONT.R1.R1.RC.RCORP=ADCADCADCADCADCADCADR1.R1.R //单次运行模式,即在每个序列结束时等待另一个触发
器//AdcRegs.ADCTRL2.all = 0;//清除 ADC 控制2寄存器
中的所有位 AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 0;//启用序列
发生器1中的 ADC 转换启动(通过 ePWM AdcRegs.ADCL.bit.ENA.1);/ADCTRL2.1_ADCTR1.INT_ENA.Q1 =
0 //在序列发生器1中序列结束(EOS)时启用中断
// initAdc 已在 ADCTRL3
AdcRegs.ADCTRL3.bit.ADCCLKPS= 3中完成所有其它所需的加电初始化;//fclk = HSPCLK/(2*3)= 12.5MHz AdcRegs.ADCMAX1.bit.ADCCLCR1.ADCC0
= ADCC0.ADCCRCLK = ADCL.ADCCRCLK = ADCL.ADCL.ADCL.ADCCRCLK = ADCVR1.ADC0 = ADCL.ADCADCL.ADCADCUL.ADCL.ADCRM1.ADC0 = ADC0 = ADCTR1.ADC0 = ADCTR1.ADCTR1.ADC0 void 0 = AD
//复位 SEQ1以从 CONV00重新启动,按下一顺序
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除 ADC 中断标志
PieCtrlRegs.PIEACK.all = 0x0001;
}
中断 void ePWM_ISR (void)
{
//静态 Regint 值= 0;
EALLOW;SysCtrlCRA.WPA
= 0x95;}中断 void ePWM_ISR (void = 0x75)#vr1dk.CMR1.mR1.mR1.75; //将输出转换为所需的计数器范围
EPwm1Regs.ETCLR.bit.INT = 1;//清除 ePWM1中断标志
//确认此中断以从组3
PieCtrlRegs.PIEACK.all = 4;
}接收更多中断