你好,冠军,
我们找到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 % 故障以外的故障。
谢谢!
巴西
乔
