AT32F403A/421 SVPWM驱动无刷电机开环速度测试
- 📌相关篇《HAL STM32F4 +ARM DSP库跑SVPWM开环速度测试》
✨本测试工程基于上面的运行例程移植而来。主要用来测试驱动无刷电机性能方面的差异。
- 🔖工程基于AT32_Work_Bench创建。
🔰AT32F403A和AT32F421对比差异
-
🌿AT32F403A:主频240MHz,支持单精度浮点运算单元(FPU)及数字信号处理器(DSP)。
-
🌿AT32F421:主频120MHz,支持数字信号处理器(DSP),不带单精度浮点运算单元(FPU)。
-
🌿工程配置差异:
- AT32F421:
- AT32F403A:
- ⚡针对AT32F403A工程中配置的重要一步:需要添加相对应的宏,来开启单精度浮点运算单元(FPU):
“__CC_ARM,__TARGET_FPU_VFP, __FPU_PRESENT=1U,ARM_MATH_CM4
”
📘测试条件
-
🌿有感或无感无刷电机,个人测试使用的是:2204-1400KV无感无刷电机,参数:12N14P(12槽14极),也就是,极对数是14/2=7极对数。(程序中需要填写)
-
🌿一块无刷电机驱动板。(硬件参考开源项目:
https://github.com/MengYang-x/STM3F401-FOC/tree/main
)
✨由于原作者使用的是EG2133驱动芯片,驱动电路中上下桥是连一块的,3路PWM输出即可实现无刷电机转动,如果自己使用的是上下桥独立驱动(6路输出控制),那么需要将定时器的PWM输出通道配置为互补输出通道,(即3路互补输出),同时需要注意输出极性。
- 驱动桥逆变部分电路:
🛠AT32_Work_Bench定时器配置
- 🌿选择一个高级或通用定时器
- 采用中心对齐计数方式,频率f=30000/2=15KHz
- 🌿各通道配置:
- 🌿刹车和死区关闭,保持默认即可:
🛠PWM开启和输出配置
- 🌿开启PWM输出通道
// 使能TIMx的通道
void PWM_Init(void)
{
/* enable tmr1 CHANNEL*/
tmr_channel_enable(TMR1, TMR_SELECT_CHANNEL_1, TRUE);
tmr_channel_enable(TMR1, TMR_SELECT_CHANNEL_2, TRUE);
tmr_channel_enable(TMR1, TMR_SELECT_CHANNEL_3, TRUE);
}
- 🌿占空比输出
// 输入参数0.0f ~ 1.0f,输出3路PWM
void Set_PWM(float _CCR1, float _CCR2, float _CCR3)
{
// TMR1->c1dt = _CCR1 * PWM_ARR;
// TMR1->c2dt = _CCR2 * PWM_ARR;
// TMR1->c3dt = _CCR3 * PWM_ARR;
/* channel 1 */
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_1, _CCR1 * PWM_ARR);
/* channel 2 */
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_2, _CCR2 * PWM_ARR);
/* channel 3 */
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_3, _CCR3 * PWM_ARR);
}
- 🌿AT32F421 main执行代码:
int main(void)
{
/* add user code begin 1 */
/* add user code end 1 */
/* system clock config. */
wk_system_clock_config();
/* config periph clock. */
wk_periph_clock_config();
/* nvic config. */
wk_nvic_config();
/* init usart1 function. */
wk_usart1_init();
/* init tmr1 function. */
wk_tmr1_init();
/* add user code begin 2 */
delay_init();
PWM_Init();
/* add user code end 2 */
while(1)
{
/* add user code begin 3 */
OpenVelocity(1.0f); //编译器gb2132环境下, 中文注释,AT32 Work Bench重新生成会变成乱码
delay_us(240);
/* add user code end 3 */
}
}
- 🌿AT32F403A main执行代码:
int main(void)
{
/* add user code begin 1 */
/* add user code end 1 */
/* system clock config. */
wk_system_clock_config();
/* config periph clock. */
wk_periph_clock_config();
/* init debug function. */
wk_debug_config();
/* nvic config. */
wk_nvic_config();
/* init usart2 function. */
wk_usart2_init();
/* init tmr1 function. */
delay_init();
wk_tmr1_init();
/* add user code begin 2 */
PWM_Init();
/* add user code end 2 */
while(1)
{
/* add user code begin 3 */
OpenVelocity(1.0f); //1.6-220us 2.0-280us 数值越大,电机旋转的速度越快
delay_us(140);
/* add user code end 3 */
}
}
- 👉需要注意,AT32F403A和F421它们运行的速度不一样,它们的延时时间不是相同的。
- ✨如果设置的目标角度值过大,电机抖动无法转起来,那么需要调整参数或者改变后面的间隔执行的延时时间。
- 🌿如果没有硬件测试条件,可以开启串口打印,配合vofa+串口调试工具,查看波形,正常的电机驱动波形为马鞍波。
📚测试工程
- 🌿AT32F403A_SVPWM
链接:https://pan.baidu.com/s/1vfGDHZj4UK1i0QAiFcs4kw?pwd=b87i
提取码:b87i
- 🌿AT32F421_SVPWM
链接:https://pan.baidu.com/s/1k2B3kx_lnhmmEORgCiXagQ?pwd=xuid
提取码:xuid