CC2640定义一个周期性事件

1.Application events//定义一个时间
#define SP_EVT                          10
2.Clock instance for internal periodic events//定义一个时钟结构体变量
static Clock_Struct SP_clk;
3.Create one-shot clock event//开启这个时钟,1000代笔1秒
Util_constructClock(&SP_clk, SimplePeripheral_clockHandler,1000, 0, true,SP_EVT);

位置可以放在函数SimplePeripheral_processGapMessage里面,的case GAP_DEVICE_INIT_DONE_EVENT里面

static void SimplePeripheral_processGapMessage(gapEventHdr_t *pMsg)
{
  switch(pMsg->opcode)
  {
    case GAP_DEVICE_INIT_DONE_EVENT:

                     。。。。。
4.Handler function for clock timeouts.//在时间到了回调用clockHandler函数,在里面加入条件判断
static void SimplePeripheral_clockHandler(UArg arg){
    if (arg == SP_EVT)
    {
    // Send message to app
    SimplePeripheral_enqueueMsg(SP_EVT, NULL);
    }
}
5.Process an incoming callback from a profile.//其实上一部分就可以实现,
//只是如果把事件放入消息队列中,去执行更好
static void SimplePeripheral_processAppMsg(spEvt_t *pMsg){
    case SP_EVT:
      //-------------------------------
        Display_printf(dispHandle, 15, 0, "----%d--------",__LINE__);
        Util_startClock(&SP_clk);
      break;
    
}
6.Start Periodic Clock.
Util_startClock(&clkPeriodic);
这样就做到了循环

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于F28335的单极性SPWM的C语言代码示例: ```c #include "DSP2833x_Device.h" #include "DSP2833x_Examples.h" #define PWM_FREQ 20000 // PWM频率为20kHz #define PWM_TBPRD ((float)SYSCLK / (PWM_FREQ * 2)) // 计算PWM周期 void InitEPwm1(void) { EPwm1Regs.TBPRD = (int)(PWM_TBPRD - 1); // 设置PWM周期 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上下计数模式 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位补偿 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟不分频 EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 正常时钟不分频 EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 禁止同步输出 EPwm1Regs.CMPA.bit.CMPA = (int)(PWM_TBPRD / 2); // 设置占空比为50% EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子寄存器模式 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 寄存器加载计数器为0 EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 当计数器计数到CMPA时,EPWMxA引脚输出高电平 EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR; // 当计数器计数到0时,EPWMxA引脚输出低电平 } void InitEPwm2(void) { EPwm2Regs.TBPRD = (int)(PWM_TBPRD - 1); // 设置PWM周期 EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上下计数模式 EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位补偿 EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟不分频 EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 正常时钟不分频 EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 禁止同步输出 EPwm2Regs.CMPA.bit.CMPA = (int)(PWM_TBPRD / 2); // 设置占空比为50% EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 影子寄存器模式 EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 寄存器加载计数器为0 EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // 当计数器计数到CMPA时,EPWMxA引脚输出高电平 EPwm2Regs.AQCTLA.bit.ZRO = AQ_CLEAR; // 当计数器计数到0时,EPWMxA引脚输出低电平 } void SPWM(float Vref) { float Vmax = 3.3; // 电压最大值为3.3V float theta = 0; // 定义相位角theta float delta_theta = 2 * M_PI / 360; // 定义相位差delta_theta float Va, Vb, Vc; Va = Vmax * sin(theta); Vb = Vmax * sin(theta - 120 * M_PI / 180); Vc = Vmax * sin(theta + 120 * M_PI / 180); EPwm1Regs.CMPA.bit.CMPA = (int)(PWM_TBPRD * (Va / Vref) / 2); // 设置EPWM1的占空比 EPwm2Regs.CMPA.bit.CMPA = (int)(PWM_TBPRD * (Vb / Vref) / 2); // 设置EPWM2的占空比 EPwm3Regs.CMPA.bit.CMPA = (int)(PWM_TBPRD * (Vc / Vref) / 2); // 设置EPWM3的占空比 theta += delta_theta; // 更新相位角theta if (theta >= 2 * M_PI) { // 判断是否超过360度 theta = 0; } } void main(void) { InitSysCtrl(); // 初始化系统时钟 InitEPwm1(); // 初始化EPWM1 InitEPwm2(); // 初始化EPWM2 InitEPwm3(); // 初始化EPWM3 while (1) { SPWM(2); // 以2V的参考电压进行SPWM } } ``` 这个代码示例中,三个EPWM模块分别控制三个电路开关管的开关状态,以实现单极性SPWM。`SPWM()`函数根据当前相位角计算出三相电压,并将其转换为三个EPWM模块的占空比。主函数中不断调用`SPWM()`函数,以实现SPWM的连续输出。需要注意的是,该代码示例中的所有参数均为理论值,实际应用时需要根据具体的硬件参数进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值