LLC数字控制TMS320F28034,4-DSP的epwm配置介绍
- [1 TMS320F28034](#1 TMS320F28034)
-
- [1.1 概述](#1.1 概述)
- [1.2 PWM详细介绍](#1.2 PWM详细介绍)
- [2 TMS320F28034 PWM功能框图](#2 TMS320F28034 PWM功能框图)
-
- [2.1 ePWM功能模块](#2.1 ePWM功能模块)
- [2.2 ePWM功能寄存器框图](#2.2 ePWM功能寄存器框图)
- [3 TMS320F28034 PWM初始化流程](#3 TMS320F28034 PWM初始化流程)
- [4 结合项目设计](#4 结合项目设计)
- [5 代码设计](#5 代码设计)
-
- [5.1 PWM初始化程序](#5.1 PWM初始化程序)
- [5.2 工程代码](#5.2 工程代码)
- [6 总结](#6 总结)
1 TMS320F28034
1.1 概述
TMS320F28034 的系统时钟即为其主频。根据第一节手册的介绍,该系统时钟的最大值为 60MHz。TMS320F28034是德州仪器(Texas Instruments)生产的一款数字信号处理器(DSP),主要用于控制应用中的脉宽调制(PWM)控制。它是C2000系列中的一员,专为实时控制应用设计。
1.2 PWM详细介绍
以下是TMS320F28034的PWM模块的一些详细介绍:
- PWM模块数量:TMS320F28034具有多个PWM模块,具体数量取决于具体型号,通常每个PWM模块包含多个独立的PWM通道。
- 分辨率:PWM模块通常具有可编程的分辨率,通常是12位或更高,这有助于实现高精度的PWM输出。
- 死区控制:PWM模块通常支持死区控制功能,这对于驱动功率半导体器件(如MOSFET或IGBT)时非常重要,可避免交叉导通。
- 相位补偿:PWM模块通常支持相位补偿功能,可以调整PWM波形的相位,对于一些应用中的同步要求很有帮助。
- 中断支持:PWM模块通常支持中断功能,可以在特定事件发生时触发中断,这在实时控制系统中非常有用。
- 死区时间:PWM模块通常允许用户配置死区时间,即两个PWM信号之间的延迟时间,以确保电路中的开关元件正常工作。
- 支持的PWM输出类型:PWM模块通常支持不同类型的PWM输出,如对称/非对称PWM、单极性/双极性PWM等。
- 保护功能:PWM模块通常包含各种保护功能,如过流保护、过温保护等,以确保系统的稳定性和安全性。
2 TMS320F28034 PWM功能框图
2.1 ePWM功能模块
ePWM模块信号:
PWM输出信号(EPWMxA和EPWMxB),与GPIO复用。
触发区信号(TZ1到TZ6)。模块外部出现故障条件,TZ1到TZ3可配置为GPIO外设异步输入。TZ4与EQEP1模块相连。TZ5与系统时钟失效逻辑单元相连,TZ6与来自CPU的EMUSTOP输出相连。
时基同步输入(EPWMxSYNCI)和输出(EPWMxSYNCO)信号,可通过ePWM1管脚输出,在内部将所有ePWM模块相连。EPWM1SYNCO与eCAP1的SYNCI连接。
ADC开始转换信号(EPWMxSOCA和EPWMxSOCB)。
比较器输出信号(COMPxOUT),与触发区信号产生数字比较事件。
外设总线,32位宽,可以对ePWM寄存器执行16位和32位写操作。
2.2 ePWM功能寄存器框图
初始化TMS320F28034的PWM模块:
选择PWM时钟源和配置定时器周期:
首先,需要选择PWM的时钟源,可以是外部时钟或者内部时钟,常见的选择是使用系统时钟(SYSCLK)作为PWM的时钟源。
配置PWM的定时器周期,即PWM计数器的周期。这个周期决定了PWM波形的频率,可以根据具体需求进行设置。
配置PWM模块:
初始化每个PWM模块。每个PWM模块通常包含一个或多个独立的PWM通道。
禁用PWM模块,配置PWM的周期(PRD寄存器)和其他参数,如相位补偿、死区时间等。
启用PWM模块,使其开始生成PWM波形。
配置PWM输出引脚:
将PWM输出连接到外部器件,如电机驱动器或逆变器。这通常涉及将PWM输出引脚配置为GPIO模式,并设置为输出状态。
启动PWM模块:
启动PWM模块前,确保对所有PWM模块的配置都已完成。
通过设置相应的寄存器位或标志位来启动PWM模块。
确保PWM模块的时钟同步,以确保各个PWM模块之间的同步性。
其他配置和注意事项:
根据具体应用需求,配置死区时间、相位补偿、中断处理等功能。
对于不同的PWM模块,可能需要分别进行配置,确保每个PWM模块满足应用需求。
在初始化过程中,需要注意保护功能的配置,如过流保护、过温保护等,以确保系统的稳定性和安全性。
3 TMS320F28034 PWM初始化流程
初始化TMS320F28034的PWM模块:
选择PWM时钟源和配置定时器周期:
首先,需要选择PWM的时钟源,可以是外部时钟或者内部时钟,常见的选择是使用系统时钟(SYSCLK)作为PWM的时钟源。
配置PWM的定时器周期,即PWM计数器的周期。这个周期决定了PWM波形的频率,可以根据具体需求进行设置。
配置PWM模块:
初始化每个PWM模块。每个PWM模块通常包含一个或多个独立的PWM通道。
禁用PWM模块,配置PWM的周期(PRD寄存器)和其他参数,如相位补偿、死区时间等。
启用PWM模块,使其开始生成PWM波形。
配置PWM输出引脚:
将PWM输出连接到外部器件,如电机驱动器或逆变器。这通常涉及将PWM输出引脚配置为GPIO模式,并设置为输出状态。
启动PWM模块:
启动PWM模块前,确保对所有PWM模块的配置都已完成。
通过设置相应的寄存器位或标志位来启动PWM模块。
确保PWM模块的时钟同步,以确保各个PWM模块之间的同步性。
其他配置和注意事项:
根据具体应用需求,配置死区时间、相位补偿、中断处理等功能。
对于不同的PWM模块,可能需要分别进行配置,确保每个PWM模块满足应用需求。
在初始化过程中,需要注意保护功能的配置,如过流保护、过温保护等,以确保系统的稳定性和安全性。
4 结合项目设计
(1)跟句计算书及设计报告可知缓启动LLC运行的最低频率逐渐降低,死区逐渐减小。当PWM的最大周期量增加至MAX_PD,即对应的35kHz时,同时死区达到最小时,软启动结束,状态机跳转至运行状态。所以启动时为最高频率启动120Khz,死区为最大。
(2)为了保证AD采集数据与数字控制达到逐周期的效果,需要使用PWM触发ADC数据采集。
(3)数字控制时为保证产品工作的可靠性,电路上采用TZ事件作为PWM控制的保护,当触发TZ事件时,进行封波控制。
(4)在进行软件设计时,为保证开关管工作的稳定性,我们在初始上电时,不进行PWM引脚功能配置,使其输出低电平。
(5)在高频控制时,系统工作在最高频率需要进入burst模式,我们设置端口统一打开和关闭的封装函数。
5 代码设计
5.1 PWM初始化程序
注意看注释所解释内容。
c
void FunPwmInit(void)
{
EALLOW;
//120kHz
EPwm1Regs.TBPRD =400;
EPwm1Regs.TBPHS.half.TBPHS = 0;
//采用向上计数模式;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
//相移关闭;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
// 使用镜像寄存器,不直接操作TBPRD寄存器
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
// CTR = ZERO 时,发出同步时钟,
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
// TBCLK时钟分频; TBCLK = SYSCLKOUT/(CLKDIV * HSPCLKDIV),CLKDIV = 1;
EPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1;
// HSPCLKDIV = 1; TBCLK = SYSCLKOUT(60Mhz);
EPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;
// CMPA寄存器使用镜像模式;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
// CMPB寄存器使用镜像模式;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
// 当CTR = 0 时,将CMPA镜像中的数据加载到CMPA执行寄存器中;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD;
// 当CTR = 0 时,将CMPB镜像中的数据加载到CMPA执行寄存器中;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD;
// 当CTR = 0,EPWM1A = 1;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
// 当CTR = CMPA,EPWM1A = 0;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;
EPwm1Regs.AQCTLB.bit.CAU =AQ_NO_ACTION;
// enable Dead-band module DBA_ALL
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
// 上升沿延迟器输出端口不翻转,下升沿延迟器输出端口翻转,此处为设置PWMAB互补模式输出;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
//死区190*1/60MHz
EPwm1Regs.DBFED = 190;
//死区190*1/60MHz
EPwm1Regs.DBRED = 190;
//更新比较值
EPwm1Regs.CMPA.half.CMPA=200;
//ADC触发采样
//触发ADC采集位置
EPwm1Regs.CMPB=100;//永远是CMPA的一半
//使能SOCA触发功能
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
//Cnt=CMPB信号时触发采样,EPwm1Regs.CMPB位置
EPwm1Regs.ETSEL.bit.SOCASEL = 6;
//立即触发Generate pulse on 1st event
EPwm1Regs.ETPS.bit.SOCAPRD = 1;
//TZ1 will be one shot signal for EPWM1
EPwm1Regs.TZSEL.bit.OSHT1=TZ_DISABLE;//在逻辑控制时再打开
//TZ will Force EPWM1A to a low state
EPwm1Regs.TZCTL.bit.TZA=TZ_FORCE_LO;
//TZ will Force EPWM1B to a low state
EPwm1Regs.TZCTL.bit.TZB=TZ_FORCE_LO;
// TZ中断标志位全部清0;
EPwm1Regs.TZCLR.all = 0xffff;
// 中断均不使能;
EPwm1Regs.TZEINT.all = 0;
// 数值比较器暂不适用;
EPwm1Regs.TZDCSEL.all = 0;
EDIS;
}
5.2 工程代码
在APP问价夹下新建两个文件,分别是sys_pwm.c和sys_ pwm.h,并在includes.h中引用sys_ pwm.h文件,在sys_ pwm.c中引用includes.h文件,形成工程框架,软件工程如下所示。
工程代码:
c
#include "includes.h"
/********************************************************
* 函数名称:Init_system
* 功 能: 系统初始化
* 入口参数:
* 出口参数:
* 修 改:
********************************************************/
void Init_system(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
Flash_CPUScaleFactor = SCALE_FACTOR;
Flash_CallbackPtr=NULL;
EDIS;
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
}
/********************************************************
* 函数名称:void Init_system_end(void)
* 功 能: 系统初始化结束
* 入口参数:
* 出口参数:
* 修 改:
********************************************************/
void Init_system_end(void)
{
EALLOW; // This is needed to write to EALLOW protected registers
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
EDIS; // This is needed to disable write to EALLOW protected registers
//================================================================================
EINT;
ERTM;
}
/********************************************************
函数名称:main
函数功能:主程序
入口参数:
出口参数:
修 改:
********************************************************/
void main(void)
{
Init_system();
FunTimerInit();
FunGpioInit();
FunPwmInit();
FunPwmOpen();
Init_system_end();
//
while(1)
{
//计时200ms
delay_ms(200);
//指示灯的引脚状态进行反转
LEDGTOGGLE();
}
}
/*
- includes.h
- Created on: 2024年7月29日
Author:
*/
c
#ifndef APP_INCLUDES_H_
#define APP_INCLUDES_H_
#include "Flash2803x_API_Library.h"
#include "Flash2803x_API_Config.h"
#include "DSP28x_Project.h"
#include "DSP2803x_DefaultISR.h"
#include "DSP2803x_Adc.h"
#include "string.h"
#include "sys_gpio.h"
#include "sys_timer.h"
#include "sys_pwm.h"
//------------------------------------------
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
extern void Init_system(void);
extern void Init_system_end(void);
#endif /* APP_INCLUDES_H_ */
/*
- sys_gpio.c
- Created on: 2024年7月30日
Author:
*/
c
#include "includes.h"
void FunGpioInit(void)
{
GpioDataRegs.GPADAT.all = 0ul;
GpioDataRegs.GPBDAT.all = 0ul;
//GPIO初始化
//开始寄存器配置前执行指令
EALLOW;
// GPIOA DATA数据全清0
GpioDataRegs.GPADAT.all = 0ul;
// GPIOB DATA数据全清0
GpioDataRegs.GPBDAT.all = 0ul;
//LED G
GpioCtrlRegs.GPAMUX2.bit.GPIO24=0;
GpioCtrlRegs.GPADIR.bit.GPIO24=1;
//LED Y
GpioCtrlRegs.GPAMUX2.bit.GPIO21=0;
GpioCtrlRegs.GPADIR.bit.GPIO21=1;
//LED R
GpioCtrlRegs.GPAMUX2.bit.GPIO20=0;
GpioCtrlRegs.GPADIR.bit.GPIO20=1;
// GPIO0 <-> EPWM1A == 0:GPIO功能 1:PWM功能
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;
// GPIO1 <-> EPWM1B == 0:GPIO功能 1:PWM功能
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;
// GPIO0 <-> EPWM1A == 0:输出功能 1:输入功能
GpioCtrlRegs.GPADIR.bit.GPIO0=1;
// GPIO1 <-> EPWM1B == 0:输出功能 1:输入功能
GpioCtrlRegs.GPADIR.bit.GPIO1=1;
// GPIO0 <-> EPWM1A == 1:输出0
GpioDataRegs.GPACLEAR.bit.GPIO0=1;
// GPIO1 <-> EPWM1B == 1:输出0
GpioDataRegs.GPACLEAR.bit.GPIO1=1;
// COMP_OUT GPIO42 <-> OPP_COMP1_OUT
GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 3;
// AI02<-> COPM1+ ==2:比较器功能
GpioCtrlRegs.AIOMUX1.bit.AIO2 = 2;
// GPIO15 <-> TZ1
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 1;
//寄存器配置结束后执行指令
EDIS;
}
/*
- sys_gpio.h
- Created on: 2024年7月30日
Author:
*/
c
#ifndef APP_SYS_GPIO_H_
#define APP_SYS_GPIO_H_
//===========================================================================
#define LEDRGPIO GPIO20
#define LEDRMUX GpioCtrlRegs.GPAMUX2.bit.LEDRGPIO
#define LEDRDIR GpioCtrlRegs.GPADIR.bit.LEDRGPIO
#define LEDRTOGGLE() GpioDataRegs.GPATOGGLE.bit.LEDRGPIO = 1
#define LEDRON() GpioDataRegs.GPASET.bit.LEDRGPIO =1
#define LEDRLOW() GpioDataRegs.GPACLEAR.bit.LEDRGPIO =1
#define LEDYGPIO GPIO21
#define LEDYMUX GpioCtrlRegs.GPAMUX2.bit.LEDYGPIO
#define LEDYDIR GpioCtrlRegs.GPADIR.bit.LEDYGPIO
#define LEDYTOGGLE() GpioDataRegs.GPATOGGLE.bit.LEDYGPIO = 1
#define LEDYON() GpioDataRegs.GPASET.bit.LEDYGPIO =1
#define LEDYLOW() GpioDataRegs.GPACLEAR.bit.LEDYGPIO =1
#define LEDGGPIO GPIO24
#define LEDGMUX GpioCtrlRegs.GPAMUX2.bit.LEDGGPIO
#define LEDGDIR GpioCtrlRegs.GPADIR.bit.LEDGGPIO
#define LEDGTOGGLE() GpioDataRegs.GPATOGGLE.bit.LEDGGPIO = 1
#define LEDGON() GpioDataRegs.GPASET.bit.LEDGGPIO =1
#define LEDGLOW() GpioDataRegs.GPACLEAR.bit.LEDGGPIO =1
extern void FunGpioInit(void);
#endif /* APP_SYS_GPIO_H_ */
/*
- sys_pwm.c
- Created on: 2024年8月9日
Author:
*/
c
#include "includes.h"
void FunPwmInit(void)
{
EALLOW;
//120kHz
EPwm1Regs.TBPRD =400;
EPwm1Regs.TBPHS.half.TBPHS = 0;
//采用向上计数模式;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
//相移关闭;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
// 使用镜像寄存器,不直接操作TBPRD寄存器
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
// CTR = ZERO 时,发出同步时钟,
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
// TBCLK时钟分频; TBCLK = SYSCLKOUT/(CLKDIV * HSPCLKDIV),CLKDIV = 1;
EPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1;
// HSPCLKDIV = 1; TBCLK = SYSCLKOUT(60Mhz);
EPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1;
// CMPA寄存器使用镜像模式;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
// CMPB寄存器使用镜像模式;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
// 当CTR = 0 时,将CMPA镜像中的数据加载到CMPA执行寄存器中;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD;
// 当CTR = 0 时,将CMPB镜像中的数据加载到CMPA执行寄存器中;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD;
// 当CTR = 0,EPWM1A = 1;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
// 当CTR = CMPA,EPWM1A = 0;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;
EPwm1Regs.AQCTLB.bit.CAU =AQ_NO_ACTION;
// enable Dead-band module DBA_ALL
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
// 上升沿延迟器输出端口不翻转,下升沿延迟器输出端口翻转,此处为设置PWMAB互补模式输出;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
//死区190*1/60MHz
EPwm1Regs.DBFED = 190;
//死区190*1/60MHz
EPwm1Regs.DBRED = 190;
//更新比较值
EPwm1Regs.CMPA.half.CMPA=200;
//ADC触发采样
//触发ADC采集位置
EPwm1Regs.CMPB=100;//永远是CMPA的一半
//使能SOCA触发功能
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
//Cnt=CMPB信号时触发采样,EPwm1Regs.CMPB位置
EPwm1Regs.ETSEL.bit.SOCASEL = 6;
//立即触发Generate pulse on 1st event
EPwm1Regs.ETPS.bit.SOCAPRD = 1;
//TZ1 will be one shot signal for EPWM1
EPwm1Regs.TZSEL.bit.OSHT1=TZ_DISABLE;//在逻辑控制时再打开
//TZ will Force EPWM1A to a low state
EPwm1Regs.TZCTL.bit.TZA=TZ_FORCE_LO;
//TZ will Force EPWM1B to a low state
EPwm1Regs.TZCTL.bit.TZB=TZ_FORCE_LO;
// TZ中断标志位全部清0;
EPwm1Regs.TZCLR.all = 0xffff;
// 中断均不使能;
EPwm1Regs.TZEINT.all = 0;
// 数值比较器暂不适用;
EPwm1Regs.TZDCSEL.all = 0;
EDIS;
}
void FunPwmOpen(void)
{
EALLOW;
// GPIO0 <-> EPWM1A == 0:GPIO功能 1:PWM功能
GpioCtrlRegs.GPAMUX1.bit.GPIO0=1;
// GPIO1 <-> EPWM1B == 0:GPIO功能 1:PWM功能
GpioCtrlRegs.GPAMUX1.bit.GPIO1=1;
EDIS;
}
void FunPwmClose(void)
{
EALLOW;
// GPIO0 <-> EPWM1A == 0:GPIO功能 1:PWM功能
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;
// GPIO1 <-> EPWM1B == 0:GPIO功能 1:PWM功能
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;
// GPIO0 <-> EPWM1A == 0:输出功能 1:输入功能
GpioCtrlRegs.GPADIR.bit.GPIO0=1;
// GPIO1 <-> EPWM1B == 0:输出功能 1:输入功能
GpioCtrlRegs.GPADIR.bit.GPIO1=1;
// GPIO0 <-> EPWM1A == 1:输出0
GpioDataRegs.GPACLEAR.bit.GPIO0=1;
// GPIO1 <-> EPWM1B == 1:输出0
GpioDataRegs.GPACLEAR.bit.GPIO1=1;
EDIS;
}
/*
- sys_pwm.h
- Created on: 2024年8月9日
Author:
*/
c
#ifndef APP_SYS_PWM_H_
#define APP_SYS_PWM_H_
extern void FunPwmInit(void);
extern void FunPwmOpen(void);
extern void FunPwmClose(void);
#endif /* APP_SYS_PWM_H_ */
/*
- sys_timer.c
- Created on: 2024年8月1日
Author:
*/
c
#include "includes.h"
void FunTimerInit(void)
{
EALLOW; // This is needed to write to EALLOW protected registers
//打开对应定时器时钟
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;
SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1;
// CPU 定时器 0
// 寄存器地址指针和各自计时器初始化:
CpuTimer0.RegsAddr = &CpuTimer0Regs;
// 定时器周期寄存器最大值初始化:
CpuTimer0Regs.PRD.all = 0xFFFFFFFF;
// 预分频寄存器初始化为1 (SYSCLKOUT):
CpuTimer0Regs.TPR.all = 0;
CpuTimer0Regs.TPRH.all = 0;
// 确保定时器0停止:
CpuTimer0Regs.TCR.bit.TSS = 1;
// 重加载计数器周期值:
CpuTimer0Regs.TCR.bit.TRB = 1;
// 复位中断计时器:
CpuTimer0.InterruptCount = 0;
// CPU 定时器 1
// 寄存器地址指针和各自计时器初始化:
CpuTimer1.RegsAddr = &CpuTimer1Regs;
// 定时器周期寄存器最大值初始化:
CpuTimer1Regs.PRD.all = 0xFFFFFFFF;
// 预分频寄存器初始化为1 (SYSCLKOUT):
CpuTimer1Regs.TPR.all = 0;
CpuTimer1Regs.TPRH.all = 0;
// 确保定时器1停止:
CpuTimer1Regs.TCR.bit.TSS = 1;
// 重加载计数器周期值:
CpuTimer1Regs.TCR.bit.TRB = 1;
// 复位中断计时器:
CpuTimer1.InterruptCount = 0;
//定时器时长配置
//60:代表主频60M,
//20:代表20us,
//1000:代表1ms
ConfigCpuTimer(&CpuTimer0,60,20);
ConfigCpuTimer(&CpuTimer1,60,1000);
StartCpuTimer0();
StartCpuTimer1();
PieVectTable.TINT0 = &CpuTimer0Isr;//往中断矢量表中填写定时器0一个指针
PieVectTable.TINT1 = &CpuTimer1Isr;//往中断矢量表中填写定时器1一个指针
//打开PIE组对应中断
PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能第一组7通道定时器0
IER |= M_INT1; // Enable CPU INT
IER |= M_INT13; //根据中断向量表使能定时器1
EDIS; // This is needed to disable write to EALLOW protected registers
}
//delay_ms时间函数
static unsigned char delay_flag = 0;
static unsigned int delay_cnt = 0;
void delay_ms(unsigned int timer)
{
delay_flag = 1;
delay_cnt = 0;
while(delay_cnt<timer)
{
;
}
delay_flag = 0;
delay_cnt = 0;
}
//定时器中断0的中断服务函数==20us
static unsigned int timercnt= 0;
interrupt void CpuTimer0Isr(void)
{
timercnt++;
//1S时长
if(timercnt>50000)
{
timercnt = 0;
//指示灯的引脚状态进行反转
LEDRTOGGLE();
LEDYTOGGLE();
}
//============================================================
CpuTimer0Regs.TCR.bit.TIF = 1; //清除外设级中断标志位
PieCtrlRegs.PIEACK.bit.ACK1= 1; //清除PIE级中断应答
}
//定时器中断1的中断服务函数==1000us
interrupt void CpuTimer1Isr(void)
{
//时间计数的代码程序
if(delay_flag)
{
delay_cnt++;
if(delay_cnt>65500)
{
delay_cnt = 65500;
}
else
{
;
}
}
else
{
delay_cnt = 0;
}
//============================================================
CpuTimer1Regs.TCR.bit.TIF = 1; //清除外设级中断标志位
PieCtrlRegs.PIEACK.bit.ACK1= 1; //清除PIE级中断应答
}
/*
- sys_timer.h
- Created on: 2024年8月1日
Author:
*/
c
#ifndef APP_SYS_TIMER_H_
#define APP_SYS_TIMER_H_
extern void FunTimerInit(void);
extern void delay_ms(unsigned int timer);
extern interrupt void CpuTimer0Isr(void);
extern interrupt void CpuTimer1Isr(void);
#endif /* APP_SYS_TIMER_H_ */
6 总结
TMS320F28034作为德州仪器(Texas Instruments)C2000系列中的一款数字信号处理器(DSP),具有强大的PWM模块,为各种实时控制应用提供了广阔的应用前景。以下是TMS320F28034 PWM应用前景的一些方面:
电机控制:TMS320F28034广泛用于各种电机控制应用,如直流电机、步进电机和交流电机控制。其灵活的PWM模块和丰富的控制功能使其成为控制电机速度、位置和转矩的理想选择。
逆变器控制:在可再生能源领域,如太阳能和风能转换系统中,TMS320F28034可用于控制逆变器以将直流电转换为交流电。PWM模块的高分辨率和灵活性可以实现高效的能量转换。
电源管理:TMS320F28034可用于电源转换器的控制,如开关电源、直流-直流转换器和直流-交流逆变器。通过PWM模块的精确控制,可以提高系统效率并降低能量损耗。
照明控制:在LED照明系统中,TMS320F28034可以实现PWM调光控制和颜色控制。其高精度的PWM输出可以实现平滑的亮度调节和色彩混合。
电力电子:在电力电子领域,TMS320F28034可用于控制各种功率半导体器件,如MOSFET和IGBT。通过PWM模块的灵活配置,可以实现高效的功率转换和电力控制。
工业自动化:TMS320F28034适用于工业自动化领域,如机器人控制、运动控制和过程控制。其快速的实时控制能力和丰富的通信接口使其成为工业应用的理想选择。
总的来说,TMS320F28034的PWM模块具有强大的功能和灵活性,适用于多种实时控制应用。随着数字控制技术的不断发展,TMS320F28034在各种领域都有着广阔的应用前景,并可以帮助工程师实现复杂控制算法和高效能量转换。