This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
你(们)好
我正在测试一个基于28384S 的新电路板、在启动两个 ADC 模块时遇到问题:
高使用 PWM1生成 SOCA 和 SOCB (可能只能使用一个)
//
EPwm1Regs.ETPS.bit.SOCPSSEL = 1;
// Generate ADCA SOC
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO;
EPwm1Regs.ETSOCPS.bit.SOCAPRD2 = 2;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
//生成 ADCC SOC
EPwm1Regs.ETSEL.bit.SOCBSEL = ET_CTR_ZERO;
EPwm1Regs.ETSOCPS.bit.SOCBPRD2 = 2;
EPwm1Regs.ETSEL.bit.SOCBEN = 1;
我使用两个相似的过程来设置 ADCA 和 ADCC、唯一的区别是所访问的 ADC
void set_adca (void)
{
EALLOW;
AdcaRegs.ADCCTL2.bit.prescale = 14;
AdcSetMode (ADC_ADCA、ADC_Resolution_12bit、ADC_SIGNALMODE_SINGLE);
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
EDIS;
DELAY_US (1000);
EALLOW;
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0x10;
// ADCINA2 = AZ A 相电流
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
// ADCINA3 = AZ B 相电流
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14;
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 3;
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
// ADCINA4 = EL A 相电流
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 14;
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 4;
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5;
// ADCINA5 = EL B 相电流
AdcaRegs.ADCSOC3CTL.bit.ACQPS = 14;
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 5;
AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 5;
// EOC 触发中断
AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 3;
AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
EDIS;
}
过程中复杂得多
/*==============================================
函数名称:
目的:
说明:
域:
准确度:
注释:
============================================================ */
__interrupt void adca_isr (void)
{
Volatile uint16_t TempPIEIER = PieCtrlRegs.PIEIER10.all;
//设置中断优先级:
IER |= M_INT10;
IER &= MINT10;/*设置"全局"优先级*/
PieCtrlRegs.PIEIER10.all &= MG10_2;/*设置"group"优先级*/
PieCtrlRegs.PIEACK.all = 0xFFFF;/*启用 PIE 中断*/
__ asm (" NOP");
EINT;
//读取转换
ADCA_READING [0]= AdcaResultRegs.ADCRESULT0 - 2048;
ADCA_READing[1]= AdcaResultRegs.ADCRESULT1 - 2048;
ADCA_READing[2]= AdcaResultRegs.ADCRESULT2 - 2048;
ADCA_READing[3]= AdcaResultRegs.ADCRESULT3 - 2048;
//清除 ADCINT 标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
//恢复寄存器已保存:
颜色;
PieCtrlRegs.PIEIER10.all = TempPIEIER;
}
/*==============================================
函数名称:
目的:
说明:
域:
准确度:
注释:
============================================================ */
_interrupt void ADCC_ISR (void)
{
Volatile uint16_t TempPIEIER = PieCtrlRegs.PIEIER10.all;
//设置中断优先级:
IER |= M_INT10;
IER &= MINT10;/*设置"全局"优先级*/
PieCtrlRegs.PIEIER10.all &= MG10_10;/*设置"组"优先级*/
PieCtrlRegs.PIEACK.all = 0xFFFF;/*启用 PIE 中断*/
__ asm (" NOP");
EINT;
//读取转换
ADCC_READING [0]= AdccResultRegs.ADCRESULT0;
ADCC_READing[1]= AdccResultRegs.ADCRESULT1;
ADCC_READing[2]= AdccResultRegs.ADCRESULT2;
ADCC_READing[3]= AdccResultRegs.ADCRESULT3;
//清除 ADCINT 标志
AdccRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
//恢复寄存器已保存:
颜色;
PieCtrlRegs.PIEIER10.all = TempPIEIER;
}
我设置 ADC、调用过程:
//为电源监视器设置 ADCC
SET_ADCC();
//设置 ADCA 以测量电机电流
set_adca();
但是、只有最后一个设置通道才能工作、在这种情况下、只有 ADCA 才能工作并生成中断、模块 ADCC 既不会生成中断。 但只设置一个模块就可以了。
此致
您好!
问题没有明确说明。 您计划实现什么目标?您面临的问题是什么? 我会进行调查、并尝试提供相应的建议。
尊敬的 Stevan
我希望两个 ADC 模块正常工作并触发相关的中断过程、现在只有最后一个已初始化的 ADC 模块将触发中断、而另一个模块不会触发中断。 模块都能正常工作、那么这一点很重要。
此致
Luca.
您好!
感谢您的澄清。 请查看 C2000Ware 器件支持示例以查看是否已正确配置所有内容: C:\ti\c2000\C2000Ware_5_03_00_00\device_support\f2837xd\examples\cpu1\adc_soc_ePWM
你(们)好
只需查看示例和勘误表、我想我可以解决这个问题。 解决方案是在 ADC 准备好工作后启动 PWM、因为 ADC 设置过程中的延迟可能是在 ADC 就绪之前 PWM 触发器到达的第一个、并且不会产生进一步的中断。
此致 Luca