一、CPU定时器初始化
/*************************************************************************/
/* Name : InitCpuTimers */
/* */
/* Init CPU Timers */
/* */
/* In : none */
/* Out : none */
/* Return: none */
/*************************************************************************/
void InitCpuTimers(void)
{
// CPU Timer 0 not used
// CPU Timer 1 为系统提供时基 执行测速程序
// Initialize address pointers to respective timer registers:
CpuTimer1.RegsAddr = &CpuTimer1Regs;
// Initialize timer period
CpuTimer1Regs.PRD.all = CPUTIME1_PRD; //90M/8K
// Initialize pre-scale counter to divide by 1 (SYSCLKOUT):
CpuTimer1Regs.TPR.all = 0;
CpuTimer1Regs.TPRH.all = 0;
// Make sure timers are stopped:
CpuTimer1Regs.TCR.bit.TSS = 1;
// Reload all counter register with period value:
CpuTimer1Regs.TCR.bit.TRB = 1;
// CPU-Timer Emulation Mode --Free run
CpuTimer1Regs.TCR.bit.FREE = 0x3;
// CPU-Timer Interrupt Enable
CpuTimer1Regs.TCR.bit.TIE = 1;
CpuTimer1Regs.TCR.bit.TSS = 0;
// Reset interrupt counters:
CpuTimer1.InterruptCount = 0;
// CPU Timer 2 提供1ms时基
CpuTimer2.RegsAddr = &CpuTimer2Regs;
CpuTimer2Regs.PRD.all = CPUTIME2_PRD; //90M/1K
CpuTimer2Regs.TPR.all = 0;
CpuTimer2Regs.TPRH.all = 0;
CpuTimer2Regs.TCR.bit.TSS = 1;
CpuTimer2Regs.TCR.bit.TRB = 1;
CpuTimer2Regs.TCR.bit.FREE = 0x3;
CpuTimer2Regs.TCR.bit.TIE = 1;
CpuTimer2Regs.TCR.bit.TSS = 0;
CpuTimer2.InterruptCount = 0;
}
- 仅初始化定时器1和定时器2,若使用定时器0,类似;
- 定时器1提供125us/8k时基,定时器2提供1ms/1k时基;
- 装载值分别为
//定时器频率
#define CPUTIME1_FRE 8000 //定时器1 频率 8K
#define CPUTIME1_PRD SYS_FRE/CPUTIME1_FRE
#define CPUTIME2_FRE 1000 //定时器1 频率 1K
#define CPUTIME2_PRD SYS_FRE/CPUTIME2_FRE
二、ADC初始化
/*************************************************************************/
/* Name : Init Adc */
/* */
/* Init ADC */
/* */
/* In : none */
/* Out : none */
/* Return: none */
/*************************************************************************/
void InitAdc(void)
{
//extern void DSP28x_usDelay(Uint32 Count);
// *IMPORTANT*
// The Device_cal function, which copies the ADC calibration values from TI reserved
// OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the
// Boot ROM. If the boot ROM code is bypassed during the debug process, the
// following function MUST be called for the ADC to function according
// to specification. The clocks to the ADC MUST be enabled before calling this
// function.
// See the device data manual and/or the ADC Reference
// Manual for more information.
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
(*Device_cal)();
EDIS;
// To powerup the ADC the ADCENCLK bit should be set first to enable
// clocks, followed by powering up the bandgap, reference circuitry, and ADC core.
// Before the first conversion is performed a 5ms delay must be observed
// after power up to give all analog circuits time to power up and settle
// Please note that for the delay function below to operate correctly the
// CPU_RATE define statement in the F2806x_Examples.h file must
// contain the correct CPU clock period in nanoseconds.
EALLOW;
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power ADC BG
AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; //禁止重叠采样
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power reference
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Select interal BG
EDIS;
DELAY_US(ADC_usDELAY); // Delay before converting ADC channels
EALLOW;
AdcRegs.ADCCTL2.bit.CLKDIV4EN = 0;
AdcRegs.ADCCTL2.bit.CLKDIV2EN = 1;
EDIS;
DELAY_US(ADC_usDELAY); // Delay before converting ADC channels
}
- 在TI提供的F2806x_Adc.c中稍作修改
三、ADC采样通道配置
/*************************************************************************/
/* Name : Init Adc Sample */
/* */
/* ADC采样通道配置 */
/* */
/* In : none */
/* Out : none */
/* Return: none */
/*************************************************************************/
void InitAdcSample(void)
{
EALLOW;
#if (ADC_CHANNEL_0 == 1)
{
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC0CTL.bit.CHSEL = BSP_AD_CHANNEL_0;
AdcRegs.ADCSOC0CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_1 == 1)
{
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC1CTL.bit.CHSEL = BSP_AD_CHANNEL_1;
AdcRegs.ADCSOC1CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_2 == 1)
{
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC2CTL.bit.CHSEL = BSP_AD_CHANNEL_2;
AdcRegs.ADCSOC2CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_3 == 1)
{
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC3CTL.bit.CHSEL = BSP_AD_CHANNEL_3;
AdcRegs.ADCSOC3CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_4 == 1)
{
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC4CTL.bit.CHSEL = BSP_AD_CHANNEL_4;
AdcRegs.ADCSOC4CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_5 == 1)
{
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC5CTL.bit.CHSEL = BSP_AD_CHANNEL_5;
AdcRegs.ADCSOC5CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_6 == 1)
{
AdcRegs.ADCSOC6CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC6CTL.bit.CHSEL = BSP_AD_CHANNEL_6;
AdcRegs.ADCSOC6CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_7 == 1)
{
AdcRegs.ADCSOC7CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC7CTL.bit.CHSEL = BSP_AD_CHANNEL_7;
AdcRegs.ADCSOC7CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_8 == 1)
{
AdcRegs.ADCSOC8CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC8CTL.bit.CHSEL = BSP_AD_CHANNEL_8;
AdcRegs.ADCSOC8CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_9 == 1)
{
AdcRegs.ADCSOC9CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC9CTL.bit.CHSEL = BSP_AD_CHANNEL_9;
AdcRegs.ADCSOC9CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_10 == 1)
{
AdcRegs.ADCSOC10CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC10CTL.bit.CHSEL = BSP_AD_CHANNEL_10;
AdcRegs.ADCSOC10CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_11 == 1)
{
AdcRegs.ADCSOC11CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC11CTL.bit.CHSEL = BSP_AD_CHANNEL_11;
AdcRegs.ADCSOC11CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_12 == 1)
{
AdcRegs.ADCSOC12CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC12CTL.bit.CHSEL = BSP_AD_CHANNEL_12;
AdcRegs.ADCSOC12CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_13 == 1)
{
AdcRegs.ADCSOC13CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC13CTL.bit.CHSEL = BSP_AD_CHANNEL_13;
AdcRegs.ADCSOC13CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_14 == 1)
{
AdcRegs.ADCSOC14CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC14CTL.bit.CHSEL = BSP_AD_CHANNEL_14;
AdcRegs.ADCSOC14CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
#if (ADC_CHANNEL_15 == 1)
{
AdcRegs.ADCSOC15CTL.bit.TRIGSEL = BSP_AD_TRIGSEL;
AdcRegs.ADCSOC15CTL.bit.CHSEL = BSP_AD_CHANNEL_15;
AdcRegs.ADCSOC15CTL.bit.ACQPS = BSP_AD_ACQPS;
}
#endif
EDIS;
}
#define BSP_AD_TRIGSEL 0x05 //选择由EPWM1触发采样,该定义会关联到AD采样所有通道,具体值参考芯片手册
#define BSP_AD_ACQPS 0x0f //采样窗口设置为0X0F+1,该定义会关联到AD采样所有通道,具体值参考芯片手册
#define ADC_CHANNEL_0 0 //保留
#define ADC_CHANNEL_1 0 //保留
#define ADC_CHANNEL_2 0 //保留
#define ADC_CHANNEL_3 1 //母线电压
#define ADC_CHANNEL_4 0 //保留
#define ADC_CHANNEL_5 1 //模拟量输入2
#define ADC_CHANNEL_6 0 //保留
#define ADC_CHANNEL_7 1 //模拟量输入1
#define ADC_CHANNEL_8 1 //U相电流
#define ADC_CHANNEL_9 1 //W相电流
#define ADC_CHANNEL_10 0 //保留
#define ADC_CHANNEL_11 0 //保留
#define ADC_CHANNEL_12 0 //保留
#define ADC_CHANNEL_13 0 //保留
#define ADC_CHANNEL_14 0 //保留
#define ADC_CHANNEL_15 1 //散热器温度
- ADC仅采用了通道3、5、7、8、9、、15,分别采样母线电压、模拟量2、模拟量1、U相电流、W相电流、散热器温度
- 采样均由EPWM6触发
- 仅配置触发条件和采样窗口
四、PWM配置
/*************************************************************************/
/* Name : InitEpwm */
/* */
/* Init EPWM */
/* */
/* In : none */
/* Out : none */
/* Return: none */
/*************************************************************************/
void InitEpwm(void)
{
/*EPWM1 CONFIG*/
/*Time-Base Phase Register*/
EPwm1Regs.TBPHS.all = 0;
EPwm1Regs.TBCTL.all = 0x12;//上下计数模式,计数值为0时同步
EPwm1Regs.CMPCTL.all = 0x0;
EPwm1Regs.AQCTLA.all = 0x0060;//增计数到CMPA时,输出高;减计数到CMPA时,输出低
/*Action-Qualifier Output B Control Register*/
EPwm1Regs.AQCTLB.all = 0;
/*Dead-Band Generator Control Register*/
EPwm1Regs.DBCTL.all = 0x0007;
EPwm1Regs.DBFED = 135; //死区1.5us ,后面会根据参数更改
EPwm1Regs.DBRED = 135;
/*Time-Base Period Register*/
EPwm1Regs.TBPRD = 5625; // 开关频率8K,后面会根据参数更改
EPwm1Regs.CMPB = EPwm1Regs.TBPRD - ADC_START_DELAY;//由EPWM计数到0启动AD采样,该值越大,采样越提前
/*Event-Trigger Selection Register*/
EPwm1Regs.ETSEL.all = 0x0F09;//下溢中断,向下计数到CMPB值时,启动AD采样
/*Event-Trigger Prescale Register*/
EPwm1Regs.ETPS.all = 0x0101;//发生下溢触发EPWM中断,向下计数到CMPB值时,触发AD采样
/*EPWM2 CONFIG*/
/*Time-Base Phase Register*/
EPwm2Regs.TBPHS.all = 0;
EPwm2Regs.TBCTL.all = 0x06;//上下计数,EPWM1计数到0时进行同步
EPwm2Regs.CMPCTL.all = 0x0;
EPwm2Regs.AQCTLA.all = 0x0060;//增计数到CMPA时,输出高;减计数到CMPA时,输出低
EPwm2Regs.AQCTLB.all = 0;
/*Do nothing*/
/*Dead-Band Generator Control Register*/
EPwm2Regs.DBCTL.all = 0x0007;
/*Dead-Band Generator Falling Edge Delay Register*/
EPwm2Regs.DBFED = 135; //死区1.5us ,后面会根据参数更改
EPwm2Regs.DBRED = 135;
/*Time-Base Period Register*/
EPwm2Regs.TBPRD = 5625; // 开关频率8K,后面会根据参数更改
/*Event-Trigger Selection Register*/
EPwm2Regs.ETSEL.all = 0;
/*Reserved*/
/*Event-Trigger Prescale Register*/
EPwm2Regs.ETPS.all = 0;
/*Reserved*/
/*EPWM3 CONFIG*/
/*Time-Base Phase Register*/
EPwm3Regs.TBPHS.all = 0;
EPwm3Regs.TBCTL.all = 0x06;//上下计数,EPWM1计数到0时进行同步
EPwm3Regs.CMPCTL.all = 0x0;
/*Action-Qualifier Output A Control Register*/
EPwm3Regs.AQCTLA.all = 0x0060; //增计数到CMPA时,输出高;减计数到CMPA时,输出低
/*Action-Qualifier Output B Control Register*/
EPwm3Regs.AQCTLB.all = 0;
/*Do nothing*/
/*Dead-Band Generator Control Register*/
EPwm3Regs.DBCTL.all = 0x0007;
EPwm3Regs.DBFED = 135; //死区1.5us ,后面会根据参数更改
EPwm3Regs.DBRED = 135;
/*Time-Base Period Register*/
EPwm3Regs.TBPRD = 5625; // 开关频率8K,后面会根据参数更改
/*Event-Trigger Selection Register*/
EPwm3Regs.ETSEL.all = 0;
/*Reserved*/
/*Event-Trigger Prescale Register*/
EPwm3Regs.ETPS.all = 0;
/*Reserved*/
/*EPWM1,EPWM2,EPWM3 SYN DEAL*/
EPwm1Regs.TBCTL.bit.SWFSYNC = 1;//强制同步一次
/*Time-Base Control Register*/
EPwm4Regs.TBCTL.all = 0x30;//向上计数,不同步
/*Counter-Compare Control Register*/
EPwm4Regs.CMPCTL.all = 0x0;
/*Action-Qualifier Output A Control Register*/
EPwm4Regs.AQCTLA.all = 0x0021;//计数器为0时输出低,为CMPA值时输出高
/*Action-Qualifier Output B Control Register*/
EPwm4Regs.AQCTLB.all = 0;
/*Do nothing*/
/*Dead-Band Generator Control Register*/
EPwm4Regs.DBCTL.all = 0x0;
EPwm4Regs.TBPRD = EPWM4_5_PRD;
/*Time-Base Phase Register*/
EPwm4Regs.TBPHS.all = 0;
/*Event-Trigger Selection Register*/
EPwm4Regs.ETSEL.all = 0x0000;
/*Event-Trigger Prescale Register*/
EPwm4Regs.ETPS.all = 0x0000;
/*EPWM5 CONFIG*/
/*Time-Base Control Register*/
EPwm5Regs.TBCTL.all = 0x30;//向上计数,不同步
/*Counter-Compare Control Register*/
EPwm5Regs.CMPCTL.all = 0x0;
/*Action-Qualifier Output A Control Register*/
EPwm5Regs.AQCTLA.all = 0x0021;//计数器为0时输出低,为CMPA值时输出高
/*Action-Qualifier Output B Control Register*/
EPwm5Regs.AQCTLB.all = 0;
/*Do nothing*/
/*Dead-Band Generator Control Register*/
EPwm5Regs.DBCTL.all = 0x0;
/*Time-Base Period Register*/
EPwm5Regs.TBPRD = EPWM4_5_PRD; //10K=90M/9000
/*Time-Base Phase Register*/
EPwm5Regs.TBPHS.all = 0;
/*Event-Trigger Selection Register*/
EPwm5Regs.ETSEL.all = 0x0000;
/*Reserved*/
/*Event-Trigger Prescale Register*/
EPwm5Regs.ETPS.all = 0x0000;
/*Reserved*/
/*Reserved*/
}
//PWM
#define ADC_START_DELAY 20 //ADC启动延时,由EPWM计数到0启动AD采样,该值越大,采样越提前
#define EPWM4_5_FRQ 10000 //EPWM4、EPWM5频率,用于输出模拟量
#define EPWM4_5_PRD SYS_FRE/EPWM4_5_FRQ //装载值
- EPMW1-3用于驱动
- EPWM1触发AD采样
- EPWM4/EPWM5用于输出模拟量电压