本帖最后由 qiao--- 于 2025-1-24 12:15 编辑
本期测评分为3个部分,第一个是用Hall传感器估算角度位置,过程中也会用Hall把速度测出来,因为总所周知速度的积分就是位置,第二个部分就是电流环闭环,其中设计到Clark变换和park变换将adc采集的三相电流变成两个标量进行控制,由于本人不才这次只能做到d轴电流闭环,q轴是提供扭矩的一轴,我没有调出一个满意的结果。第三个部分是向大家求助的部分。
1.Hall测速
无刷电机常用的是开关Hall ,一般是有三个开关量,hall根据安装方式分为120度安装和60度安装,我这个就是60度安装的。
hall测速的第一点就是要判断扇区,每个扇区对应一个真值表,我们要根据这个真值表确定当前所在的位置。第一期测评我有配置cubemx,这里我就直接贴上判断扇区的代码,这个代码会返回当前所在的真值位置
short get_hall_state(void)
{
uint8_t hall_u, hall_v, hall_w;
hall_u = HAL_GPIO_ReadPin(Hall_A_GPIO_Port, Hall_A_Pin);
hall_v = HAL_GPIO_ReadPin(Hall_B_GPIO_Port, Hall_B_Pin);
hall_w = HAL_GPIO_ReadPin(Hall_C_GPIO_Port, Hall_C_Pin);
return hall_u + (hall_v << 1) + (hall_w << 2);
}
但是这个只能判断精度为60度的位置,有什么方式可以更细呢,答案是有的,可以统计60度之间hall走过所用的时间,然后再计算出速度,用上一个扇区的速递进行积分就可以算出位置。
下面是我这个电机的真值表,不同电机可能不一样。
uint8_t hall_arr[8] = {0, 1, 3, 2, 6, 4, 5, 0};
其中速度可以用下面的计算出,hall_tick是每个扇区中统计的时间数
speed_rad = TIMER_CLOCK_FREQ / hall_tick * PI / 3 * v_dir;
给大家看一下我估算出的电角度
这个电角度可以直接放在我们后面所需的电角度计算
下面是我没经过滤波测出的速度,占空比给的50%,转速在1400rpm左右。
2. 电流闭环
这里闭环的基础是ADC采样要成功,这里我的ADC采样计算数据如下,其中zeropoint是偏执电流
#define V_REG 3.3f
#define CURRENT_AMP_GAIN 9.143f
#define CURRENT_SHUNT_RES 0.003f
#define CURR_GAIN V_REG / 4096.0f / CURRENT_AMP_GAIN / CURRENT_SHUNT_RES
motor0.ib = ((float)(hadc1.Instance->JDR1) - motor0.ia_zeropoint) * CURR_GAIN;
motor0.ia = ((float)(hadc1.Instance->JDR2) - motor0.ib_zeropoint) * CURR_GAIN;
motor0.ic = ((float)(hadc2.Instance->JDR1) - motor0.ic_zeropoint) * CURR_GAIN;
然后就是我们熟悉的Clark变换和park变换
Clark变换:
void current_clarke(Motor_State *motor) {
motor->i_alpha = motor->ia;
motor->i_beta = (motor->ia + 2 * motor->ib) * 0.5773502691896257f;
}
park变换:
void current_park(Motor_State *motor) {
motor->id = motor->i_alpha * motor->theta_cos + motor->i_beta * motor->theta_sin;
motor->iq = motor->i_beta * motor->theta_cos - motor->i_alpha * motor->theta_sin;
}
参考公式:
给搭建看下我变换的结果的波形
Clark:
park:
最后用pid完成d轴电流闭环,减少电机的发热:
void current_control(PID *pid_id,PID *pid_iq, Motor_State *motor)
{
PID_Calc(pid_id, 0, motor->id);
motor->vd = pid_id->output;
}
最终电机的转的情况如下:
VID20250124115739
3.遗留问题
但是目前我遇到两个问题目前还没有解决,希望厉害大佬给予提示:
1. Uq给正值,电机却翻转的情况,电角度会从2*pi递减到0。理论上应该是Uq给正值,电角度会从0增加到2*pi。我看网上有网友遇到过这种情况,但是我没有理解什么意思
https://bbs.elecfans.com/jishu_1124628_1_1.html
2. 由于ADC本身就具有噪声,所以在调d轴和q轴电流闭环的时候,他们的阶跃响应有点看不清楚,如下,甚至我调试了几个版本的pid参数,效果都差不多,波形的阶跃都长这样,我该如何衡量好坏呢。一般来说衡量阶响应的好坏用他的稳定响应时间和超调量等等,但是感觉我这个被噪声覆盖了。我有用过低通滤波器,但是效果也不是很好(几组pi参数效果一样)。例如下面两组的pi效果就一样 1. p = 3 ,i =0.2 2. p= 10 ,i =1
p = 3 ,i =0.2 的阶跃响应如下
p= 10 ,i =1 的阶跃响应如下