单片机学习:DSP28335-ePWM

#include "DSP28x_Project.h"

// Configure the period for each timer
#define EPWM1_TIMER_TBPRD  3750  // Period register 系统始终为150MHZ,下面的程序进行了4分频,即为37.5MHZ,这样得到的是10KHZ

#define EPWM1_START_CMPA     1900//设置PWM通道A初始占空比
#define EPWM1_START_CMPB     1900//设置PWM通道B初始占空比

void ChangeDuty(Uint16 Duty)//改变占空比函数
{
	if(Duty > EPWM1_TIMER_TBPRD) Duty = EPWM1_TIMER_TBPRD;
	if(Duty < 0) Duty = 0;
	
	EPwm1Regs.CMPA.half.CMPA = Duty;     // Set compare A value
	EPwm1Regs.CMPB = Duty;               // Set Compare B value
}
void PWM1_Init()//初始化PWM
{
/*首先进行的是PWM1引脚的初始化,因为PWM1的引脚为GPIO0和GPIO1,这两个引脚可以是普通的IO口,也可以复用输出PWM,这里选用复用功能*/
	EALLOW;
	GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;    // Enable pull-up on GPIO0 (EPWM1A)
	GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;    // Enable pull-up on GPIO1 (EPWM1B)
	GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A复用功能设置,为0代表是普通IO口
	GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;   // Configure GPIO1 as EPWM1B
	EDIS;

	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;      // Stop all the TB clocks
	EDIS;

	// Setup TBCLK
	EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD - 1;           // 设置周期
	EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // 这个代表的是相位,不明白什么东西
	EPwm1Regs.TBCTR = 0x0000;                      // Clear counter

	// Set Compare values
	EPwm1Regs.CMPA.half.CMPA = EPWM1_START_CMPA;     // Set compare A value
	EPwm1Regs.CMPB = EPWM1_START_CMPB;               // Set Compare B value

	// Setup counter mode
	EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //计数模式
	EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
	EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2;       // 这里是进行2分频
	EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2;          //这里也是2分频

	// Setup shadowing
	EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;   //采用影子寄存器跟新
	EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
	EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;  // Load on Zero
	EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

	// Set actions
	EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;          // Set PWM1A on event A, up count
	EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;           // Clear PWM1A on event A, down count

	EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;             // Set PWM1B on event B, up count
	EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;           // Clear PWM1B on event B, down count

	EALLOW;
	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;         // Start all the timers synced
	EDIS;
}
void All_Init()
{
	InitSysCtrl();
	DINT;

	InitPieCtrl();
	IER = 0x0000;
	IFR = 0x0000;
	InitPieVectTable();
	PWM1_Init();

	EINT;   // Enable Global interrupt INTM
	ERTM;   // Enable Global realtime interrupt DBGM
}
Uint16 Duty = 1900;
void main(void)
{

	All_Init();

	while(1)
	{
		ChangeDuty(Duty);
	}
}

产生PWM主要需要三个部件,
第一个是周期PRD,通过设定EPwm1Regs.TBPRD的值,来得到周期,我的代码中设定的是3750,系统时钟是150 M hz,经过四分频得到的是37.5Mhz,即1/(37.5M)秒,计数器每个时间间隔加一,加到3750需要的时间是3750 * 1 / (37.5M) = (1 / 10K)秒,即为计数周期,可知频率为10K。

第二个是计数器CTR,计数器根据设定的时钟频率不断累加,我设定计数时钟频率是10K,即每过0.00001s,计数器自动加一。我这里设定的计数模式是增减模式,即计数器加到EPwm1Regs.TBPRD时再自动开始减小,当减到0时,又开始增加。

第三个是比较器COMPA,COMPA是我们自己设定的比较值,当这里设定的初始值1900,当计数器计数到1900的时候会产生事件,比如讲输出引脚置为1或者清为0。

这里采用了影子(映射)寄存器(EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;),映射提供了一个保持寄存器与硬件同步更新的方法,当使用映射模式时,只能在特定的事件处更新当前工作的寄存器,这就防止了由于软件异步修改寄存器内容而引发的错误。
这里写图片描述
计算器不断的累加,当计数器的值等于比较值时,就输出为1,当计数器的值等于周期值时,就输出为0.从图中也很容易看出方波的周期和占空比。

  • 13
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DSP28335是德州仪器(Texas Instruments)公司推出的一款数字信号处理器,支持多种模块化功能,其中包括EPWM模块,用于生成PWM信号。下面是DSP28335的EPWM配置步骤: 1. 选择PWM模块:DSP28335共有6个PWM模块(EPWM1-EPWM6),需要根据实际需求选择其中一个。 2. 配置PWM时钟:PWM时钟可以选择CPU时钟、系统时钟或者外部时钟,需要根据实际需求进行选择。 3. 配置PWM计数周期:计数周期决定了PWM信号的频率,可以通过设置TBPRD(Timer Period Register)的值来实现。计数周期的值需要根据所需的PWM频率和时钟频率进行计算。 4. 配置PWM占空比:PWM占空比可以通过设置CMPA和CMPB(Compare Registers)的值来实现。CMPA和CMPB的值需要根据所需的PWM占空比和计数周期进行计算。 5. 配置同步输出:如果需要多个PWM模块同步输出PWM信号,可以通过配置SYNCOSEL(Sync Output Select Register)和SYNCSEL(Sync Selection Register)来实现。 6. 配置死区时间:死区时间可以通过设置DBRED和DBFED(Dead-Band Registers)的值来实现。死区时间的值需要根据所需的PWM占空比和计数周期进行计算。 7. 开启PWM输出:配置完成后,需要将PWM模块的TBCTL(Timer Control Register)寄存器的CTRMODE位设置为0x00,使其进入up-count计数模式,并将HSPCLKDIV和CLKDIV分频系数设置为1,以使PWM模块开始输出PWM信号。 上述是DSP28335的EPWM配置步骤,需要根据实际需求进行具体的设置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值