发新帖我要提问
12
返回列表
打印
[其他ST产品]

STM32CubeIde中互补PWM配置项的详细解读

[复制链接]
楼主: qn7a12
手机看帖
扫描二维码
随时随地手机跟帖
21
qn7a12|  楼主 | 2023-12-26 12:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
BPK Filter
对输入信号进行滤波的滤波因子

BPK Source Configuration
数字输入使能,可以使用数字信号触发

Break_IO mode selection
选择Input,break引脚只可作为输入;选择Bidirectional,break引脚既可以作为break源输入信号,也可以作为mcu产生break后的输出信号。一般选择input即可。

Digital Input Polarity:

0:TIMx_BKIN输入极性不反转(如果BKP为0,低电平激活,如果BKP = 1,高电平激活)

1:TIMx_BKIN输入极性反转(如果BKP = 0,高电平激活,如果BKP = 1,低电平激活)

为触发Bidirectional,有效极性必须设置为低有效,通过BPK和BPIN联合配置可设置。

使用特权

评论回复
22
qn7a12|  楼主 | 2023-12-26 12:40 | 只看该作者
Dead Time(死区时间) 上面的参考资料已经说的很清楚了,这里对配置项进行一个简单归纳

Automatic Output State
位 AOE 是自动输出使能位,如果使能 AOE 位, 那么在我们输入刹车信号后再断开了刹车信号,互补的 PWM 会自动恢复输出,如果不使能 AOE 位,那么在输入刹车信号后再断开了刹车信号,互补的 PWM 就不会恢复输出,而是一直保持刹车信号输入时的状态。一般我们使能该位。

OSSR
OSSR不使能,当互补输出正反两路的一路使能输出而另一路没有使能输出,没有使能输出的一路则输出半关闭高阻态,可以使用内部上下拉控制管脚状态。OSSR使能,当互补输出正反两路的一路使能输出而另一路没有使能输出,没有输出的一路则输出全关闭高阻态,内部上下拉无效。

OSSI
OSSI使能后,CH IDLE STATE和CHN IDLE STATE才有效,用于设定刹车后的管脚状态输出。OSSI不使能,刹车后的管脚输出半高阻态,这时候CH IDLE STATE和CHN IDLE STATE的设置无任何效果。

使用特权

评论回复
23
qn7a12|  楼主 | 2023-12-26 12:41 | 只看该作者
Lock Configuration
因为PWM常用于控制功率输出负载,如果出现异常STM32程序跑飞,导致配置的寄存器混乱,进一步导致PWM输出异常,则会造成风险。Lock Configuration使能后,会形成保护机制,简而言之就是MCU启动后,代码配置Lock保护级**,在下次重启前相关输出配置不能被修改。

有三个保护级别,Lock Level 3的保护级别最高。一般采用Lock Level 1即可,会在下次复位前冻结TIMx_BDTR 寄存器中的
DTG/BKE/BKP/AOE/BKF/BK2F/BK2E/BK2P 位,以及TIMx_CR2 寄存器中的OISx/OISxN位。

DeadTime Preload
死区时间预加载使能,使能则进行寄存器缓冲,不使能则不进行缓冲,一般设置为使能。

使用特权

评论回复
24
qn7a12|  楼主 | 2023-12-26 12:41 | 只看该作者
Dead Time
死区时间的设置,公式为

T_{Dead}=\frac{n}{f_{CKD}}

其中的CKD是通过计数器中的Internal Clock Division设置的,我们一般选择不分频,所以这里为170MHz,设置为17时,死区时间为100ns。

使用特权

评论回复
25
qn7a12|  楼主 | 2023-12-26 12:42 | 只看该作者
Asymmetrical DeadTime
死区时间对称使能。不使能:死区时间的上升沿和下降沿对称,时间相同。使能则设置下降沿时间,计算方法和死区时间相同,一般设置为不使能。

Clear Input 暂不清楚

使用特权

评论回复
26
qn7a12|  楼主 | 2023-12-26 12:42 | 只看该作者
PWM Generation

使用特权

评论回复
27
qn7a12|  楼主 | 2023-12-26 12:43 | 只看该作者
PWM Generation 模式1表示小于CCR时,PWM波输出有效电平;模式2表示大于CCR时,PWM输出有效电平。

使用特权

评论回复
28
qn7a12|  楼主 | 2023-12-26 12:43 | 只看该作者
Pulse
占空比设置,就是CCR寄存器的值,我们一般设置为0,在代码中用__HAL_TIM_SetCompare来设置占空比。

当计数模式为向上计数时,PWM输出图例如下,该图ARR=8,CCR不同时的PWM输出为tim_ocxref

使用特权

评论回复
29
qn7a12|  楼主 | 2023-12-26 12:43 | 只看该作者

使用特权

评论回复
30
qn7a12|  楼主 | 2023-12-26 12:44 | 只看该作者
占空比计算公式为

当计数模式为中心对齐时,PWM输出图例如下,该图ARR=8,CCR不同时的PWM输出为tim_ocxref

使用特权

评论回复
31
qn7a12|  楼主 | 2023-12-26 12:44 | 只看该作者
占空比计算公式为

当计数模式为中心对齐时,PWM输出图例如下,该图ARR=8,CCR不同时的PWM输出为tim_ocxref

使用特权

评论回复
32
qn7a12|  楼主 | 2023-12-26 12:44 | 只看该作者

使用特权

评论回复
33
qn7a12|  楼主 | 2023-12-26 12:45 | 只看该作者
Output compare preload
CCR寄存器的预装载使能,不使能不缓冲,使能需要寄存器缓冲。

Fast Mode
暂不清楚

CH\CHN Polarity
这个参数就是控制有效电平的,因为有一些芯片的处理需要的是高电平有效,一些是需要低电平有效,需要根据实际情况进行配置

CH\CHN idle Polarity
CH Idle State为该通道PWM不输出时的状态,与刹车配置有关。

Set为高电平;Reset为低电平。

使用特权

评论回复
34
qn7a12|  楼主 | 2023-12-26 12:45 | 只看该作者
代码实战

特别注意:由于我使用了break刹车并将刹车有效电平设为低电平,所以我们需要将刹车引脚置高才可以输出PWM波

使用特权

评论回复
35
qn7a12|  楼主 | 2023-12-26 12:45 | 只看该作者
这里我配置了一个输出引脚,将它与刹车引脚短接,并配置它的默认输出为高电平,这样一来,PWM默认可以输出,如果需要刹车,把该输出引脚置低,具体配置如下:

使用特权

评论回复
36
qn7a12|  楼主 | 2023-12-26 12:45 | 只看该作者
具体测试代码如下:
// 定义PWM周期时间
#define PWM_PERIOD TIM_CLK_MHz*1000000/PWM_FREQUENCY/2

// 6路互补PWM测试,放置到main函数的while循环前
// 生成占空比为20%的PWM波
void PWM_Test(void)
{
        HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
        HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
        HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);

        HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
        HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
        HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);

        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0.2*PWM_PERIOD);
        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0.2*PWM_PERIOD);
        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,0.2*PWM_PERIOD);
}

使用特权

评论回复
37
qn7a12|  楼主 | 2023-12-26 12:46 | 只看该作者
插入代码位置如下图

使用特权

评论回复
38
qn7a12|  楼主 | 2023-12-26 12:46 | 只看该作者
这样就生成了30KHz,占空比为20%,死区时间为100ns的PWM互补波了,如下图

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则