TI中文支持网
TI专业的中文技术问题搜集分享网站

DSP28335做直流无刷电机双闭环 但是AD采样一直测试不准,上下跳动,下面是电压值和AD采样相关程序

测试过程中,用万用表测的电压值1.65V,稳定不变,但是经过AD采样后在1.63V~~1.67V之间变化,下面是我的相关程序,还望大佬解答一下,十分感谢

#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#define ADC_usDELAY 5000L //延时5ms
#if (CPU_FRQ_150MHZ) // Default – 150 MHz SYSCLKOUT
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)=25.0 MHz
#endif
#define ADC_CKPS 0x1 // 25 ADC 模块时钟 
#define ADC_SHCLK 0x0 // ADC模块的采样/保持周期
#define AVG 1000 // 平均采样界限
#define ZOFFSET 0x00 // Average Zero offset
//—————————————————————————
void InitAdc(void)
{
extern void DSP28x_usDelay(Uint32 Count);
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;//使能ADC的时钟
EALLOW;
SysCtrlRegs.HISPCP.all=ADC_MODCLK;//HISPCP=25MHz,ADC工作的标准频率
ADC_cal();
EDIS;
AdcRegs.ADCTRL3.all = 0x00E0; // 给ADC内部上电
DELAY_US(ADC_usDELAY); // 在ADC转换前要延时一段时间

AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //0 采集窗口大小。控制SOC脉冲的宽度,同时也确定了采样开关闭合的时间
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //10 ADC 工作25M 下,不再分频
//AdcRegs.ADCTRL1.bit.CPS = 0; // 1 3.125MHz 是否再对送给ADC的时钟进行二分频 采样窗口大小,SOC脉冲宽度为一个ADCLK
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //设置顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1通道模式 Cascaded mode序列发生器工作在级联模式
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // 0 启动停止模式 // 连续模式
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // 使能排序覆盖

AdcRegs.ADCCHSELSEQ1.all = 0x0; //A0为采样通道
AdcRegs.ADCCHSELSEQ2.all = 0x0;
AdcRegs.ADCCHSELSEQ3.all = 0x0;
AdcRegs.ADCCHSELSEQ4.all = 0x0;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x3; // convert and store in 8 results registers

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x0; // Setup ADCINA1 as 2nd SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x0;

AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能SEQ1的中断 允许向CPU发送中断请求
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// 使能PWMA SOC触发
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //SEQ1中断方式
// startmotor();//软件启动SEQ1
//AdcRegs.ADCTRL2.all=0x2080;
}
// End of file.

void EPwmSetup()
{


EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能ADC开始转换A(EPWMxSOCA)脉冲
EPwm1Regs.ETSEL.bit.SOCASEL = 2; //设置EPWMxSOCA何时生成,2,TBCTR=TBPRD //在第一个事件发生时生成ePWMxSOCA脉冲
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //Generate pulse on 1st event

}

interrupt void adc_isr(void)
{

AdcResult1= AdcRegs.ADCRESULT0>>4; 
dcvoltage1=AdcResult1/1365.0;//采集电压

中间是滤波取平均值

// Clear INT flag for this timer
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
// return;
}

mangui zhang:请确保大负载运行过程中板上的工作电压是否稳定如果稳定
需确认送入到ADC接口上的电压是否稳定最好拿示波器测试一下
软件环节最好PWM触发AD采用再结合算法做一些滑动滤波处理

测试过程中,用万用表测的电压值1.65V,稳定不变,但是经过AD采样后在1.63V~~1.67V之间变化,下面是我的相关程序,还望大佬解答一下,十分感谢

#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#define ADC_usDELAY 5000L //延时5ms
#if (CPU_FRQ_150MHZ) // Default – 150 MHz SYSCLKOUT
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)=25.0 MHz
#endif
#define ADC_CKPS 0x1 // 25 ADC 模块时钟 
#define ADC_SHCLK 0x0 // ADC模块的采样/保持周期
#define AVG 1000 // 平均采样界限
#define ZOFFSET 0x00 // Average Zero offset
//—————————————————————————
void InitAdc(void)
{
extern void DSP28x_usDelay(Uint32 Count);
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;//使能ADC的时钟
EALLOW;
SysCtrlRegs.HISPCP.all=ADC_MODCLK;//HISPCP=25MHz,ADC工作的标准频率
ADC_cal();
EDIS;
AdcRegs.ADCTRL3.all = 0x00E0; // 给ADC内部上电
DELAY_US(ADC_usDELAY); // 在ADC转换前要延时一段时间

AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; //0 采集窗口大小。控制SOC脉冲的宽度,同时也确定了采样开关闭合的时间
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; //10 ADC 工作25M 下,不再分频
//AdcRegs.ADCTRL1.bit.CPS = 0; // 1 3.125MHz 是否再对送给ADC的时钟进行二分频 采样窗口大小,SOC脉冲宽度为一个ADCLK
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //设置顺序采样模式
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1通道模式 Cascaded mode序列发生器工作在级联模式
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // 0 启动停止模式 // 连续模式
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // 使能排序覆盖

AdcRegs.ADCCHSELSEQ1.all = 0x0; //A0为采样通道
AdcRegs.ADCCHSELSEQ2.all = 0x0;
AdcRegs.ADCCHSELSEQ3.all = 0x0;
AdcRegs.ADCCHSELSEQ4.all = 0x0;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x3; // convert and store in 8 results registers

AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA0 as 1st SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x0; // Setup ADCINA1 as 2nd SEQ1 conv.
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x0;
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x0;

AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 使能SEQ1的中断 允许向CPU发送中断请求
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// 使能PWMA SOC触发
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //SEQ1中断方式
// startmotor();//软件启动SEQ1
//AdcRegs.ADCTRL2.all=0x2080;
}
// End of file.

void EPwmSetup()
{


EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能ADC开始转换A(EPWMxSOCA)脉冲
EPwm1Regs.ETSEL.bit.SOCASEL = 2; //设置EPWMxSOCA何时生成,2,TBCTR=TBPRD //在第一个事件发生时生成ePWMxSOCA脉冲
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //Generate pulse on 1st event

}

interrupt void adc_isr(void)
{

AdcResult1= AdcRegs.ADCRESULT0>>4; 
dcvoltage1=AdcResult1/1365.0;//采集电压

中间是滤波取平均值

// Clear INT flag for this timer
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
// return;
}

user5818829:

回复 mangui zhang:

您好,首先非常感谢您的解答,工作电压是稳定的,而且我用示波器测试了ADC接口上的电压是稳定的,就是AD采样不准确,请问我上面的程序有问题吗?

赞(0)
未经允许不得转载:TI中文支持网 » DSP28335做直流无刷电机双闭环 但是AD采样一直测试不准,上下跳动,下面是电压值和AD采样相关程序
分享到: 更多 (0)