TI中文支持网
TI专业的中文技术问题搜集分享网站

28335 PWM触发AD采样,转换时间太长了,是怎么回事?

用的28335,,CCS5.5。

用PWM触发ADC采样,ADC用的查询方式,没有开AD中断。在PWM计数到达峰值的时候启动ADC,PWM中断是在计数到0的时候产生的,采用增减计数。

这种方式用示波器观察从进PWM中断,到while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {}这句话运行完,用了44us,整个中断才50us。ADC的时钟频率是12.5MHz。

如果不用PWM触发ADC,而采用进中断后人为启动ADC:

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // Start SEQ1
while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

则上面四行程序用时才13us。

按理说人为启动ADC,要比PWM启动ADC,用的时间更长,毕竟PWM启动ADC后,要25us的时间后才进的PWM中断。

不知道哪边出现了问题,希望大家给分析下,非常感谢!

interrupt void Epwm1_isr(){
       while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {}
       AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
       AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
       ADC_Read();

       PieCtrlRegs.PIEACK.bit.ACK3= 1;
       EPwm1Regs.ETCLR.bit.INT = 1;

}

void ConfigADC()
{
// Specific ADC setup for this example:
AdcRegs.ADCTRL1.bit.ACQ_PS = 0xf; //设置采样窗的大小
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x1; //核心时钟分频,见手册
AdcRegs.ADCTRL1.bit.CPS = 0x0; //内核时钟定标,用于分频HSPCLK。
AdcRegs.ADCTRL1.bit.CONT_RUN = 0x0; //连续运行位。【0,启动停止模式】
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0x0; //排序器覆盖位。【0,禁止】
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联排序器选择位。【1,级联运行模式】

AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0x0; //SEQ1中断模式位。【0,每一个SEQ1序列结束时设置INT_SEQ1】
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1= 0x1; //SEQ1的ePWM SOCA使能位。【0,不允许ePWM SOCA启疭EQ1】【1,允许】
AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1 = 0x0; //SEQ1的外部SOC信号位。【0,禁止外部信号】
AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ = 0x0; //级联排序器ePWM SOCB使能位。【0,禁止】
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0x0; //采样模式位选择。【0,顺序采样模式】

AdcRegs.ADCMAXCONV.all = 8; //定义一次自动转换可使用的最大转换器数:x+1次

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; // ADCINA0 -> ACBUS.V AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 6; // ADCINA6 -> DCBUS.V AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 8; // ADCINB0 -> GRID.V AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 7; // ADCINA7 -> Capa.V1 AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 5; // ADCINA5 -> Capa.V2
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 2; // ADCINA2 -> OutputCurr.V1
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 1; // ADCINA1 -> OutputCurr.V2
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 3; // ADCINA3 -> InduCurr.V1 AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 4; // ADCINA4 -> InduCurr.V2

AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x0; //SEQ1中断使能位。【0,禁止向CPU提出中断请求】
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
}

void ConfigEPwm1()
{ //时间基准子模块寄存器初始化
EPwm1Regs.TBPRD = 3750; // PWM周期设置,单增单减T=(PWM1_PRD+1)*T_BCLK,增减模式T=2*PWM1_PRD*T_BCLK EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位寄存器
EPwm1Regs.TBCTR = 0; // 时间基准计数器值:清零
// 设置TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //计数模式:增减计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 相位寄存器加载:禁止
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 周期寄存器加载方式:同步加载 
//EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 同步输出选中选择归零 
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时间基准时钟预分频
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时间基准预分频:TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV) EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP; // 增减模式同步后计数方向:向上 //【TB_UP 向上】【TB_DOWN 向下】
EPwm1Regs.TBCTL.bit.FREE_SOFT = 0x3; // 仿真位模式,自由运行

//计数比较子模块寄存器初始化
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 寄存器映射方式:使能映射 //【CC_SHADOW 映射使能】【CC_IMMEDIAT 异步修改】
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // 寄存器映射方式:使能映射 //【CC_SHADOW 映射使能】【CC_IMMEDIAT 异步修改】
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD; // 映射装载方式:零装载\PRD装载 //【CC_CTR_ZERO计数器归零时装载】【CC_CTR_PRD计数器等于周谑弊霸亍俊綜C_CTR_ZERO_PRD 等于0或等于周期时装载】【CC_LD_DISABLE冻结】
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO_PRD; // 映射装载方式:零装载\PRD装载 
EPwm1Regs.CMPA.half.CMPA = 1875;
EPwm1Regs.CMPB = 1875;

//动作限定子模块寄存器初始化【AQ_NO_ACTION 无动作】【AQ_CLEAR 拉低】【AQ_SET 拉高】【AQ_TOGGLE 翻转】
//PWM1A动作限定控制
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //=CMPA 且 递增
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; //=CMPA 且 递减
EPwm1Regs.AQCTLA.bit.CBU = AQ_NO_ACTION; //=CMPB 且 递增
EPwm1Regs.AQCTLA.bit.CBD = AQ_NO_ACTION; //=CMPB 且 递减
EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; //=PRD
EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION; //=0

EPwm1Regs.AQCTLB.bit.CAU = AQ_NO_ACTION; //=CMPA 且 递增
EPwm1Regs.AQCTLB.bit.CAD = AQ_NO_ACTION; //=CMPA 且 递减
EPwm1Regs.AQCTLB.bit.CBU = AQ_NO_ACTION; //=CMPB 且 递增
EPwm1Regs.AQCTLB.bit.CBD = AQ_NO_ACTION; //=CMPB 且 递减
EPwm1Regs.AQCTLB.bit.PRD = AQ_NO_ACTION; //=PRD
EPwm1Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION; //=0

//死区发生器子模块寄存器初始化
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //死区控制输出模式:全使能。
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //极性选择控制:主低互补模式。
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; //死区输入模式控制
EPwm1Regs.DBRED = EPWM_DB; //上升沿延迟
EPwm1Regs.DBFED = EPWM_DB; //下降沿延迟

//错误控制子模块寄存器初始化
EPwm1Regs.TZSEL.all = TZ_DISABLE; //禁止所有错误源,即不使用此模块
//–其它设置查阅手册–//

//事件触发器子模块寄存器初始化
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // ePWM中断选项:事件TBCTR==0
EPwm1Regs.ETSEL.bit.INTEN = 1; // ePWM中断使能:使能【1使能,0禁止】
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 在第一个事件发生时产生中断

//设置epwm启动ADC
EPwm1Regs.ETSEL.bit.SOCAEN=1; //使能ePWMxSCOA脉冲
EPwm1Regs.ETSEL.bit.SOCASEL=ET_CTR_PRD; //若计数器等于PRD则启动ADC
EPwm1Regs.ETPS.bit.SOCAPRD=ET_1ST; //在第一个事件发生时生成ePWMxSOCA脉冲

//PWM斩波器子模块寄存器及高精度扩展寄存器初始化
EPwm1Regs.PCCTL.bit.CHPEN = CHP_DISABLE; //禁用此模块
//–其它设置查阅手册–//

}

mangui zhang:

ADC启动后转化多路是比较耗时的     

建议你选用并行转化试试     ADC应该会节约一般的时间

用的28335,,CCS5.5。

用PWM触发ADC采样,ADC用的查询方式,没有开AD中断。在PWM计数到达峰值的时候启动ADC,PWM中断是在计数到0的时候产生的,采用增减计数。

这种方式用示波器观察从进PWM中断,到while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {}这句话运行完,用了44us,整个中断才50us。ADC的时钟频率是12.5MHz。

如果不用PWM触发ADC,而采用进中断后人为启动ADC:

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // Start SEQ1
while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

则上面四行程序用时才13us。

按理说人为启动ADC,要比PWM启动ADC,用的时间更长,毕竟PWM启动ADC后,要25us的时间后才进的PWM中断。

不知道哪边出现了问题,希望大家给分析下,非常感谢!

interrupt void Epwm1_isr(){
       while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {}
       AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
       AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
       ADC_Read();

       PieCtrlRegs.PIEACK.bit.ACK3= 1;
       EPwm1Regs.ETCLR.bit.INT = 1;

}

void ConfigADC()
{
// Specific ADC setup for this example:
AdcRegs.ADCTRL1.bit.ACQ_PS = 0xf; //设置采样窗的大小
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x1; //核心时钟分频,见手册
AdcRegs.ADCTRL1.bit.CPS = 0x0; //内核时钟定标,用于分频HSPCLK。
AdcRegs.ADCTRL1.bit.CONT_RUN = 0x0; //连续运行位。【0,启动停止模式】
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0x0; //排序器覆盖位。【0,禁止】
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联排序器选择位。【1,级联运行模式】

AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0x0; //SEQ1中断模式位。【0,每一个SEQ1序列结束时设置INT_SEQ1】
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1= 0x1; //SEQ1的ePWM SOCA使能位。【0,不允许ePWM SOCA启疭EQ1】【1,允许】
AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1 = 0x0; //SEQ1的外部SOC信号位。【0,禁止外部信号】
AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ = 0x0; //级联排序器ePWM SOCB使能位。【0,禁止】
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0x0; //采样模式位选择。【0,顺序采样模式】

AdcRegs.ADCMAXCONV.all = 8; //定义一次自动转换可使用的最大转换器数:x+1次

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; // ADCINA0 -> ACBUS.V AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 6; // ADCINA6 -> DCBUS.V AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 8; // ADCINB0 -> GRID.V AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 7; // ADCINA7 -> Capa.V1 AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 5; // ADCINA5 -> Capa.V2
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 2; // ADCINA2 -> OutputCurr.V1
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 1; // ADCINA1 -> OutputCurr.V2
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 3; // ADCINA3 -> InduCurr.V1 AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 4; // ADCINA4 -> InduCurr.V2

AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x0; //SEQ1中断使能位。【0,禁止向CPU提出中断请求】
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
}

void ConfigEPwm1()
{ //时间基准子模块寄存器初始化
EPwm1Regs.TBPRD = 3750; // PWM周期设置,单增单减T=(PWM1_PRD+1)*T_BCLK,增减模式T=2*PWM1_PRD*T_BCLK EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位寄存器
EPwm1Regs.TBCTR = 0; // 时间基准计数器值:清零
// 设置TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //计数模式:增减计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 相位寄存器加载:禁止
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 周期寄存器加载方式:同步加载 
//EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 同步输出选中选择归零 
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时间基准时钟预分频
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时间基准预分频:TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV) EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP; // 增减模式同步后计数方向:向上 //【TB_UP 向上】【TB_DOWN 向下】
EPwm1Regs.TBCTL.bit.FREE_SOFT = 0x3; // 仿真位模式,自由运行

//计数比较子模块寄存器初始化
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 寄存器映射方式:使能映射 //【CC_SHADOW 映射使能】【CC_IMMEDIAT 异步修改】
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // 寄存器映射方式:使能映射 //【CC_SHADOW 映射使能】【CC_IMMEDIAT 异步修改】
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD; // 映射装载方式:零装载\PRD装载 //【CC_CTR_ZERO计数器归零时装载】【CC_CTR_PRD计数器等于周谑弊霸亍俊綜C_CTR_ZERO_PRD 等于0或等于周期时装载】【CC_LD_DISABLE冻结】
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO_PRD; // 映射装载方式:零装载\PRD装载 
EPwm1Regs.CMPA.half.CMPA = 1875;
EPwm1Regs.CMPB = 1875;

//动作限定子模块寄存器初始化【AQ_NO_ACTION 无动作】【AQ_CLEAR 拉低】【AQ_SET 拉高】【AQ_TOGGLE 翻转】
//PWM1A动作限定控制
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //=CMPA 且 递增
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; //=CMPA 且 递减
EPwm1Regs.AQCTLA.bit.CBU = AQ_NO_ACTION; //=CMPB 且 递增
EPwm1Regs.AQCTLA.bit.CBD = AQ_NO_ACTION; //=CMPB 且 递减
EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; //=PRD
EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION; //=0

EPwm1Regs.AQCTLB.bit.CAU = AQ_NO_ACTION; //=CMPA 且 递增
EPwm1Regs.AQCTLB.bit.CAD = AQ_NO_ACTION; //=CMPA 且 递减
EPwm1Regs.AQCTLB.bit.CBU = AQ_NO_ACTION; //=CMPB 且 递增
EPwm1Regs.AQCTLB.bit.CBD = AQ_NO_ACTION; //=CMPB 且 递减
EPwm1Regs.AQCTLB.bit.PRD = AQ_NO_ACTION; //=PRD
EPwm1Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION; //=0

//死区发生器子模块寄存器初始化
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //死区控制输出模式:全使能。
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //极性选择控制:主低互补模式。
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; //死区输入模式控制
EPwm1Regs.DBRED = EPWM_DB; //上升沿延迟
EPwm1Regs.DBFED = EPWM_DB; //下降沿延迟

//错误控制子模块寄存器初始化
EPwm1Regs.TZSEL.all = TZ_DISABLE; //禁止所有错误源,即不使用此模块
//–其它设置查阅手册–//

//事件触发器子模块寄存器初始化
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // ePWM中断选项:事件TBCTR==0
EPwm1Regs.ETSEL.bit.INTEN = 1; // ePWM中断使能:使能【1使能,0禁止】
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 在第一个事件发生时产生中断

//设置epwm启动ADC
EPwm1Regs.ETSEL.bit.SOCAEN=1; //使能ePWMxSCOA脉冲
EPwm1Regs.ETSEL.bit.SOCASEL=ET_CTR_PRD; //若计数器等于PRD则启动ADC
EPwm1Regs.ETPS.bit.SOCAPRD=ET_1ST; //在第一个事件发生时生成ePWMxSOCA脉冲

//PWM斩波器子模块寄存器及高精度扩展寄存器初始化
EPwm1Regs.PCCTL.bit.CHPEN = CHP_DISABLE; //禁用此模块
//–其它设置查阅手册–//

}

Xianghui Kong1:

PWM触发ADC启动时间是很快的,不知道你怎么用示波器测试时间的,可以用CCS自带的测试时间功能测一下那句语句运行所需的时间,确认一下,排除一下是否有其他中断程序打扰;

用的28335,,CCS5.5。

用PWM触发ADC采样,ADC用的查询方式,没有开AD中断。在PWM计数到达峰值的时候启动ADC,PWM中断是在计数到0的时候产生的,采用增减计数。

这种方式用示波器观察从进PWM中断,到while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {}这句话运行完,用了44us,整个中断才50us。ADC的时钟频率是12.5MHz。

如果不用PWM触发ADC,而采用进中断后人为启动ADC:

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // Start SEQ1
while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} 
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

则上面四行程序用时才13us。

按理说人为启动ADC,要比PWM启动ADC,用的时间更长,毕竟PWM启动ADC后,要25us的时间后才进的PWM中断。

不知道哪边出现了问题,希望大家给分析下,非常感谢!

interrupt void Epwm1_isr(){
       while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {}
       AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
       AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
       ADC_Read();

       PieCtrlRegs.PIEACK.bit.ACK3= 1;
       EPwm1Regs.ETCLR.bit.INT = 1;

}

void ConfigADC()
{
// Specific ADC setup for this example:
AdcRegs.ADCTRL1.bit.ACQ_PS = 0xf; //设置采样窗的大小
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x1; //核心时钟分频,见手册
AdcRegs.ADCTRL1.bit.CPS = 0x0; //内核时钟定标,用于分频HSPCLK。
AdcRegs.ADCTRL1.bit.CONT_RUN = 0x0; //连续运行位。【0,启动停止模式】
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0x0; //排序器覆盖位。【0,禁止】
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联排序器选择位。【1,级联运行模式】

AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1 = 0x0; //SEQ1中断模式位。【0,每一个SEQ1序列结束时设置INT_SEQ1】
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1= 0x1; //SEQ1的ePWM SOCA使能位。【0,不允许ePWM SOCA启疭EQ1】【1,允许】
AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1 = 0x0; //SEQ1的外部SOC信号位。【0,禁止外部信号】
AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ = 0x0; //级联排序器ePWM SOCB使能位。【0,禁止】
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0x0; //采样模式位选择。【0,顺序采样模式】

AdcRegs.ADCMAXCONV.all = 8; //定义一次自动转换可使用的最大转换器数:x+1次

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; // ADCINA0 -> ACBUS.V AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 6; // ADCINA6 -> DCBUS.V AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 8; // ADCINB0 -> GRID.V AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 7; // ADCINA7 -> Capa.V1 AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 5; // ADCINA5 -> Capa.V2
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 2; // ADCINA2 -> OutputCurr.V1
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 1; // ADCINA1 -> OutputCurr.V2
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 3; // ADCINA3 -> InduCurr.V1 AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 4; // ADCINA4 -> InduCurr.V2

AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x0; //SEQ1中断使能位。【0,禁止向CPU提出中断请求】
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
}

void ConfigEPwm1()
{ //时间基准子模块寄存器初始化
EPwm1Regs.TBPRD = 3750; // PWM周期设置,单增单减T=(PWM1_PRD+1)*T_BCLK,增减模式T=2*PWM1_PRD*T_BCLK EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位寄存器
EPwm1Regs.TBCTR = 0; // 时间基准计数器值:清零
// 设置TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //计数模式:增减计数
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 相位寄存器加载:禁止
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 周期寄存器加载方式:同步加载 
//EPwm1Regs.TBCTL.bit.SWFSYNC = 1;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 同步输出选中选择归零 
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时间基准时钟预分频
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时间基准预分频:TBCLK=SYSCLKOUT/(HSPCLKDIV*CLKDIV) EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP; // 增减模式同步后计数方向:向上 //【TB_UP 向上】【TB_DOWN 向下】
EPwm1Regs.TBCTL.bit.FREE_SOFT = 0x3; // 仿真位模式,自由运行

//计数比较子模块寄存器初始化
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 寄存器映射方式:使能映射 //【CC_SHADOW 映射使能】【CC_IMMEDIAT 异步修改】
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // 寄存器映射方式:使能映射 //【CC_SHADOW 映射使能】【CC_IMMEDIAT 异步修改】
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD; // 映射装载方式:零装载\PRD装载 //【CC_CTR_ZERO计数器归零时装载】【CC_CTR_PRD计数器等于周谑弊霸亍俊綜C_CTR_ZERO_PRD 等于0或等于周期时装载】【CC_LD_DISABLE冻结】
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO_PRD; // 映射装载方式:零装载\PRD装载 
EPwm1Regs.CMPA.half.CMPA = 1875;
EPwm1Regs.CMPB = 1875;

//动作限定子模块寄存器初始化【AQ_NO_ACTION 无动作】【AQ_CLEAR 拉低】【AQ_SET 拉高】【AQ_TOGGLE 翻转】
//PWM1A动作限定控制
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //=CMPA 且 递增
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; //=CMPA 且 递减
EPwm1Regs.AQCTLA.bit.CBU = AQ_NO_ACTION; //=CMPB 且 递增
EPwm1Regs.AQCTLA.bit.CBD = AQ_NO_ACTION; //=CMPB 且 递减
EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION; //=PRD
EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION; //=0

EPwm1Regs.AQCTLB.bit.CAU = AQ_NO_ACTION; //=CMPA 且 递增
EPwm1Regs.AQCTLB.bit.CAD = AQ_NO_ACTION; //=CMPA 且 递减
EPwm1Regs.AQCTLB.bit.CBU = AQ_NO_ACTION; //=CMPB 且 递增
EPwm1Regs.AQCTLB.bit.CBD = AQ_NO_ACTION; //=CMPB 且 递减
EPwm1Regs.AQCTLB.bit.PRD = AQ_NO_ACTION; //=PRD
EPwm1Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION; //=0

//死区发生器子模块寄存器初始化
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //死区控制输出模式:全使能。
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //极性选择控制:主低互补模式。
EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; //死区输入模式控制
EPwm1Regs.DBRED = EPWM_DB; //上升沿延迟
EPwm1Regs.DBFED = EPWM_DB; //下降沿延迟

//错误控制子模块寄存器初始化
EPwm1Regs.TZSEL.all = TZ_DISABLE; //禁止所有错误源,即不使用此模块
//–其它设置查阅手册–//

//事件触发器子模块寄存器初始化
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // ePWM中断选项:事件TBCTR==0
EPwm1Regs.ETSEL.bit.INTEN = 1; // ePWM中断使能:使能【1使能,0禁止】
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 在第一个事件发生时产生中断

//设置epwm启动ADC
EPwm1Regs.ETSEL.bit.SOCAEN=1; //使能ePWMxSCOA脉冲
EPwm1Regs.ETSEL.bit.SOCASEL=ET_CTR_PRD; //若计数器等于PRD则启动ADC
EPwm1Regs.ETPS.bit.SOCAPRD=ET_1ST; //在第一个事件发生时生成ePWMxSOCA脉冲

//PWM斩波器子模块寄存器及高精度扩展寄存器初始化
EPwm1Regs.PCCTL.bit.CHPEN = CHP_DISABLE; //禁用此模块
//–其它设置查阅手册–//

}

Qingqing Lin:

回复 Xianghui Kong1:

只用到一个PWM中断。观察是在进中断时将某一IO置高电平,AD转换完后置低电平,然后看IO高电平的时间。AD转换时间过长的问题,我后面编程的时候偶尔也会遇到,原因也不明。

赞(0)
未经允许不得转载:TI中文支持网 » 28335 PWM触发AD采样,转换时间太长了,是怎么回事?
分享到: 更多 (0)