请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28377D 大家好、
在我的软件中、我想实现进入 ADC 模块的信号的顺序转换、这样:
当 EPWM6 CTR = 0时、我开始转换 ADC A2、ADC A3、ADC A4、ADC A5上的信号、并且当所有之前的转换完成时、最后一个转换将生成一个中断。
我已将以下代码用于 EPWM 配置:
EPwm6Regs.ETSEL.bit.SOCAEN = 1; EPwm6Regs.ETSEL.bit.SOCASEL = 1;//在 TBCTR =0 EPwm6Regs.ETPS.BIT.SOCAPRD = 1时生成 SOCA 脉冲;
对于 ADC 配置:
void ConfigureADC_A (void) { EALLOW; //写入配置 AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为输入时钟/4 AdcSetMode (ADC_ADCA、ADC_Resolution_12位、ADC_SIGNALMODE_SINGLE); //将脉冲位置设置为晚期 AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; //为 ADC AdcaRegs.ADCCTL1.bit.ADCPWDNZ 加电 ;//允许 加电延迟1000 ms ;}
并将每个通道配置为:
void SetupADC_A () { uint16 acqps; //根据分辨率(SYSCLK = 200MHz)确定最小采集窗口 (在 SYSCLKS 中) if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution){ acqps = 19;//(19+1)/200MHz = 100ns。 最小值为75ns } 否则{//分辨率为16位 acqps = 63;//320ns ((63+1)*(1/2200MHz) )} //选择要转换的通道和转换结束标志 EALLOW; AdcaRegs.ADCCO2CTL.bit.CHSEL = 2; AdcRegs.CS2CCS.ADCCPS.ADCTRL = ADCCPS.ADCCPS.ADCCPS.ADCTRL = 15位 ADCCPS.ADCCPS.ADCCPS.ADCCPS.ADCCPS.ADCCPS.ADCCPS.ADCTRL = ADCCPS.ADCCPS.ADCTRS.ADCCPS.ADCCPS.ADCCPS.ADC2000.CL=ADCTRS.ADCCPS.ADCTRS.ADCTRS.ADCTRS.ADCTRS.BOL. AdacRegs.ADCSOC3CTL.bit.ACQPS = acqps;//sample and hold Window AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 15;//0Fh ADCTRIG15 - ePWM6、ADCSOCA AdcaRegs.ADCCO4CTL.bit.CHIGSEL = 15;ADCSOC5ADC40CCRCL.ADCTRS.ADCADCTRS.ADCCPS.ADCTRL = 15 ;ADCSOC.ADCADCADCADCADCADCADCADCADC40CL.ADCTRS.ADCTRS.ADCTRS.ADCCPS.ADCCPS.ADCTRS.ADCCPS.ADCCPS.ADCTRS.ADCCPS.ADCTRS.ADCCPS.ADCCPS.ADCTRL = 15 = 15;ADCADCADCADCCPS.ADCADCADCADCADCADCADCADCADCTRS.ADCADCADCADCADCADCADCADCADCTRS.AD // 0Fh ADCTRIG15 - ePWM6、ADCSOCA AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 5;// EOC5为 ADCINT1 AdcaRegs.ADCINTSEL1N2.bit.1E = 1触发;//启用 ININT1标志 ADCINT1.FLT1.ADCINT1.FLAG = 1;确保 ADCINT1.ADCINT1.FLT1.ADCINT1
现在、在"main.c"中、我启用了中断 ADC A1:
//映射 ISR 函数 EALLOW; PieVectTable.ADCA1_INT =&adca1_ISR; EDIS; //启用全局中断和更高优先级的实时调试事件: IER |= M_INT1;//启用组1中断 EINT; //启用全局中断 INTM ERTM; //启用全局实时中断 DBGM /启用表2中断。 PIE 通道映射、页面 90) PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//启用 ADC_INT_A_1 //中断 ADC A1
中断如下所示:
中断 void adca1_ISR (void){ //******** //将 ADC 测量值转换为 double //******** AdcaResults2 = AdcaResultRegs.ADCRESULT2;// AdcaResults3 = AdcaResultRegs.ADCRESULT3;// AdcaResults4 = AdcaResults.ADCRESULT5;// AdcaResults.iResets= (*) +偏移 (*)(*)(_iResets+)(*)(*)+ 0.048)(_iResets= 0.048)(iResets+(*)(_iResets= 0.04+)(iResets+)(iResets_iResets= 0.04+)(iResets+)(*)(iResets_iResets= 0.04+)(iResets_iResets_iResetsx (*)(iResetsx (*)(iResets= 0.04+)(iResets= 0.04+)(iResets= 0.04+)(iResets= 0.04+)(iResets_iResets= 0.04+)(iReset //... PI 控制器代码执行+ PWM CMP 更新 //... //********* //清除 ADC 中断 //******** AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志 PieCtrlRegs.PIEACK.ALL = PIEACK_Group1; }
这是使 ADC 通道 A2、A3、A4、A5按顺序采样的正确步骤吗? 中断是否确实在所有 ADC 转换完成后"启动"?
我提出这一要求是因为我想确保在中断内部、ADC 采样的所有值都是正确的(并且转换完成)、以便正确执行控制...
您的意见将非常有帮助、
非常感谢您、
Leo