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 既不会生成中断。 但只设置一个模块就可以了。
此致