[APM32F1] 依据手册推导APM32F103ZE的高级定时器的死区计算方法

[复制链接]
 楼主| zjh20070904 发表于 2022-6-18 10:16 | 显示全部楼层 |阅读模式
本帖最后由 zjh20070904 于 2022-6-18 10:19 编辑

1 概述
高级定时器有个死区控制功能,依据手册配置想要的死区时间时比较麻烦,于是依据手册自己总结了配置死区时间的计算方法。

2 计配置DTS寄存器的计算方法2.1 关键寄存器描述
1.png


2.png


2.2 计算方法
1)依据死区时间确定范围
对于CLKDIV配置为00TMR1的时钟分别为8M72MHz时,对应的死区配置范围是:
DTS[7:0]数值范围
计算死区范围公式
8MHz系统时钟
72MHz系统时钟
0
127
DTS[7:0]*TDTS
0ns
15875ns
0ns
1763.8ns
128
191
(DTS-128+64)*TDTS*2
16us
31.75us
1.77us
3.527us
192
223
(DTS-192+32)*TDTS*8
32us
63us
3.55us
7us
224
255
(DTS-224+32)*TDTS*16
64us
126us
7.11us
14.33us

其中TDTS=CKD/TMR1_CLK

2)依据死区时间范围代入对应的公式计算要配置的寄存器数值



3 应用案例
代码中的时钟关系如下
1)系统时钟为72MHz
2APB2的时钟未分频即72MHz
3TMR1挂接在APB2总线上,且时钟分频系数CLKDIV为00,因此TMR1的时钟为72MHz
4CLKDIV默认配置为:00


3.1 TMR1_BDT_ConfigStruc.deadTime=36
配置说明
PWM波形
无死区配置的波形
3.png
死区配置参数:36
4.png
死区时间
500ns



3.2 TMR1_BDT_ConfigStruc.deadTime=(72+128-64)
配置说明
PWM波形
无死区配置的波形
5.png
死区配置参数:72+128-64
6.png
死区时间
2us




3.3 TMR1_BDT_ConfigStruc.deadTime=(36+192-32)
配置说明
PWM波形
无死区配置的波形
7.png
死区配置参数:36+192-32
8.png
死区时间
4us




3.4 TMR1_BDT_ConfigStruc.deadTime=(36+224-32)
配置说明
PWM波形
无死区配置的波形
9.png
死区配置参数:36+224-32
10.png
死区时间
8us




3.5 CLKDIV对死区的影响
配置说明
PWM波形
CLKDIV:00
11.png
死区时间:4us
CLKDIV:01
12.png
死区时间:8us




4 应用案例代码
  1. int main(void)
  2. {
  3.     GPIO_Config_T GPIO_ConfigStruct;
  4.     TMR_BaseConfig_T TMR_TimeBaseStruct;
  5.     TMR_OCConfig_T OCcongigStruct;
  6.         TMR_BDTConfig_T TMR1_BDT_ConfigStruc;
  7.         
  8.     RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_TMR1 | RCM_APB2_PERIPH_GPIOB));

  9.     GPIO_ConfigStruct.pin = GPIO_PIN_13;
  10.     GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
  11.     GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
  12.     GPIO_Config(GPIOB, &GPIO_ConfigStruct);

  13.     GPIO_ConfigStruct.pin = GPIO_PIN_8;
  14.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);

  15.     TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_2;
  16.     TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
  17.         TMR_TimeBaseStruct.division =72-1;        
  18.     TMR_TimeBaseStruct.period = 40-1;
  19.     TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);
  20.         
  21.     OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;
  22.     OCcongigStruct.mode = TMR_OC_MODE_PWM1;
  23.     OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;
  24.     OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;
  25.     OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;
  26.     OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;
  27.     OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;
  28.     OCcongigStruct.pulse =16;
  29.     TMR_ConfigOC1(TMR1, &OCcongigStruct);
  30.         
  31.         
  32.         
  33.         TMR1_BDT_ConfigStruc.RMOS=TMR_RMOS_STATE_DISABLE;
  34.         TMR1_BDT_ConfigStruc.IMOS=TMR_IMOS_STATE_ENABLE;
  35.         TMR1_BDT_ConfigStruc.lockLevel=TMR_LOCK_LEVEL_OFF;
  36.         TMR1_BDT_ConfigStruc.deadTime=(36+192-32);
  37.         TMR1_BDT_ConfigStruc.BRKState=TMR_BRK_STATE_DISABLE;
  38.         TMR1_BDT_ConfigStruc.BRKPolarity=TMR_BRK_POLARITY_LOW;
  39.         TMR1_BDT_ConfigStruc.automaticOutput=TMR_AUTOMATIC_OUTPUT_DISABLE;
  40.         TMR_ConfigBDT(TMR1,&TMR1_BDT_ConfigStruc);

  41.     TMR_ConfigOC1Preload(TMR1, TMR_OC_PRELOAD_ENABLE);
  42.     TMR_EnableAutoReload(TMR1);
  43.                
  44.     TMR_Enable(TMR1);
  45.         TMR_EnablePWMOutputs(TMR1);
  46.         
  47.     while(1)
  48.     {
  49.     }
  50. }



麻花油条 发表于 2022-9-7 16:59 来自手机 | 显示全部楼层
厉害啊,给你一个大大的赞
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:极海半导体
简介:珠海极海半导体有限公司是一家致力于开发工业级/车规级微控制器、模拟与混合信号IC及系统级芯片的集成电路设计型企业。极海团队拥有20年集成电路设计经验和嵌入式系统开发能力,可为客户提供核心可靠的芯片产品及方案,实现准确感应、安全传输和实时控制,助力客户在智慧家居、高端消费电子、工业控制、汽车电子、智慧能源以及通信设施等领域的拓展创新。

29

主题

68

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
认证:极海半导体
简介:珠海极海半导体有限公司是一家致力于开发工业级/车规级微控制器、模拟与混合信号IC及系统级芯片的集成电路设计型企业。极海团队拥有20年集成电路设计经验和嵌入式系统开发能力,可为客户提供核心可靠的芯片产品及方案,实现准确感应、安全传输和实时控制,助力客户在智慧家居、高端消费电子、工业控制、汽车电子、智慧能源以及通信设施等领域的拓展创新。

29

主题

68

帖子

0

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