第4篇-DSP28069外设初始化1

一、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用于输出模拟量电压

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件攻城狮阿三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值