直流无刷电机【一】从零开始上手_永遠亭Official的博客-CSDN博客
基于上次的实践,对硬件做了完全改进,因为上版硬件过于杂乱不好接线,并且三个半桥的控制引脚都不是定时器的复用引脚,无法输出pwm。
这次直接把分立式三相全桥及驱动换成了TI的电机驱动集成芯片DRV8313,主控换成了F4,代价就是带载功率变小了,不过我用的是云台电机,本身功率就不大,无伤大雅。
关于调速
BLDC的调速基本上都是降压调速,对于上次写到的直接确定六步换相时刻的方法来说,调速代码如下:
void SimpleOpenTest(void){
UP_0;
VP_0;
WP_0;
u32 delay_time_us = 0;
u32 delay_time_ms = 2;
uint8_t dutycycle = 20;
while (1)
{
ChangeDutycycle(1,dutycycle);
VP_0;
WP_0;
//HAL_Delay(2);//U+W-
Delay_us(delay_time_us);
HAL_Delay(delay_time_ms);
ChangeDutycycle(1,dutycycle);
VP_0;
WP_0;
//HAL_Delay(2);//U+V-
Delay_us(delay_time_us);
HAL_Delay(delay_time_ms);
UP_0;
VP_0;
ChangeDutycycle(3,dutycycle);
//HAL_Delay(2);//W+V-
Delay_us(delay_time_us);
HAL_Delay(delay_time_ms);
UP_0;
VP_0;
ChangeDutycycle(3,dutycycle);
//HAL_Delay(2);//W+U-
Delay_us(delay_time_us);
HAL_Delay(delay_time_ms);
UP_0;
ChangeDutycycle(2,dutycycle);
WP_0;
//HAL_Delay(2);//V+U-
Delay_us(delay_time_us);
HAL_Delay(delay_time_ms);
UP_0;
ChangeDutycycle(2,dutycycle);
WP_0;
//HAL_Delay(2);//V+W-
Delay_us(delay_time_us);
HAL_Delay(delay_time_ms);
}
}
其实就是把原来六步换相中拉高的那一项换成了PWM输出,降低对应相的输出电压达到降压调速的目的。ChangeDutycycle就是自己封装了一下的函数,把对应通道的PWM占空比改变。
设置占空比是20,这样跑起来比上次的震动顿挫感小了许多,都不需要手扶着了。
至于正儿八经的开环怎么写,最近还在读别人源码研究AS5600的采样频率问题和如何在单片机上实现(因为如果是用霍尔传感器的传统方法那直接开边沿中断就能很容易地写代码判断换相时刻,但AS5600是IIC或者pwm通信,又不能在定时器中断里直接读iic数据,因为耗时太长了可能看门狗复位;个人编程能力不咋地,主要是代码的结构不好想)
BLDC调速一