搜索

[方案相关] 关于HC32F460锯齿波硬件带死区互补PWM的设置

[复制链接]
83|5
 楼主 | 2020-10-16 14:10 | 显示全部楼层 |阅读模式
本帖最后由 nizhenyuchina 于 2020-10-16 14:13 编辑

imer4_oco_init_t  OcoInit;
  timer4_pwm_init_t  PwmInit;
  oco_low_ch_compare_mode_t   LowChCmpMode;
  oco_high_ch_compare_mode_t  HighChCmpMode;
  port_init_t               PortInit;
  irq_regi_conf_t           IrqRegiConf;
  MEM_ZERO_STRUCT( PortInit);
  MEM_ZERO_STRUCT( OcoInit);
  MEM_ZERO_STRUCT( PwmInit);
  //设置IO
  PortInit.enPinMode = Pin_Mode_Out;
  PortInit.enExInt = Disable;
  PortInit.enPullUp = Enable;
  PortInit.enPinOType = Pin_OType_Cmos;
  PORT_Init(PortB,Pin13, &PortInit);
  PORT_Init(PortA,Pin08, &PortInit);
  //使能外设时钟 60MHZ
  PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM41, Enable);
////////////////////////////////////////////////////////////
  //设置TIMER4定时器的计数器工作模式
  //控制状态寄存器 停止计数 且清零计数器
  TMR41->CCSR = 0x0050;
  TMR41->CNTR = 0x0000;
  TMR41->CPSR = 0xFFFF;
  TMR41->CVPR = 0x0000;
  //设置屏蔽的下溢中断个数
  TMR41->CVPR_f.ZIM = 0;
  //设置屏蔽的上溢中断个数
  TMR41->CVPR_f.PIM = 0;
  ////////////////////////////////////
  //控制状态寄存器
  TMR41->CCSR_f.STOP = 1u;
  //计数器时钟分频
  TMR41->CCSR_f.CKDIV = Timer4CntPclkDiv1;
  //锯齿波工作模式
  TMR41->CCSR_f.MODE =  Timer4CntSawtoothWave;
  TMR41->CCSR_f.BUFEN = Enable;
  TMR41->CCSR_f.ECKEN = 0;
  //下溢中断关闭
  TMR41->CCSR_f.IRQZEN  = Disable;
  //上溢中断关闭
  TMR41->CCSR_f.IRQPEN = Disable;
  ////////////////////////////////////////////
  //设定峰值(周期值)
  TMR41->CPSR = MinPeriodValue;
  //设定比较值
  TMR41->OCCRUL = (MinPeriodValue>>1);
  TMR41->OCCRUH = 120;//(MinPeriodValue>>1);
  //设置TIMER4通用扩展寄存器
  //////////////////////////////////////////////////////////////////
  //设置OCMR寄存器  计数器上下计数 上下溢点 OCCRH OCCRL数值的关系
  //计数器向下计数 & OCCRxl计数不匹配 & OCCRxh计数匹配 bit18 19
  TMR41->OCMRLUL_f.EOPNDCL = OcoOpOutputHold;//;
  //bit16 17
  TMR41->OCMRLUL_f.EOPNUCL = OcoOpOutputHold;
  //计数下溢 & OCCRxl计数不匹配 & OCCRxh计数匹配 bit31 B30
  TMR41->OCMRLUL_f.EOPNZRL = 0;//OcoOpOutputHold;
  // 计数下溢 & OCCRxl计数不匹配 & OCCRxh计数不匹配bit15 B14
  TMR41->OCMRLUL_f.OPNZRL  = OcoOpOutputLow;//OcoOpOutputHold;
  // 计数上溢 & OCCRxl计数不匹配 & OCCRxh计数匹配bit29 B28
  TMR41->OCMRLUL_f.EOPNPKL = OcoOpOutputHold;//
  // 计数上溢 & OCCRxl计数不匹配 & OCCRxh计数不匹配bit13 B12
  TMR41->OCMRLUL_f.OPNPKL  = OcoOpOutputLow;//
  //计数下溢 & OCCRxl计数匹配 & OCCRxh计数匹配 bit27 B26
  TMR41->OCMRLUL_f.EOPZRL  = OcoOpOutputHold;
  //计数下溢 & OCCRxl计数匹配 & OCCRxh计数不匹配bit11 B10
  TMR41->OCMRLUL_f.OPZRL  = OcoOpOutputHold;
  //计数器向上计数 & OCCRxl计数匹配 & OCCRxh计数匹配 bit25 B24
  TMR41->OCMRLUL_f.EOPUCL = OcoOpOutputHold;
  //计数器向上计数 & OCCRxl计数匹配 & OCCRxh计数不匹配bit9 B8
  TMR41->OCMRLUL_f.OPUCL = OcoOpOutputHigh;
  //计数上溢 & OCCRxl计数匹配 & OCCRxh计数匹配 bit23 22
  TMR41->OCMRLUL_f.EOPPKL = OcoOpOutputHold;
  //计数上溢 & OCCRxl计数匹配 & OCCRxh计数不匹配 bit7 B6
  TMR41->OCMRLUL_f.OPPKL = OcoOpOutputHold;
  //计数器向下计数 & OCCRxl计数匹配 & OCCRxh计数匹配 bit21 B20
  TMR41->OCMRLUL_f.EOPDCL = OcoOpOutputHold;
  //计数器向下计数 & OCCRxl计数匹配 & OCCRxh计数不匹配bit5 B4
  TMR41->OCMRLUL_f.OPDCL = OcoOpOutputHold;
  //计数下溢 & OCCRxl计数匹配  bit3
  TMR41->OCMRLUL_f.OCFZRL = OcoOpOutputHold;
  //计数器向上计数 & OCCRxl计数匹配 bit2
  TMR41->OCMRLUL_f.OCFUCL = OcoOpOutputHold;//OcoOcfSetOcoOpOutputHold;
  //计数上溢 & OCCRxl计数匹配  bit1
  TMR41->OCMRLUL_f.OCFPKL = OcoOpOutputHold;
  //计数器向下计数 & OCCRxl计数匹配 bit0
  TMR41->OCMRLUL_f.OCFDCL = OcoOpOutputHold;
  //////////////////////////////////////////////////////////////
  //设置OCMRxl设定的动作,OCCRxl OCCRxh 是否缓冲 和何时传送
  //禁止计数值与OCCRxl匹配条件的扩展控制功能 关闭
  TMR41->OCERU_f.MCECL =1;//0;
  //禁止计数值与OCCRxh匹配条件的扩展控制功能 关闭
  TMR41->OCERU_f.MCECH =1;//0;
  //周期间隔响应功能链接无效,OCMRxl的缓存传送由MLBUFEN设定决定
  TMR41->OCERU_f.LMML =0;
  TMR41->OCERU_f.LMMH =0;
  //周期间隔响应功能链接无效,OCCRxl的缓存传送由MLBUFEN设定决定
  TMR41->OCERU_f.LMCL = 0;
  TMR41->OCERU_f.LMCH = 0;
  //OCMRxl缓存寄存器的值直接写入OCMRxl
  TMR41->OCERU_f.MLBUFEN =0;
  //OCMRxh缓存寄存器的值直接写入OCMRxh
  TMR41->OCERU_f.MHBUFEN =0;
  //CCRxl缓存寄存器的值在计数上溢时写入OCCRxl
  TMR41->OCERU_f.CLBUFEN = 2;
  //CCRxh缓存寄存器的值在计数上溢时写入OCCRxh
  TMR41->OCERU_f.CHBUFEN = 2;
  //////////////////////////////////////////////////
  //通用控制状态寄存器
  TMR41->OCSRU_f.OCEH = Enable;
  TMR41->OCSRU_f.OCEL = Enable;
  //输出无效时端口状态
  TMR41->OCSRU_f.OCPH = 0;
  TMR41->OCSRU_f.OCPL = 0;
  //////////////////////////////////////////////
  //EMB 扩展控制寄存器
  TMR4_CR->ECER1_f.EMBVAL =2;//输出低电平
  //设置无效
  TMR41->ECSR_f.HOLD = 0;
  ///////////////////////////////////////////////
  //初始化PWM I/O口
  PORT_SetFunc(PortB, Pin13, Func_Tim4, Disable);
  PORT_SetFunc(PortA, Pin08, Func_Tim4, Disable);
  ////////////////////////////////////////////////////
  //设置PWM,死区定时器模式 时钟分频 输出极性
  TMR41->POCRU_f.DIVCK = 0 ;
  TMR41->POCRU_f.PWMMD = 1 ;
  TMR41->POCRU_f.LVLS  = 0 ;
  //
  EMB2->CTL_f.PWMSEL = 7;
  EMB2->CTL_f.OSCSTPEN =1;
  EMB2->CTL_f.INVSEL =1;
  EMB2->CTL_f.PORTINEN=1;
  //设定死区时间
  TMR41->PDBRU = DeadTime;
  TMR41->PDARU = DeadTime;
  //
  TMR41->PFSRU = 0;
///////////////////////////////////
  TMR41->CCSR_f.CLEAR = 1;
  TMR41->CCSR_f.STOP  = 0;
  //PWM_Off() ;
  EMB_SwBrake(EMB2, true);
唯一还有软件控制使能PWM的输出与关闭 没调试出来

123.gif

使用特权

评论回复
| 2020-10-16 14:44 | 显示全部楼层
谢谢分享【HC32F460锯齿波硬件带死区互补PWM的设置】

使用特权

评论回复
| 2020-10-16 16:39 | 显示全部楼层
F460的EMB模块与Timer4是一一对应的,4个EMB 模块分别对应于3个timer4和1个timer6,在timer4里面需要设置EMB信号有效的时候,PWM输出如何处理,然后EMB里面有个软件刹车功能,可以作为软件使能或者关闭PWM。

使用特权

评论回复
 楼主 | 2020-10-17 14:16 | 显示全部楼层
martinhu 发表于 2020-10-16 16:39
F460的EMB模块与Timer4是一一对应的,4个EMB 模块分别对应于3个timer4和1个timer6,在timer4里面需要设置EM ...

已实现,检查到了没有打开EMB模块

使用特权

评论回复
| 2020-10-17 22:59 | 显示全部楼层
EMB里面有个软件刹车功能,可以作为软件使能或者关闭PWM。这个和直接使能和关闭PWM的函数有什么区别呢?

使用特权

评论回复
| 2020-10-19 09:19 | 显示全部楼层
darklighttt 发表于 2020-10-17 22:59
EMB里面有个软件刹车功能,可以作为软件使能或者关闭PWM。这个和直接使能和关闭PWM的函数有什么区别呢? ...

EMB只是一句话关闭,比较简单和快

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表