请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:LAUNCHXL-F28379D 工具/软件:
我有这个代码在每个计数器= 0时触发 ISR
对于此代码、我想添加 ADC 在 COUNTER =0时采样的条件。 任何人都可以帮助我添加这个 ADC 条件吗:
////包含的文件
//
#include "f28x_Project.h"
//// defines
//#define EPWM1_TIMER_TBPRD 1250 // PERIOD 寄存器
////函数原型//
void InitEPwm1Example (void);__interrupt void epwm1_isr (void);
// Main // void main (void)
{////// void)
第1步。 初始化系统控制:
// PLL、看门狗、启用外设时钟
//此示例函数位于 F2837xD/sysctrl.c 文件中。
//
InitSysCtrl();
////
步骤2。 初始化 GPIO:
//此示例函数位于 F2837xD/gpio.c 文件中
、并且//说明如何将 GPIO 设置为默认状态。
//
//// InitGpio ();
////
启用 PWM1、PWM2和 PWM3
//
cpuSysRegs.PCLKCR2.bit.EPWM1=1;
//对于这种情况、只初始化 ePWM1、ePWM2、ePWM3的 GPIO 引脚
//这些函数位于 F2837xD/ePWM.c 文件中//
InitEPwm1Gpio();
////步骤3。 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
DINT;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态是禁用所有 PIE 中断、并且标志
//被清除。
//此函数可在 F2837xD/PIECTRL.c 文件中找到。
//
InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;
////使用指向 shell 中断//
服务例程(ISR)的指针初始化 PIE 向量表。
//这将填充整个表、即使
此示例中未使用中断//。 这对于调试目的很有用。
// shell ISR 例程位于 F2837xD/DefaultIsr.c 中
。//此函数位于 F2837xD/PieVect.c 中
。//
InitPieVectTable ();
//
//本示例中使用的中断重新映射
到此文件中的// ISR 函数。
//
EALLOW;//需要执行此操作才能写入受 EALLOW 保护的寄存器
PieVectTable.EPWM1_INT =&epwm1_isr;
EDIS;//需要执行此操作才能禁用对受 EALLOW 保护的寄存器
的写入////对于本例、仅初始化 EPWM
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
InitEPwm1Example();
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
////
步骤4。 用户特定代码、启用中断:
////////////
启用连接到 EPWM1-3的 CPU INT3 INT:
//
IER |= M_INT3;
//
在 PIE 中启用 EPWM INTn:组3中断1-3
//
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
//启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM ////
步骤5。 空闲环路。 只需坐下来并一直循环(可选):
//
for (;;)
{
ASM (" NOP");
}
}
////
epwm1_isr - EPWM1 isr
//
__interrupt void epwm1_isr (void)
{
//
//清除该计时器的 INT 标志
//
EPwm1Regs.ETCLR.bit.INT = 1;
//
//确认该中断可接收来自组3的更多中断
//
PieCtrlRegs.PIEACK.ALL = PIEACK_GROUP3;
}
//// InitEPwm1Example -初始化 EPWM1配置
//
void InitEPwm1Example()
{
//
//设置 TBCLK
//
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; //设置计时器周期801 TBCLK
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0
EPwm1Regs.TBCTR = 0x0000; //清除计数器
//
//设置比较值
//
EPwm1Regs.CMPA.bit.CMPA = EPWM1_TIMER_TBPRD/2;//设置比较 A 值
EPwm1Regs.CMPB.bit.CMPB = EPWM1_TIMER_TBPRD/2;//设置比较 B 值
//
//设置计数器模式
//
EPwm1Regs.TBCTL.BIT.CTRMODE = TB_COUNT_UPdown;//向上和向下计数
EPwm1Regs.TBCTL.BIT.PHSEN = TB_DISABLE; //禁用相位加载
EPwm1Regs.TBCTL.BIT.HSPCLKDIV = TB_DIV1; //时钟比与 SYSCLKOUT
EPwm1Regs.TBCTL.BIT.CLKDIV = TB_DIV1;
//
//设置重影
//
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
//设置操作
//
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; //在事件 A 启动时设置 PWM1A
//计数
EPwm1Regs.AQCTLA.bit.PRD = AQCLEAR; //清除事件 A 上的 PWM1A、
//向下计数
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; //在事件 A 启动时设置 PWM1A
//计数
EPwm1Regs.AQCTLB.bit.PRD = AQCLEAR; //清除事件 A 上的 PWM1A、
//向下计数
//
//中断、我们将在其中更改比较值
//
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //在发生零事件时选择 INT
EPwm1Regs.ETSEL.bit.intEn = 1; //启用 INT
EPwm1Regs.ETPS.bit.INTPRD = ET_1st; //在发生第3个事件时生成 INT
}
////文件结尾//