您好!
我实际上在处理器 TMS320F28051上的 ADC 转换方面遇到了一个大问题。 目标是在所有 ADC 输入上进行连续转换、并由 ADCINT1生成 SOC。
我的问题是、其中一些措施是正确的、而有些措施不是...
经过一些分析、可以看出、输入产生问题的原因是它们在数据表(SPRS797B、第14页)中定义为 ADCINxy (运算放大器)。
下面是我执行的代码:
空 InitADC()
{
EALLOW;/*允许修改受保护的寄存器*/
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;//启用 ADC 时钟*
AdcRegs.ADCCTL1.bit.reset = 1;//重置整个 ADC 模块*
DELAY_US (1);/*确保复位后的2个时钟周期*/
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;//电源 ADC BG (内部带隙-内部电压基准)*/
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;//电源基准(内部基准缓冲器)*
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;//电源 ADC (内核内部的模拟电路)*/
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC *
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;//选择内部 BG *
EDIS;/*受保护寄存器的暂停修改*
DELAY_US (ADC_USDELAY);//转换 ADC 通道前的延迟
EALLOW;/*允许修改受保护的寄存器*/
(* Device_cal ();//使用器件特定的校准数据校准内部振荡器和 ADC */
EDIS;/*受保护寄存器的暂停修改*
DELAY_US (ADC_USDELAY);//转换 ADC 通道前的延迟
AdcOffsetSelfCal();
DELAY_US (ADC_USDELAY);//转换 ADC 通道前的延迟
/*--配置 ADC --*/
EALLOW;/*允许修改受保护的寄存器*/
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;// ADCINT1在 AdcResults 锁存之后跳闸*/
AdcRegs.INTSEL1N2.bit.INT1SEL = 14;//设置 EOC14以触发 ADCINT1触发*
AdcRegs.INTSEL1N2.bit.INT1CONT = 1;//启用 ADCINT1连续模式*
AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1 *
AdcRegs.ADCSOC0CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC1CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC2CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC3CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC4CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC5CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC6CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC7CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC8CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC9CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC10CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC11CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC12CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC13CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC14CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCSOC15CTL.bit.ACQPS = 0x3F;
AdcRegs.ADCINTSOCSEL1.bit.SOC0 = 1;//将 ADCINT1设置为 SOC0的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC1 = 1;//将 ADCINT1设置为 SOC1的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC2 = 1;//将 ADCINT1设置为 SOC2的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC3 = 1;//将 ADCINT1设置为 SOC3的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC4 = 1;//将 ADCINT1设置为 SOC4的触发器*
AdcRegs.ADCINTSOCSEL1.bit.SOC5 = 1;//将 ADCINT1设置为 SOC5的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC6 = 1;//将 ADCINT1设置为 SOC6的触发器*/
AdcRegs.ADCINTSOCSEL1.bit.SOC7 = 1;//将 ADCINT1设置为 SOC7的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC8 = 1;//将 ADCINT1设置为 SOC8的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC9 = 1;//将 ADCINT1设置为 SOC9的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC10 = 1;//将 ADCINT1设置为 SOC10的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC11 = 1;//将 ADCINT1设置为 SOC11的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC12 = 1;//将 ADCINT1设置为 SOC12的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC13 = 1;//将 ADCINT1设置为 SOC13的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC14 = 1;//将 ADCINT1设置为 SOC14的触发器*/
AdcRegs.ADCINTSOCSEL2.bit.SOC15 = 1;//将 ADCINT1设置为 SOC15的触发器*/
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0x0;//将 SOC0通道选择设置为 ADCINA0 *
AdcRegs.ADCSOC1CTL.bit.CHSEL = 0x1;//将 SOC2通道选择设置为 ADCINA1 *
AdcRegs.ADCSOC2CTL.bit.CHSEL = 0x2;//将 SOC2通道选择设置为 ADCINA2 *
AdcRegs.ADCSOC3CTL.bit.CHSEL = 0x3;//将 SOC2通道选择设置为 ADCINA3 *
AdcRegs.ADCSOC4CTL.bit.CHSEL = 0x4;//将 SOC2通道选择设置为 ADCINA4 *
AdcRegs.ADCSOC5CTL.bit.CHSEL = 0x5;//将 SOC4通道选择设置为 ADCINA5 *
AdcRegs.ADCSOC6CTL.bit.CHSEL = 0x6;//将 SOC6通道选择设置为 ADCINA6 *
AdcRegs.ADCSOC7CTL.bit.CHSEL = 0x7;//将 SOC6通道选择设置为 ADCINA7 *
AdcRegs.ADCSOC8CTL.bit.CHSEL = 0x8;//将 SOC6通道选择设置为 ADCINB0 *
AdcRegs.ADCSOC9CTL.bit.CHSEL = 0x9;//将 SOC6通道选择设置为 ADCINB1 *
AdcRegs.ADCSOC10CTL.bit.CHSEL = 0xA;//将 SOC6通道选择设置为 ADCINB2 *
AdcRegs.ADCSOC11CTL.bit.CHSEL = 0xB;//将 SOC6通道选择设置为 ADCINB3 *
AdcRegs.ADCSOC12CTL.bit.CHSEL = 0xC;//将 SOC6通道选择设置为 ADCINB4 *
AdcRegs.ADCSOC13CTL.bit.CHSEL = 0xD;//将 SOC6通道选择设置为 ADCINB5 *
AdcRegs.ADCSOC14CTL.bit.CHSEL = 0xE;//将 SOC6通道选择设置为 ADCINB6 *
AdcRegs.ADCSOC15CTL.bit.CHSEL = 0xF;//将 SOC6通道选择设置为 ADCINB7 *
EDIS;/*受保护寄存器的暂停修改*
}
中断空 AdcIsr (空)
{
//确认此__interrupt 以从组1接收更多__interrupts
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
空 InitInterrupt()
{
Dint;/*禁用 CPU 中断,这是 main ()中的第一步*/
/*重新初始化 PIE、PIEACK、IER、IFR */
InitPieCtrl();/*初始化 PIE 控制寄存器*/
PieCtrlRegs.PIEACK.ALL = 0xFFFF;//确认所有中断*/
IER &= 0x0000;//禁用所有中断*/
IFR &= 0x0000;//清除所有中断标志*/
/*将所需的 ISR 映射到 PieVectTable */
InitPieVectTable();/*初始化 PIE 矢量表*/
EALLOW;/*允许修改受保护的寄存器*/
PieVectTable.ADCINT1 =&AdcIsr;//映射 ADC 1中断*/EDIS;//暂停修改受保护的寄存器*/
/* PIE 级中断启用*/
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 ADCINT1 *
}
int main (空)
{
(笑声)
InitInterrupt();/*初始化中断*/
InitADC();/*初始化 ADC 模块*/
(笑声)
IER |= M_INT1;//启用 CPU 中断1 */
EINT;//启用全局中断 INTM */
ERTM;/*启用全局实时中断 DBGM *
AdcRegs.ADCSOCFRC1.bit.SOC14 = 1;
AdcRegs.INTSEL1N2.bit.INT1E = 1;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
/*主循环*/
while (true)
{
(笑声)
}
请告诉我问题出在哪里? 为什么只有具有(运算放大器)说明的输入会造成一些问题?
我检查了数据表、发现 PGA 可能是变化的来源、但它的缝隙是针对该功能配置的...
非常感谢您的帮助...
最好
Steve