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.

[参考译文] TMS320F28.0049万M:ADC示例结果错误

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/618955/tms320f280049m-adc-sample-result-error

部件号:TMS320F28.0049万M

 你好,冠军,

我们找到F28.0049万 ADC示例结果并得到一些结果,这些结果与实际值的偏移量很大。 我们在客户板和controlCARD中尝试使用它,结果相同,并且在开机时偏移量较大(这是一个数字项目)。

我尝试更改样例窗口,但没有影响。

以下是测试波形:

下面是我的测试代码使用DAC输出ACD采样值,ADCC3输入1.5V信号。

//#######################################################################
//
//文件:adc_ex1_so_ePWM.c
//
//标题:ADC ePWM触发
//
//! \addtogroup bitfield_example_list
//! <h1>ADC ePWM触发</h1>
//!
//! 此示例将ePWM1设置为定期在ADCA上触发转换。
//!
//! \b外部连接\n
//! - A0应连接至信号进行转换
//!
//! \b监视变量\n
//! -\b adcAResults -来自的一系列模数转换示例
//! 针脚A0。 样本之间的时间根据周期确定
//! ePWM计时器。
//!
//
//#######################################################################
//$TI发行版:F2.8004万x支持库v 1.00 .00.00 $
//$发布日期:周三1月25日16:01:20 CST 2017 $
//$Copyright:
//版权所有(C) 2017 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,无论是否使用
//修改,但前提是满足以下条件
//满足:
//
//重新分发源代码必须保留上述版权
//注意,此条件列表和以下免责声明。
//
//以二进制形式重新分发必须复制上述版权
//注意,此条件列表和中的以下免责声明
//随提供的文档和/或其他材料
//分发。
//
//既不是德州仪器(TI)公司的名称,也不是的名称
//其贡献者可用于支持或促销衍生产品
//未经特定的事先书面许可。
//
//本软件由版权所有者和贡献者提供
//“按原样”和任何明示或暗示的担保,包括但不包括
//仅限于适销性和适用性的暗示担保
//不承担特定目的。 在任何情况下,版权都不应享有
//所有者或贡献者对任何直接,间接,附带,
//特殊,典型或后果性损害(包括但不包括
//仅限于采购替代货物或服务;无法使用,
//数据或利润;或业务中断)
//责任理论,无论是合同,严格责任还是侵权行为
//(包括疏忽或其他)因使用而产生的任何问题
//此软件的任何版本,即使已被告知可能会造成此类损坏。
//$
//#######################################################################

//
//包含的文件
//
#include "F28x_Project.h"

//
//定义
//
#define results_buffer_size 256
#define ADC_P12_Gain 3.3 ADC/4095/0.19946809f</s>1994.6809万

//
//全局
//
UINT16_t adcAResults[Results_buffer_size];//结果缓冲区
uINT16_t索引;
uINT16_t i = 0;
//索引到结果缓冲区
volatile uint16_t bufferFull;//表示缓冲区已满的标志

//
//函数原型
//
void initADC(void);
void initEPWM(void);
void initADCSOC(void);
void configureDAC (void);
void GetADCRlt(void);
__interrupt void adcA1ISR(void);

//
//主菜单
//
Void主(void)

//
//初始化设备时钟和外围设备
//
InitSysCtrl();

//
//初始化GPIO
//
伊尼特·格皮奥();

//
//禁用CPU中断
//
色调;

//
//将PIE控件寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//
InitPieCtrl();

//
//禁用CPU中断并清除所有CPU中断标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//
InitPieVectorTable();

//
//映射ISR功能
//
EALLOW;
// PieVectorTable.ADCA1_INT =&adcA1ISR;// ADCA中断1的函数
EDIS;

//
//配置ADC并将其打开
//
initADC();

//
//配置ePWM
//
initepwm();

//
//在通道0上设置ePWM触发转换的ADC
//
initADCSOC();
configureDAC();

//
//启用全局中断和更高优先级的实时调试事件:
//
// IER || M_INT1;//启用组1中断

EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM

//
//初始化结果缓冲区
//
对于(index = 0;index < results_buffer_size;index++)

adcAResults[index]= 0;
}

索引= 0;
缓冲器全轮= 0;

//
//启用PIE中断
//
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;

//
//同步ePWM
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;

//
//无限期循环转换
//
同时(1)

//
//启动ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结,并进入UP计数模式
I++;
如果(i>1万)

GetADCRlt();
I = 0;
}
}
}

//
// initADC -用于配置和启动ADCA的功能。
//
void initADC(void)

//
//将VREF设置为内部
//
SetVREF (ADC_ADCC,ADC_INTERNAL,ADC_VREF2P5);

EALLOW;

//
//将ADCCLK除法器设置为/4
//
ADccRegs.ADCCTL2.bit.prcale =6;

//
//将脉冲位置设置为延迟
//
ADccRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//
//打开ADC电源,然后延迟1毫秒
//
ADccRegs.ADCCTL1.bit.ADCPWDNZ = 1;
EDIS;

DELAY _US (1000);
}

//
// initEPWM -用于配置ePWM1以生成SOC的函数。
//
void initEPWM (void)

EALLOW;

EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在加电计数时选择SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在第一个事件上生成脉冲

EPwm1Regs.CMPA.bit.CMPA = 0x0800;// set将值与2048个计数进行比较
EPwm1Regs.TBPRD = 0x1000;//将周期设置为4096个计数

EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器

EDIS;
}

//
// initADCSOC -用于配置ADCA的SOC0以由ePWM1触发的函数。
//
void initADCSOC(void)

//
//选择要转换的通道和转换结束标志
//
EALLOW;

ADccRegs.ADCSOC0CTL.bit.CHSEL = 2;// SOC0将转换引脚A0
ADccRegs.ADCSOC0CTL.bit.ACQPS =14;//样例窗口为10个SYSCLK周期
ADccRegs.ADCSOC0CTL.bit.TRIGSEL = 0;// ePWM1 SOCA上的触发器

ADccRegs.ADCSOC2CTL.bit.CHSEL = 3;// SOC0将转换引脚A0
ADccRegs.ADCSOC2CTL.bit.ACQPS = 14;//样例窗口为10个SYSCLK周期
ADccRegs.ADCSOC2CTL.bit.TRIGSEL = 5;// ePWM1 SOCA上的触发器

ADccRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0的结尾将设置INT1标志
ADccRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用INT1标志
ADccRegs.ADCINTFLGCLL.bit.ADCINT1 =1;//确保INT1标志已清除

EDIS;
}

//
// adcA1ISR - ADC A中断1 ISR
//
__interrupt void adcA1ISR(void)

//
//将最新结果添加到缓冲区
//
adcAResults[index+]= AdcaResultRegs.ADCRESULT0;

//
//如果缓冲区已满,请设置bufferFull标志
//
IF (results_buffer_size <=索引)

索引= 0;
缓冲器全轮= 1;
}

//
//清除中断标志并发出ACK
//
ADccRegs.ADCINTFLGCLL.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACG.ALL = PIEACK_GROUP1;
}

void配置DAC (void)

EALLOW;
DacbRegs.DACCTL.bit.LOADMODE = 0;
// DacbRegs.DACCTL.bit.DACREFSEL = 0;//0 VDAC/VSSA是参考电压
DacbRegs.DACCTL.bit.DACREFSEL = 1;// 1 ADC VREFHI/VREFLO是参考电压
DacbRegs.DACVALS.bit.DACVALS =0;
DacbRegs.DACOUTEN.Bit.DACOUTEN = 1;
EDIS;
F28x_usDelay(10);

}

void GetADCRlt(void)

UINT32_t P12Volt;
// AdccRegs.ADCSOCFRC1.bit.SOC2 = 1;/* start P12V_SENSE sampling */

P12Volt = AdccResultRegs.ADCRESULT2;
IF ((P12Volt < 2920)&&(P12Volt > 2880))

DacbRegs.DACVALS.bit.DACVALS = P12Volt;
}


// else if (P12Volt < 2860)
//{
// DacbRegs.DACVALS.bit.DACVALS = 100;
//}
//其他
//{
// DacbRegs.DACVALS.bit.DACVALS = P12Volt;
//}

}

//
//文件结束
//

你知道为什么会出现这样的故障吗? 最坏的情况是,它将出现30 % 故障以外的故障。

谢谢!

巴西

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Joe,

    ADC输入的驱动因素是什么? ADC引脚上的阻抗是多少? 驱动运算放大器的带宽是多少(如果使用运算放大器)? 采样率是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于外设电路而不是MCU,出现电压故障。 但是,您可以使用平均滤波器来消除故障。