Thread:sysconfig, C2000WARE中讨论的其它部件
我有几个关于ePWM属性的后续问题。
ePWM中断例程的默认时钟速度是多少? 您能否向我指出一项资源,用于计算实施1.44万 Hz切换频率所需选择的theta增量?
示例2 ePWM_Updom_AQ使用compAValue更新CMPA寄存器,compAValue递增至1950,递减至50。 为什么2000被视为100 % 占空比?
我一直在尝试使用theta值数组,这些值在每个中断上交替变化,采用它们的正弦,然后乘以compAValue,以生成不同的占空比。
这是我目前为止的代码副本,我非常感谢他们的帮助。
//#######################################################################
//
//文件:ePWM_ex2_upding_aq.c
//
//标题:ePWM Action Qualifier Module - Using up / down count (ePWM操作限定器模块-使用向上/向下计数)。
//
//! \addtogroup driver_example_list
//! <H1>ePWM向上计数操作限定符</H1>
//!
//! 此示例将ePWM1,ePWM2,ePWM3配置为使用生成波形
//! ePWMxA和ePWMxB上的独立调制。
//!
//! 比较值CMPA和CMBB在ePWM的ISR内进行了修改。
//!
//! 对于本示例,TB计数器处于上升/下降计数模式。
//!
//! 查看ePWM1A/B (GPIO0和GPIO1),ePWM2A/B (GPIO2和GPIO3)
//! 和ePWM3A/B (GPIO4和GPIO5)波形在示波器上。
//
//#######################################################################
//
//
//$Copyright:
//版权所有(C) 2022 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,无论是否使用
//修改,但前提是满足以下条件
//满足:
//
//重新分发源代码必须保留上述版权
//注意,此条件列表和以下免责声明。
//
//以二进制形式重新分发必须复制上述版权
//注意,此条件列表和中的以下免责声明
//随提供的文档和/或其他材料
//分发。
//
//既不是德州仪器(TI)公司的名称,也不是的名称
//其贡献者可用于支持或促销衍生产品
//未经特定的事先书面许可。
//
//本软件由版权所有者和贡献者提供
//“按原样”和任何明示或暗示的担保,包括但不包括
//仅限于适销性和适用性的暗示担保
//不承担特定目的。 在任何情况下,版权都不应享有
//所有者或贡献者对任何直接,间接,附带,
//特殊,典型或后果性损害(包括但不包括
//仅限于采购替代货物或服务;无法使用,
//数据或利润;或业务中断)
//责任理论,无论是合同,严格责任还是侵权行为
//(包括疏忽或其他)因使用而产生的任何问题
//此软件的任何版本,即使已被告知可能会造成此类损坏。
//$
//#######################################################################
//
//包含的文件
//
#include "driverlib.h"
包含"device.h"
包含"board.h"
//
//定义
//
#define EPWM1_TIMER_TBPRD 2000U
#define EPWM1_MAX_CMPA 1950U
#define EPWM1_MIN_CMPA 50U
#define EPWM2_TIMER_TBPRD 2000U
#define EPWM2_MAX_CMPA 1950U
#define EPWM2_MIN_CMPA 50U
#define EPWM3_TIMER_TBPRD 2000U
#define EPWM3_MAX_CMPA 1950U
#define EPWM3_MIN_CMPA 50U
#define ePWM_CMP_UP 1u
#define ePWM_CMP_DOWN 0U
//
//全局
//
typedef结构
{
UINT32_t epwmModule;
UINT16_t epwmCompA方向;
uINT16_t epwmTimerIntCount;
UINT16_t epwmMaxCompA;
UINT16_t epwmMinCompA;
} epwmInformation;
//
//全局值以保存本示例中使用的ePWM信息
//
epwmInformation epwm1Info;
epwmInformation epwm2Info;
epwmInformation epwm3Info;
//
//函数原型
//
void initEPWM1(void);
void initEPWM2(void);
void initEPWM3(void);
__interrupt void epwm1ISR(void);
__interrupt void epwm2ISR(void);
__interrupt void epwm3ISR(void);
void updateCompare(epwmInformation *epwmInfo);
//
//主菜单
//
Void主(void)
{
//
//初始化设备时钟和外围设备
//
device_init();
//
//禁用引脚锁并启用内部上拉。
//
DEVICE_INITGPIO ();
//
//初始化饼图和清除饼图寄存器。 禁用CPU中断。
//
interrup_initModule();
//
//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//
interrupT_initVectorTable();
//
//将中断服务例程分配给ePWM中断
//
中断注册(INT_EPWM1,&epwm1ISR);
中断注册(INT_EPWM2,&epwm2ISR);
中断注册(INT_EPWM3,&epwm3ISR);
//
//禁用同步(同时冻结时钟至PWM)
//
sysctl_disablePeripheral (sysctl_Periph_CLK_TBCLKSYNC);
//
//将GPIO0/1,GPIO2/3和GPIO4/5配置为ePWM1A/1B,ePWM2A/2B和
// ePWM3A/3B引脚
//配置ePWM模块
//
Board_init();
initEPWM1();
initEPWM2();
initEPWM3();
//
//启用与PWM的同步和时钟
//
sysctl_enablePeripheral (sysctl_Periph_CLK_TBCLKSYNC);
//
//启用ePWM中断
//
INTERRUL_ENABLE (INT_EPWM1);
INTERRUL_ENABLE (INT_EPWM2);
中断启用(INT_EPWM3);
//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;
//
//空闲循环。 只需坐下来永远循环(可选):
//
对于(;;)
{
NOP;
}
}
//
// epwm1ISR - ePWM 1 ISR
//
__interrupt void epwm1ISR(void)
{
//
//更新CMPA和CMBB值
//
更新比较(&epwm1Info);
//
//清除此计时器的INT标志
//
ePWM_clearEventTriggerInterruptFlag (myEPWM1_base);
//
//确认中断组
//
interrupT_clearACKGroup(interrupT_ACK_Group3);
}
//
// epwm2ISR - ePWM 2 ISR
//
__interrupt void epwm2ISR(void)
{
//
//更新CMPA和CMBB值
//
更新比较(&epwm2Info);
//
//清除此计时器的INT标志
//
ePWM_clearEventTriggerInterruptFlag (myEPWM2_base);
//
//确认中断组
//
interrupT_clearACKGroup(interrupT_ACK_Group3);
}
//
// epwm3ISR - ePWM 3 ISR
//
__interrupt void epwm3ISR(void)
{
//
//更新CMPA和CMBB值
//
更新比较(&epwm3Info);
//
//清除此计时器的INT标志
//
ePWM_clearEventTriggerInterruptFlag (myEPWM3_base);
//
//确认中断组
//
interrupT_clearACKGroup(interrupT_ACK_Group3);
}
//
// initEPWM1 -配置ePWM1
//
void initEPWM1()
{
//
//此示例用于跟踪方向的信息
// CMPA/CMPB值正在移动,最小和最大允许值和
//指向正确ePWM寄存器的指针
//
epwm1Info.epwmCompADirection = ePWM_CMP_UP;
epwm1Info.epwmTimerIntCount = 0U;
epwm1Info.epwmModule = myEPWM1_base;
epwm1Info.epwmMaxCompA = EPWM1_MAX_CMPA;
epwm1Info.epwmMinCompA = EPWM1_MIN_CMPA;
}
//
// initEPWM2 -配置ePWM2
//
void initEPWM2()
{
//
//此示例用于跟踪方向的信息
// CMPA/CMPB值正在移动,最小和最大允许值和
//指向正确ePWM寄存器的指针
//
epwm2Info.epwmCompADirection = ePWM_CMP_UP;
epwm2Info.epwmTimerIntCount = 0U;
epwm2Info.epwmModule = myEPWM2_base;
epwm2Info.epwmMaxCompA = EPWM2_MAX_CMPA;
epwm2Info.epwmMinCompA = EPWM2_MIN_CMPA;
}
//
// initEPWM3 -配置ePWM3
//
void initEPWM3(void)
{
//
//此示例用于跟踪方向的信息
// CMPA/CMPB值正在移动,最小和最大允许值和
//指向正确ePWM寄存器的指针
//
epwm3Info.epwmCompADirection = ePWM_CMP_UP;
epwm3Info.epwmTimerIntCount = 0U;
epwm3Info.epwmModule = myEPWM3_base;
epwm3Info.epwmMaxCompA = EPWM3_MAX_CMPA;
epwm3Info.epwmMinCompA = EPWM3_MIN_CMPA;
}
//
// updateCompare -用于更新频率的功能
//
void updateCompare(epwmInformation *epwmInfo)
{
UINT16_t compAValue;
Float32_t theta[6]={0},0.31.4159万 ,0.62.8319万 ,0.94.2478万 ,1.2.5664万 , 1.5708 ;
float32_t x;
UINT16_t计数= 0;
compAValue = ePWM_getCounterCompareValue(epwmInfo->epwmModule,
ePWM_counter_compare_a);
//
//每隔10次中断更改CMPA/CMPB值。
//
IF (epwmInfo->epwmTimerIntCount == 10U)
{
epwmInfo->epwmTimerIntCount = 0U;
//
//如果我们增加CMPA,请检查我们是否达到了最大值
//值。 如果不是,则增加CMPA,否则更改方向并减小
// CMPA
//
x = sin (theta[count]);
IF (epwmInfo->epwmCompADirection == ePWM_CMP_UP)
{
IF (compAValue <(epwmInfo->epwmMaxCompA))
{
ePWM_setCounterCompareValue(epwmInfo->epwmModule,
ePWM_counter_compare_A,
++compAValue*x);
COUNT++;
}
否则
{
epwmInfo->epwmCompADirection = ePWM_CMP_DOWN;
ePWM_setCounterCompareValue(epwmInfo->epwmModule,
ePWM_counter_compare_A,
--compAValue*x);
计数--;
}
}
//
//如果降低CMPA,请检查是否达到了最小值
//值。 如果不是,则降低CMPA,否则,更改方向并增加
// CMPA
//
否则
{
IF( compAValue ==(epwmInfo->epwmMinCompA))
{
epwmInfo->epwmCompADirection = ePWM_CMP_UP;
ePWM_setCounterCompareValue(epwmInfo->epwmModule,
ePWM_counter_compare_A,
++compAValue*x);
COUNT++;
}
否则
{
ePWM_setCounterCompareValue(epwmInfo->epwmModule,
ePWM_counter_compare_A,
--compAValue*x);
计数--;
}
}
}
否则
{
epwmInfo->epwmTimerIntCount++;
}
}