320f28335的pwm波输出程序
### 320f28335的PWM波输出程序解析 #### 一、概述 本篇文章将详细解析一个基于TI DSP型号320f28335的PWM波输出程序。该程序主要利用了DSP内部的事件管理器模块(Event Manager,简称ePWM)来生成PWM信号。PWM(Pulse Width Modulation,脉冲宽度调制)是一种通过改变数字信号高电平持续时间来模拟不同电压水平的技术,在电机控制、电源管理和信号合成等领域有着广泛的应用。 #### 二、PWM原理与配置 在本程序中,ePWM模块被配置成上升下降计数模式,并且可以通过修改比较寄存器值来调整PWM信号的占空比。这种配置方式使得DSP能够高效地生成稳定的PWM波形,同时提供了较大的灵活性。 - **上升下降计数**:这是一种常见的计数模式,其中计数器从0开始向上计数直到达到最大值(由TBPRD寄存器设定),然后倒计数回到0。 - **占空比调整**:通过修改比较寄存器(如CMPA、CMPB)的值来调整PWM波形的高电平持续时间,从而实现占空比的变化。 #### 三、代码分析 ### 1. 头文件包含 程序首先包含了必要的头文件: ```c #include "DSP2833x_Device.h" // DSP2833x Header file Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File ``` 这些头文件定义了DSP的各种寄存器地址和常量,以及提供了一些实用的函数。 ### 2. PWM信息结构体定义 ```c typedef struct { volatile struct EPWM_REGS *EPwmRegHandle; Uint16 EPwm_CMPA_Direction; Uint16 EPwm_CMPB_Direction; Uint16 EPwmTimerIntCount; Uint16 EPwmMaxCMPA; Uint16 EPwmMinCMPA; Uint16 EPwmMaxCMPB; Uint16 EPwmMinCMPB; } EPWM_INFO; ``` 此结构体用于存储每个ePWM模块的相关信息,包括寄存器句柄、比较方向、中断计数等。 ### 3. 函数原型声明 ```c void InitEPwm1Example(void); void InitEPwm2Example(void); void InitEPwm3Example(void); interrupt void epwm1_isr(void); interrupt void epwm2_isr(void); interrupt void epwm3_isr(void); void update_compare(EPWM_INFO*); ``` 这些函数分别用于初始化三个不同的ePWM模块,以及处理相应的中断服务例程。 ### 4. 全局变量 ```c EPWM_INFO epwm1_info; EPWM_INFO epwm2_info; EPWM_INFO epwm3_info; ``` 这些全局变量用于存储每个ePWM模块的状态信息。 ### 5. 定时器周期配置 ```c #define EPWM1_TIMER_TBPRD 2000 #define EPWM1_MAX_CMPA 1950 #define EPWM1_MIN_CMPA 50 ... #define EPWM3_MAX_CMPB 1950 #define EPWM3_MIN_CMPB 1050 ``` 这里定义了每个ePWM模块的周期和最大最小比较值,从而确定了PWM信号的基本特性。 ### 6. 主函数 ```c void main(void) { // Step1. Initialize System Control: PLL, WatchDog, enable Peripheral Clocks InitSysCtrl(); // 初始化GPIO InitEPwm1Gpio(); InitEPwm2Gpio(); InitEPwm3Gpio(); // Step3. Clear all interrupts and initialize PIE vector table DINT(); // Disable CPU interrupts InitPieCtrl(); ... } ``` 主函数首先初始化系统控制模块,随后初始化GPIO和中断向量表。 #### 四、总结 通过上述分析可以看出,本程序详细展示了如何在TI DSP 320f28335上实现PWM波的输出。通过合理配置ePWM模块的各项参数,可以灵活地生成具有不同周期和占空比的PWM信号。这对于需要精确控制电机转速或者电源输出的应用场合来说非常重要。
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
typedef struct
{
volatile struct EPWM_REGS *EPwmRegHandle;
Uint16 EPwm_CMPA_Direction;
Uint16 EPwm_CMPB_Direction;
Uint16 EPwmTimerIntCount;
Uint16 EPwmMaxCMPA;
Uint16 EPwmMinCMPA;
Uint16 EPwmMaxCMPB;
Uint16 EPwmMinCMPB;
}EPWM_INFO;
// Prototype statements for functions found within this file.
void InitEPwm1Example(void);
void InitEPwm2Example(void);
void InitEPwm3Example(void);
interrupt void epwm1_isr(void);
interrupt void epwm2_isr(void);
interrupt void epwm3_isr(void);
void update_compare(EPWM_INFO*);
// Global variables used in this example
EPWM_INFO epwm1_info;
EPWM_INFO epwm2_info;
EPWM_INFO epwm3_info;
#define EPWM1_TIMER_TBPRD 2000 // Period register
#define EPWM1_MAX_CMPA 1950
#define EPWM1_MIN_CMPA 50
#define EPWM1_MAX_CMPB 1950
#define EPWM1_MIN_CMPB 50
#define EPWM2_TIMER_TBPRD 2000 // Period register
#define EPWM2_MAX_CMPA 1950
#define EPWM2_MIN_CMPA 50
#define EPWM2_MAX_CMPB 1950
#define EPWM2_MIN_CMPB 50
#define EPWM3_TIMER_TBPRD 2000 // Period register
#define EPWM3_MAX_CMPA 950
#define EPWM3_MIN_CMPA 50
#define EPWM3_MAX_CMPB 1950
#define EPWM3_MIN_CMPB 1050
// To keep track of which way the compare value is moving
#define EPWM_CMP_UP 1
#define EPWM_CMP_DOWN 0
void main(void)
{
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
InitSysCtrl();
剩余14页未读,继续阅读
- 宽窄存储2015-03-03可以运行,非常好
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助