LLC数字控制TMS320F28034,4-DSP的epwm配置介绍

LLC数字控制TMS320F28034,4-DSP的epwm配置介绍

  • 1 TMS320F28034
    • 1.1 概述
    • 1.2 PWM详细介绍
  • 2 TMS320F28034 PWM功能框图
    • 2.1 ePWM功能模块
    • 2.2 ePWM功能寄存器框图
  • 3 TMS320F28034 PWM初始化流程
  • 4 结合项目设计
  • 5 代码设计
    • 5.1 PWM初始化程序
    • 5.2 工程代码
  • 6 总结


配套代码示例

1 TMS320F28034

1.1 概述

TMS320F28034 的系统时钟即为其主频。根据第一节手册的介绍,该系统时钟的最大值为 60MHz。TMS320F28034是德州仪器(Texas Instruments)生产的一款数字信号处理器(DSP),主要用于控制应用中的脉宽调制(PWM)控制。它是C2000系列中的一员,专为实时控制应用设计。

1.2 PWM详细介绍

以下是TMS320F28034的PWM模块的一些详细介绍:

  1. PWM模块数量:TMS320F28034具有多个PWM模块,具体数量取决于具体型号,通常每个PWM模块包含多个独立的PWM通道。
  2. 分辨率:PWM模块通常具有可编程的分辨率,通常是12位或更高,这有助于实现高精度的PWM输出。
  3. 死区控制:PWM模块通常支持死区控制功能,这对于驱动功率半导体器件(如MOSFET或IGBT)时非常重要,可避免交叉导通。
  4. 相位补偿:PWM模块通常支持相位补偿功能,可以调整PWM波形的相位,对于一些应用中的同步要求很有帮助。
  5. 中断支持:PWM模块通常支持中断功能,可以在特定事件发生时触发中断,这在实时控制系统中非常有用。
  6. 死区时间:PWM模块通常允许用户配置死区时间,即两个PWM信号之间的延迟时间,以确保电路中的开关元件正常工作。
  7. 支持的PWM输出类型:PWM模块通常支持不同类型的PWM输出,如对称/非对称PWM、单极性/双极性PWM等。
  8. 保护功能: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初始化程序

注意看注释所解释内容。

void FunPwmInit(void)
{EALLOW;//120kHzEPwm1Regs.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_ALLEPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;// 上升沿延迟器输出端口不翻转,下升沿延迟器输出端口翻转,此处为设置PWMAB互补模式输出;EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//死区190*1/60MHzEPwm1Regs.DBFED = 190;//死区190*1/60MHzEPwm1Regs.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 eventEPwm1Regs.ETPS.bit.SOCAPRD  = 1;//TZ1 will be one shot signal for EPWM1EPwm1Regs.TZSEL.bit.OSHT1=TZ_DISABLE;//在逻辑控制时再打开//TZ will Force EPWM1A to a low stateEPwm1Regs.TZCTL.bit.TZA=TZ_FORCE_LO;//TZ will Force EPWM1B to a low stateEPwm1Regs.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文件,形成工程框架,软件工程如下所示。

配套代码示例
在这里插入图片描述

工程代码:

//Main.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 registersPieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE blockEDIS;    // 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){//计时200msdelay_ms(200);//指示灯的引脚状态进行反转LEDGTOGGLE();}
}

/*

  • includes.h
  • Created on: 2024年7月29日
  •  Author:
    

*/

#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:
    

*/

#include "includes.h"void FunGpioInit(void)
{GpioDataRegs.GPADAT.all = 0ul;GpioDataRegs.GPBDAT.all = 0ul;//GPIO初始化//开始寄存器配置前执行指令EALLOW;// GPIOA DATA数据全清0GpioDataRegs.GPADAT.all = 0ul;// GPIOB DATA数据全清0GpioDataRegs.GPBDAT.all = 0ul;//LED GGpioCtrlRegs.GPAMUX2.bit.GPIO24=0;GpioCtrlRegs.GPADIR.bit.GPIO24=1;//LED YGpioCtrlRegs.GPAMUX2.bit.GPIO21=0;GpioCtrlRegs.GPADIR.bit.GPIO21=1;//LED RGpioCtrlRegs.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:输出0GpioDataRegs.GPACLEAR.bit.GPIO0=1;// GPIO1 <-> EPWM1B == 1:输出0GpioDataRegs.GPACLEAR.bit.GPIO1=1;// COMP_OUT GPIO42 <-> OPP_COMP1_OUTGpioCtrlRegs.GPBMUX1.bit.GPIO42 = 3;// AI02<-> COPM1+ ==2:比较器功能GpioCtrlRegs.AIOMUX1.bit.AIO2 = 2;// GPIO15 <-> TZ1GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 1;//寄存器配置结束后执行指令EDIS;
}

/*

  • sys_gpio.h
  • Created on: 2024年7月30日
  •  Author:
    

*/

#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 =1extern void FunGpioInit(void);#endif /* APP_SYS_GPIO_H_ */

/*

  • sys_pwm.c
  • Created on: 2024年8月9日
  •  Author:
    

*/

#include "includes.h"void FunPwmInit(void)
{EALLOW;//120kHzEPwm1Regs.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_ALLEPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;// 上升沿延迟器输出端口不翻转,下升沿延迟器输出端口翻转,此处为设置PWMAB互补模式输出;EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//死区190*1/60MHzEPwm1Regs.DBFED = 190;//死区190*1/60MHzEPwm1Regs.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 eventEPwm1Regs.ETPS.bit.SOCAPRD  = 1;//TZ1 will be one shot signal for EPWM1EPwm1Regs.TZSEL.bit.OSHT1=TZ_DISABLE;//在逻辑控制时再打开//TZ will Force EPWM1A to a low stateEPwm1Regs.TZCTL.bit.TZA=TZ_FORCE_LO;//TZ will Force EPWM1B to a low stateEPwm1Regs.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:输出0GpioDataRegs.GPACLEAR.bit.GPIO0=1;// GPIO1 <-> EPWM1B == 1:输出0GpioDataRegs.GPACLEAR.bit.GPIO1=1;EDIS;
}

/*

  • sys_pwm.h
  • Created on: 2024年8月9日
  •  Author:
    

*/

#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:
    

*/

#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:代表1msConfigCpuTimer(&CpuTimer0,60,20);ConfigCpuTimer(&CpuTimer1,60,1000);StartCpuTimer0();StartCpuTimer1();PieVectTable.TINT0 = &CpuTimer0Isr;//往中断矢量表中填写定时器0一个指针PieVectTable.TINT1 = &CpuTimer1Isr;//往中断矢量表中填写定时器1一个指针//打开PIE组对应中断PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能第一组7通道定时器0IER |= M_INT1;  // Enable CPU INTIER |= M_INT13; //根据中断向量表使能定时器1EDIS;   // 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:
    

*/

#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在各种领域都有着广阔的应用前景,并可以帮助工程师实现复杂控制算法和高效能量转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/395448.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux/C 高级——shell脚本

1. shell脚本基础概念 1.1概念 shell使用方式&#xff1a;手动下命令和脚本 脚本本质是一个文件&#xff0c;文件里面存放的是特定格式的指令&#xff0c;系统可以使用脚本解析器翻译或解析指令并执行&#xff08;它不需要编译&#xff09;。 shell脚本本质&#xff1a;shell命…

中国信息学奥赛专用系统之----NOI Linux 2.0系统安装教程

1、下载NOI Linux 2.0系统&#xff0c;下载地址&#xff1a; https://noiresources.ccf.org.cn/ubuntu-noi-v2.0.iso 2、新建虚拟机 3、开机安装系统 下载插件&#xff0c;可能需要10分钟以上。 5、进系统看看 OK,NOI Linux 2.0系统安装完毕&#xff01;

【学习笔记】用线段树维护区间计数问题

前言 简单的区间计数问题可能直接推式子就行了。 但有些问题必须要数据结构维护。线段树就是一个比较好的处理区间的数据结构。 Gym102222L 思路 满足条件的区间特征&#xff1a; max ⁡ { a i } − min ⁡ { a i } 1 − c n t 0 \max\{a_i\}-\min\{a_i\}1-cnt0 max{ai​}…

解锁创意之门:如何使用DALL·E-3创作惊艳的图像

在这个视觉驱动的时代&#xff0c;图像已经成为表达创意和传递信息的重要媒介。最近&#xff0c;OpenAI发布了新一代的图像生成模型——DALLE-3&#xff0c;它以其卓越的生成能力和细致的图像质量迅速成为了创意工作者的热门工具。今天&#xff0c;我将带你一步步了解如何使用D…

13.3 正则表达式的应用

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

2024年6月scratch图形化编程等级考试三级真题

202406 青少年软件编程等级考试Scratch三级真题 试卷总分数&#xff1a;100分 考试时长&#xff1a;60 分钟 第 1 题 运行程序后&#xff0c;角色的x坐标是&#xff1f;&#xff08; &#xff09; A&#xff1a;99 B&#xff1a;100 C&#xff1a;199 D&#xff1a;200 正…

矩阵的导数运算

1. 标量方程对向量的导数 一维方程f(y)求极值即求导,令 二维方程f(y1,y2)求极值即求偏导,令 如果一个标量方程f(y1,y2,...ym)有m个自变量,求取它的极值就需要求取m组的方程组。当然可以用一种简洁的方式来表达它,比如二维方程f(y1,y2)可以把其中的变量写成向量的形式,此…

指针基础知识(笔记)

文章目录 1. 概念理解2. 空指针和野指针3. 计算4. 小结5. size_t6. 案例一: 指针查找并返回指定元素索引7. 指针访问多维数组(涉及 int (*ptr)[3]解析)8. 指针数组9. 函数的值传递与地址引用传递① 函数的值传递(pass by value)② 地址传递(pass by reference) 10. 案例二&…

C语言宠物系统

功能有增加宠物信息&#xff0c;显示宠物信息&#xff0c;删除宠物信息&#xff0c;修改功能和排序功能&#xff0c;可以选择姓名排序&#xff0c;年龄排序&#xff0c;价格排序。进阶的功能有文件操作&#xff0c;动态内存开辟。。 test.c源文件 #include "Pet.h"v…

机器人帮助文档

文章目录 机器交流使用群使用图例1. 查看机器人使用文档2. 直接问问题&#xff08;系统默认AI&#xff09;3. 系统默认AI切换4. 直接问问题&#xff08;指定讯飞星火AI&#xff09;5. 直接问问题&#xff08;指定百度文心AI&#xff09;6. 直接问问题&#xff08;指定谷歌AI&am…

代码随想录算法训练营Day34 | 62.不同路径 | 63. 不同路径 II | 343.整数拆分 | 96.不同的二叉搜索树

今日任务 62.不同路径 题目链接&#xff1a; https://leetcode.cn/problems/unique-paths/description/题目描述&#xff1a; Code class Solution { public:int uniquePaths(int m, int n) {// vector<vector<int>> memo(m, vector<int>(n, -1));// fu…

从0开始的1panel搭配雷池社区版保护网站

1.安装1panel 使用默认安装地址&#xff1a;/opt [1Panel Log]: 外网地址: http://xxxxx:35628/dc54fe6a54 [1Panel Log]: 内网地址: http://10.0.4.3:35628/dc54fe6a54 [1Panel Log]: 面板用户: root [1Panel Log]: 面板密码: xxxxx 安装完成第一次登陆 安装openresty&…

【原创】springboot+mysql法律咨询网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

初学51单片机1602液晶时序图实例分析

上篇博文笔者分享了关于液晶1602基本的工作流程&#xff0c;本篇主要是通过逻辑分析仪来看一下程序使能的电平时序&#xff0c;是否符合产品文档给出 的时序逻辑。 先看一下1602的时序图 认识下时序图中各个标识的含义&#xff1a; Tc信号周期&#xff08;E Cycle Time&#x…

【解压既玩】PS3模拟器v0.0.32+战神3+战神升天+各存档 整合包 ,完美不死机,没有BUG,旷世神作,强力推荐

战神3是圣莫尼卡公司的大作&#xff0c;PS3 上必玩的游戏之一。 本文收集了战神3和升天两作&#xff0c;附存档&#xff0c;完美不死机&#xff0c;没有BUG&#xff0c;强烈推荐。 解压即玩。 立即下载&#xff1a;【chumenx.com】【解压既玩】PS3模拟器v0.0.32战神3战神升天…

Docker数据管理,数据卷,容器服务器数据卷

一、容器的数据管理介绍 1.1 Docker容器分层 Docker镜像由多个只读层叠加而成&#xff0c;启动容器时&#xff0c;Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的文件&#xff0c;那该文件将会从读写层下面的只读层复制到…

Redis相关面试题(二)

一、Bit中不同命令使用的场景 二、什么是缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩&#xff1f; 缓存击穿&#xff1a;是指当某一个key的缓存过期时大并发量的请求同时访问key&#xff0c;瞬间击穿服务器直接访问到数据库&#xff0c;使得数据库处于负载情况 缓存穿透…

mysql8.4.2数据库做主从复制

linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包-CSDN博客文章浏览阅读472次&#xff0c;点赞7次&#xff0c;收藏4次。linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包https://blog.csdn.net/xikui1551/article/de…

C++的深拷贝和浅拷贝

浅拷贝是一种简单的拷贝方式&#xff0c;仅仅是复制对象的基本类型成员和指针成员的值&#xff0c;而不复制指针所指向的内存。这可能会导致两个对象共享相同的资源&#xff0c;从而引发潜在的问题&#xff0c;如内存泄漏、意外修改共享资源等。一般来说编译器默认帮我们实现的…

Openwrt配置ZeroTier,实现公网访问内网中服务器

ZeroTier注册&Openwrt初始配置 首先来到Openwrt的VPN→ZeroTier页面&#xff0c;进行一个很简单的注册 注册后去zerotier的网页管理页面进行一个很简单的创建网络 复制网络ID备用 在openwrt填写网络ID并启用。如果你需要访问内网主机勾上 自动客户端NAT 在zerotier网络管理…