您好!
我更新了 C28xx 实验套件中的 LAB7示例、以包含 ADCA0、ADCC0和 ADCD0以及 ADCA0。 当我调试代码并在我的实验套件上运行时、ADCC0可能无法工作、而另一个 ADC 可能工作、我在内存浏览器或表达式窗口中看到转换结果、我可以绘制转换结果。 我尝试更改 ADCC 通道、但仍然没有得到任何转换结果、输出缓冲器仍然为空。
下面是 ADC 文件以及 ADCC 的 ISR 中断:
空 InitAdca (空)
{
asm (" EALLOW");//启用 EALLOW 受保护寄存器访问
//--复位 ADC。 这是一种良好的编程实践。
DevCfgRegs.SOFTPRES13.bit.ADC_A = 1;// ADC 复位
DevCfgRegs.SOFTPRES13.bit.ADC_A = 0;// ADC 从复位中释放
DevCfgRegs.SOFTPRES13.bit.ADC_B = 1;// ADC 复位
DevCfgRegs.SOFTPRES13.bit.ADC_B = 0;// ADC 从复位中释放
DevCfgRegs.SOFTPRES13.bit.ADC_C = 1;// ADC 复位
DevCfgRegs.SOFTPRES13.bit.ADC_C = 0;// ADC 从复位中释放
DevCfgRegs.SOFTPRES13.bit.ADC_D = 1;// ADC 复位
DevCfgRegs.SOFTPRES13.bit.ADC_D = 0;// ADC 从复位中释放
//---配置 ADC 基址寄存器
AdcaRegs.ADCCTL1.ALL = 0x0004;//主 ADC 配置
AdcbRegs.ADCCTL1.ALL = 0x0004;//主 ADC 配置
AdccRegs.ADCCTL1.ALL = 0x0004;//主 ADC 配置
AdcdRegs.ADCCTL1.ALL = 0x0004;//主 ADC 配置
//位15-14 00:保留
//位13 0:ADCBSY、ADC 忙、只读
//位12 0:保留
//位11-8 0:ADCBSYCHN、ADC 忙通道、只读
//位7 0:ADCPWDNZ、ADC 断电、0 =断电、1 =上电
//位6-3 0000:保留
//位2 1:INTPULSEPOS、INT 脉冲生成、0=转换开始、1=转换结束
//位1-0 00:保留
AdcaRegs.ADCCTL2.all = 0x0006;// ADC 时钟配置
AdcbRegs.ADCCTL2.all = 0x0006;// ADC 时钟配置
AdccRegs.ADCCTL2.ALL = 0x0006;// ADC 时钟配置
AdcdRegs.ADCCTL2.all = 0x0006;// ADC 时钟配置
//位15-8 0:保留
//位7 0:SIGNALMODE,由下面的 AdcSetMode()配置以获得正确的校准
//位6 0:分辨率,由下面的 AdcSetMode()配置以获得正确的校准
//位5-4 00:保留
//位3-0 0110:预分频、ADC 时钟预分频器。 0110=CPUCLK/4、Hence ADC 时钟= SYSCLK / 4 = 200MHz/4 = 50MHz
AdcaRegs.ADCBURSTCTL.ALL = 0x0000;
AdcbRegs.ADCBURSTCTL.ALL = 0x0000;
AdccRegs.ADCBURSTCTL.ALL = 0x0000;
AdcdRegs.ADCBURSTCTL.ALL = 0x0000;
//位15 0:BURSTEN、0 =禁用突发模式、1 =启用突发模式
//位14-12000:保留
//位11-8 0000:BURSTSIZE、0=1 SOC 已转换(无关)
//位7-6 00:保留
//位5-0 000000:BURSTTRIGSEL,00=仅软件(无关)
//---调用 AdcSetMode()以配置分辨率和信号模式。
//这也会对配置的模式执行正确的 ADC 校准。
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCC、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCD、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
//-- SOC0配置
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 7;//使用 ePWM2-ADCSOCA 触发
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;//转换通道 ADCINA0 (通道0)
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19;//采集窗口设置为(19+1)=20个周期(200MHz SYSCLK 时为100ns)
AdcaRegs.ADCINTSOCSEL.bit.SOC0 = 0;//无 ADC 中断触发 SOC0 (TRIGSEL 域决定触发)
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;//所有 SOC 在循环模式下处理
///--- ADCA2的 SOC1配置
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 7;//使用 ePWM2-ADCSOCA 触发
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 2;//转换通道 ADCINA2 (通道2)
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 19;//采集窗口设置为(19+1)=20个周期(200MHz SYSCLK 时为100ns)
AdcaRegs.ADCINTSOCSEL1.bit.SOC1 = 0;//无 ADC 中断触发 SOC1 (TRIGSEL 域决定触发)
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;//所有 SOC 在循环模式下处理
///--- ADC B 的 SOC0配置
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 7;//使用 ePWM2-ADCSOCA 触发
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;//转换通道 ADCINB0 (通道0)
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19;//采集窗口设置为(19+1)= 20个周期(200MHz SYSCLK 时为100ns)
AdcbRegs.ADCINTSOCSEL.bit.SOC0 = 0;//无 ADC 中断触发 SOC0 (TRIGSEL 域决定触发)
AdcbRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;//所有 SOC 在循环模式下处理
///--- ADC C 的 SOC0配置
AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 7;//使用 ePWM2-ADCSOCA 触发
AdccRegs.ADCSOC0CTL.bit.CHSEL = 0;//转换通道 ADCINB0 (通道0)
AdccRegs.ADCSOC0CTL.bit.ACQPS = 19;//采集窗口设置为(19+1)=20个周期(200MHz SYSCLK 时为100ns)
AdccRegs.ADCINTSOCSEL.bit.SOC0 = 0;//无 ADC 中断触发 SOC0 (TRIGSEL 域决定触发)
AdccRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;//所有 SOC 在循环模式下处理
///--- ADC D 的 SOC0配置
AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 7;//使用 ePWM2-ADCSOCA 触发
AdcdRegs.ADCSOC0CTL.bit.CHSEL = 0;//转换通道 ADCINB0 (通道0)
AdcdRegs.ADCSOC0CTL.bit.ACQPS = 19;//采集窗口设置为(19+1)=20个周期(200MHz SYSCLK 时为100ns)
AdcdRegs.ADCINTSOCSEL.bit.SOC0 = 0;//无 ADC 中断触发 SOC0 (TRIGSEL 域决定触发)
AdcdRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;//所有 SOC 在循环模式下处理
//-- ADCA1中断配置
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//中断脉冲、与标志状态无关
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 ADC 中的中断
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC0触发中断
//-- ADCB1中断配置
AdcbRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//中断脉冲、与标志状态无关
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 ADC 中的中断
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC0触发中断
//-- ADCC1中断配置
AdccRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//中断脉冲、与标志状态无关
AdccRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 ADC 中的中断
AdccRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC0触发中断
//-- ADCD1中断配置
AdcdRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//中断脉冲、与标志状态无关
AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 ADC 中的中断
AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC0触发中断
//--启用 ADC 中断
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 组1中启用 ADCA1中断
PieCtrlRegs.PIEIER1.bit.INTx2 = 1;//在 PIE 组1中启用 ADCB1中断
PieCtrlRegs.PIEIER1.bit.INTx3=1;//在 PIE 组1中启用 ADCC1中断
PieCtrlRegs.PIEIER1.bit.INTx6 = 1;//在 PIE 组1中启用 ADCD1中断
IER |= 0x0001;//在 IER 中启用 INT1以启用 PIE 组
//--完成
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC 加电
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC 加电
AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC 加电
AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC 加电
DelayU (1000);//加电后等待1ms、然后再使用 ADC
asm (" EDIS");//禁用 EALLOW 受保护寄存器访问
}//结束 InitAdc()
//----文件结尾------------
ISR 代码为:
中断空 ADCC1_ISR (空)// PIE1.3 @ 0x000D44 ADC-C 中断#1
{
静态 uint16 * AdcBufPtr2 = AdcBuf2;//指向缓冲区的指针
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//必须确认 PIE 组
//--管理 ADC 寄存器
AdccRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志
//---读取 ADC 结果
*AdcBufPtr2++= AdccResultRegs.ADCRESULT3;//读取结果
//--蛮力强制循环缓冲器
if (AdcBufPtr2 ==(AdcBuf2 + ADC_BUF_LEN))
{
AdcBufPtr2 = AdcBuf2;//将指针回卷到开头
}
}
非常感谢您的帮助
此致
