在使用STM32作为控制器去开发电机FOC的时候,往往需要配置三相互补PWM的死区时间,如何快速确认死区时间的范围和配置呢?

        (1)死区的概念:

        在STM32中死区时间是由 CKD[1:0] 和 DTG[7:0] 这两个寄存器共同决定,CKD其实就是由于给时钟进行二次分频的使用的。

        而DTG[7:0]是用于配置死区时间的计算值。

        (2)死区时间的计算:

          第一步:先计算Tdts = 1/Ft

        而这个Ft其实就是分频后的时钟频率。先明确你的定时器的时钟时钟输入大小,如下图所示,我的TIM1的时钟输入是170MHz,而Internal Clock Division CKD = No Division表示不分频,那么 Tdts = 1/170000000 = 5.88ns

        第二步:死区范围判断

        明确自己的需要配置的死区时间是否在寄存器配置的范围内,如果达不到,需要回到上一步对CKD[1:0]进行分频,下面是DTG[7:0]寄存器表示的死区范围。

        用你需要配置的死区时间去除以Tdts的值,比如我需要的死区大小是1us,Tdts = 1000/5.88 = 170左右,所以我的计算值是170左右。那么就是很快速明确了使用DTG[7:5] = 10x这个选项了。

        第三步:计算DT值(DT = 计算值/倍频值 - 范围值)

        这个计算值就是第而步计算出来的值,计算值 = 170。我需要的倍频值是2,范围值是64。所以我需要的DT = 170 / 2 - 64 = 21。

        第四步:利用计算器去计算Dead Time时间

        下面使用了逻辑分析仪去抓了一下死区时间,符合配置的大小。

        (3)三相互补PWM + ADC中断配置:

        下面开始解析一下一些与定时器配置相关的概念,个人认为还是很重要的,只有知道这些概念才能把需要的定时器模式配置好。

        3.1中心对齐模式:

                Center Aligned mode1对应着下溢出中断。

                Center Aligned mode2对应上溢出中断。

                Center Aligned mode3对应着上下溢出中断。

        3.2Repetition Counter(RCR):

                更新事件延后1周期。

        建议:在实际配置CubeMX的过程中要避免使用定时器的更新中断,我个人的建议是使用定时器的第四个通道是触发ADC的采样。通过调整通道4的值去调整ADC采样是在上溢出采样还是下溢出采样。

        3 .3 PWM Config配置:

        这个互补PWM的输出是由PWM mode和CH/CHN Polarity共同决定的。

        下面的波形中黄色的为CH(高侧MOS)、橙色为CHN(低MOS输出)。

        建议:在实际开发过程中,在互补PWM的输出应该配置为PWM mode 1,然后再根据自己实际的逆变器电路去调整CH Polarity、CHN Polarity。

        一般情况下我们的使能的逆变器都是上下都是NMOS,即高电平导通,配置PWM时候选择PWM mode 1、CH Polarity = High CHN Polarity = High即可。

        其实到这里我要表达的意思差不多表达完成的,有些东西不太好描述,不知道大家能不能理解。

        (4)STM32CubeMX的配置: 

        下面是定时器的配置

        下面是ADC的配置

	HAL_ADCEx_InjectedStart_IT(&hadc1);
	__HAL_ADC_ENABLE_IT(&hadc1, ADC_IT_JEOC);
	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
	
	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.8*5312);
	__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0.8*5312);
	__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_3,0.8*5312);

       正常情况下,只要你的逆变器是高电压导通的都是这个配置,唯一的区别就是你需要根据的实际情况去调整一下FOC的执行频率和SVPWM控制时的ADC触发时刻。

        


https://zhuanlan.zhihu.com/p/572855026

https://www.bilibili.com/read/cv25671144/?opus_fallback=1

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐