PWM触发AD采样,转换时间太长了

2019-03-24 10:13发布

本帖最后由 felly77 于 2015-5-17 16:38 编辑

用的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) {}  //用查询方式,等待ADC转换完成
       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; //禁用此模块
//--其它设置查阅手册--//
}
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
felly77
2019-03-25 03:33
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章