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

news2024/9/20 18:37:57

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;
    //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文件,形成工程框架,软件工程如下所示。

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

工程代码:

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

*/

#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数据全清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:
    

*/

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

*/

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

*/

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

*/

#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.coloradmin.cn/o/1995590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV图像滤波(9)getGaussianKernel()函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 cv::getGaussianKernel() 是 OpenCV 中的一个函数&#xff0c;用于生成一维高斯核。这种核通常用于实现高斯模糊滤波器&#xff0c;该滤波器可以…

系统编程 day6 文件5

今天编写小程序实现minishell&#xff08;简易版文件操作命令函数编写以及实现&#xff09; 编写过程&#xff0c;以及部分代码展示 终端实现minishell部分功能展示

fastadmin 实现标签打印

项目场景如图&#xff0c;需要打印一批条形码或者二维码&#xff0c;除了市面上成熟的标签机之外&#xff0c;今天挑战一下使用普通的打印机不干胶贴纸&#xff0c;实现低成本的标签打印&#xff1b; 项目框架基于 fastadmin&#xff1a; 1、项目对应的js添加打印按钮的事件监…

C语言指针详解-包过系列(二)目录版

C语言指针详解-包过系列&#xff08;二&#xff09;目录版 1、数组名的深入理解1.1、数组名的本质1.2、数组名本质的两个例外1.2.1、sizeof&#xff08;数组名&#xff09;1.2.2、&数组名 2、使用指针访问数组3、一维数组传参本质4、二级指针4.1、二级指针介绍4.2、二级指针…

5个国内大厂的AI写真神器,连影楼老板都在用!看看你用过几个

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 如果你的女朋友再缠着你&#xff0c;要你陪她去拍写真&#x…

kickstart自动脚本制作

克隆7主机&#xff0c;配置网络 安装图形 yum group install "Server with GUI" -y 有的话直接切换 init 5 关闭 Vmware dhcp 安装图形化生成kickstar自动安装脚本的工具 yum install system-config-kickstart -y 配置http 安装 yum install httpd -y 启动服务…

Advanced IP Scanner - 网络扫描工具介绍

Advanced IP Scanner 是一款免费、快速且用户友好的网络扫描工具。它能够帮助用户扫描局域网&#xff08;LAN&#xff09;中的所有设备&#xff0c;提供详细的设备信息&#xff0c;包括IP地址、MAC地址、设备名称和厂商信息。该工具对IT管理员和普通用户都非常有用&#xff0c;…

CMake内置模块

2024年8月9日&#xff0c;周五晚上 很久没写博客了&#xff0c;主要是最近很长一段时间都在备考研究生 简介 CMake附带了一系列内置模块&#xff0c;这些模块提供了许多常用的功能和宏&#xff0c;以帮助用户在构建项目时完成各种任务。 CMake的内置模块有哪些&#xff1f; …

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

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

springboot中小型酒店管理系统02793

摘要 随着互联网和移动技术的快速发展&#xff0c;酒店行业也面临着巨大的变革和机遇。传统的酒店管理方式存在着信息不透明、预订流程繁琐等问题&#xff0c;无法满足现代消费者对便捷、高效、个性化服务的需求。因此&#xff0c;开发中小型酒店管理系统具有重要的意义。本文旨…

[论文阅读]Mobility-Aware Cooperative Caching in VEC Based on CAFR

论文&#xff1a;Mobility-Aware Cooperative Caching in Vehicular Edge Computing Based on Asynchronous Federated and DRL JSTSP 2022 基于异步联邦和深度强化学习的车载边缘计算移动感知协同缓存 一、Introduction background&#xff1a; 随着车联网&#xff08;IoV&…

数据结构--单链

#include "link.h" plink get_head() { plink pmalloc(sizeof(Link)); if(pNULL) { printf("申情节点失败\n"); return NULL; } p->len0; p->nextNULL; return p; } void head_insert(plink L,int a) {…

AI动漫生成工具,文生图转换图生视频功能,低成本使用AI工具做项目。AI工具搭建开发。

目录 前言&#xff1a; 一、AI文生动漫有哪些功能&#xff1f; 二、如何低价使用AI工具&#xff1f; 三、AI工具适合现在做哪些互联网项目&#xff1f; 总结&#xff1a; 前言&#xff1a; AI动漫原理就是通过文字描述来生成图片&#xff0c;然后对文本配上语音和音乐生成…

[极客大挑战 2019]FinalSQL1

打开题目 sql注入&#xff0c;点击1试一下 点击2试一下 点击3试一下 点击4 点击5 id6试一下 感觉是sql盲注了 编写脚本 import requests import string from time import sleep url "http://9da9cb18-3096-413a-9476-8a177ffec31a.node4.buuoj.cn:81/search.php?id0^(…

陶瓷材质的防静电架空地板越来越受欢迎的原因

目前市面上的陶瓷防静电架空地板主要分为两种&#xff1a;钢基和硫酸钙基。前者是以全钢冲孔裸板作为板基&#xff0c;经粘接、固定整型和灌浆的方式加工而成&#xff0c;后者是以复合硫酸钙板为基材&#xff0c;表面粘接防静电陶瓷砖&#xff0c;四周导电PVC边条封边。近年来陶…

【网络】套接字socket编程预备知识

1.源IP地址和目的IP 计算机网络中的源地址和目的地址是用来标识网络中的不同主机的。 源地址是指发送数据包的主机的地址&#xff0c;而目的地址则是指接收数据包的主机的地址&#xff0c;在数据包传输过程中&#xff0c;每经过一个路中器感交换机&#xff0c;都会根据目的地址…

乒乓球AI机器人赢了人类!正反手灵活转换,擦网球高球都能接,专业教练:达到中级选手水平

巴黎奥运会乒乓球团体赛如火如荼&#xff0c;谷歌机器人申请出战—— 首个达到人类竞技水平的机器人Agent发布&#xff01; 你看一个没留神&#xff0c;就赢了专业教练一个球&#xff01; 正反手快速转换&#xff0c;连续进攻也是不在话下~ 面对一些突发战术&#xff0c;比如…

在线办公小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;通知公告管理&#xff0c;员工管理&#xff0c;部门信息管理&#xff0c;职位信息管理&#xff0c;会议记录管理&#xff0c;待办事项管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首…

Swagger的介绍与使用(二)

一. 介绍( Spring Boot JDK 17 Swagger 3&#xff08;OpenAPI&#xff09;结合使用) 根据2024年当前环境来看&#xff0c; Spring Boot JDK 17 Swagger 3&#xff08;OpenAPI&#xff09;结合使用更加有趋势 将Spring Boot、JDK 17和Swagger 3&#xff08;OpenAPI&#xff…

xxl-job适配达梦数据库

参考资料&#xff1a; 【达梦数据库】从 Mysql 迁移到 DM8_从 mysql 移植到 dm Xxl-job适配达梦数据库 Xxl-job适配达梦数据库 按照这篇文章修改所有Mapper.xml文件&#xff0c;但是运行会报错。 按照下面的文章修改 XxlJobLogMapper.xml 如何将 XxlJob 集成达梦数据库_xx…