工具/软件:Code Composer Studio
大家好。
在启动/停止模式下、我对 F283335的 ADC 工作有一些疑问。
我需要 ADC 模块的工作方式如下:
1.双序列发生器模式;
2.顺序采样模式;
SEQ1触发器为 SOCA、SEQ2触发器为 ePWM1形式的 SOCB;
4、ePWM1计数器模式为递增/递减计数模式;
5、当 TBCTR = 0时产生 ePWM1SOCA; 当 TBCTR = TBPRD 时产生 ePWM1SOCB;
SOCA 触发 AD 转换 I1、I2、I3和 SOCB 触发 AD 转换 V1、V2、V3、如文档"TMS320x2833x 模数转换器(ADC)模块"第21页和第22页 所述;
如下图所示:
我 的程序结果是"I1、I2、I3 "可以很好地转换、但"V1、V2、V3"始终为零;
我的代码如下所示:
有人可以帮助我、让我知道我如何处理它。
===================================================================================================
#include "DSP2833x_Device.h" // DSP2833x 头文件包含文件
#include "DSP2833x_examples.h" // DSP2833x 示例包含文件
//此文件中找到的函数的原型语句。
中断空 ADC_ISR (空);
uint16 VoltageA[3];
uint16 VoltageB[3];
uint16 upDownFlag = 0;
uint16 PWMDuty = 0;
void main (void)
{
InitSysCtrl();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.ADCINT =&ADC_ISR;//ADC 中断
PieVectTable.EPWM1_INT =&EPWM1_INT_ISR;//ePWM1零中断
EDIS;
AdcRegs.ADCTRL1.All = 0;
AdcRegs.ADCTRL2.all = 0;
AdcRegs.ADCTRL3.ALL = 0;
//config adc
AdcRegs.ADCTRL1.bit.ACQ_PS = 2;
AdcRegs.ADCTRL3.bit.ADCCLKPS=2;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0;
AdcRegs.ADCTRL1.bit.CONT_RUN = 0;
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0;
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;
AdcRegs.ADCMAXCONV.ALL = 0x22;
//config SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x00;
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x01;
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x02;
//config SEQ2
AdcRegs.ADCTRL2.bit.SOC_SEQ2 = 1;
AdcRegs.ADCTRL2.bit.ePWM_SOCB_SEQ2 = 1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2 = 1;
AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x08;
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x09;
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0x0A;
InitAdc();
InitEPwm1Gpio();
/*ePWM config*/
EPwm1Regs.TBPRD = 6000;
EPwm1Regs.CMPA.half.CMPA = 1500;
EPwm1Regs.TBPHS.ALL = 0;
EPwm1Regs.TBCTR = 0;
EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm1Regs.TBCTL.bit.PRDLD = TB_Immediate;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm1Regs.DBRED = 100;
EPwm1Regs.DBFED = 100;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;
EPwm1Regs.ETSEL.bit.SOCAEN = 0x1;
EPwm1Regs.ETSEL.bit.SOCBEN = 0x1;
EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTR_ZERO;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm1Regs.ETSEL.bit.INTEN = 0x1;
EPwm1Regs.ETPS.bit.SOCACNT = 0x1;
EPwm1Regs.ETPS.bit.SOCAPRD = 0x1;
EPwm1Regs.ETPS.bit.SOCBCNT = 0x1;
EPwm1Regs.ETPS.bit.SOCBPRD = 0x1;
EPwm1Regs.ETPS.bit.INTCNT = 0x1;
EPwm1Regs.ETPS.bit.INTPRD = 0x1;
EPwm1Regs.ETCLR.bit.INT = 0x1;
EPwm1Regs.ETCLR.bit.SOCA = 0x1;
EPwm1Regs.ETCLR.bit.SOCB = 0x1;
//启用中断
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//向量启用
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;//启用 ADC
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//启用 ePWM1零中断
IER |= M_INT1;
IER |= M_INT3;
EINT;
ERTM;
while (1)
{
DELAY_US (10000);
}
}
中断空 ADC_ISR (空)
{
//在此处插入 ISR 代码
VoltageA[0]= AdcRegs.ADCRESULT0 >>4;
VoltageA[1]= AdcRegs.ADCRESULT1 >>4;
VoltageA[2]= AdcRegs.ADCRESULT2 >>4;
VoltageB[0]= AdcRegs.ADCRESULT3 >>4;
VoltageB[1]= AdcRegs.ADCRESULT4 >>4;
VoltageB[2]= AdcRegs.ADCRESULT5 >>4;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1; //重置 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位
AdcRegs.ADCST.bit.INT_SEQ2_CLR = 1; //清除 INT SEQ1位
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; //确认 PIE 中断
}
