- 2025-03-15
-
回复了主题帖:
【B-G431B-ESC1-无刷电机板】3-开环VF强拖
dirty 发表于 2025-3-15 11:29
电机是有感还是无感,购买链接有没?参考看下
有感,自己随便找的一个电机 ,HALL编码器
- 2025-03-12
-
回复了主题帖:
基于【STSPIN32G4】的BLDC电机控制
支持楼主, 插眼跟进
- 2025-02-10
-
回复了主题帖:
【RainbowLink USB 协议转换器】4- 232通信测试
乱世煮酒论天下 发表于 2025-2-6 08:55
短板效应是什么意思,接收的信号收到器件转化速率的限制?
是的,受接受速率最小的影响
-
回复了主题帖:
【RainbowLink USB 协议转换器】5-多协议同时运行
秦天qintian0303 发表于 2025-2-5 20:44
CH344比较强大,还有CH348通道更多
是的
-
回复了主题帖:
【新年新挑战,任务打卡赢好礼!】第二批获奖名单公布
已确认
- 2025-02-08
-
回复了主题帖:
【B-G431B-ESC1-无刷电机板】6-无刷电机梯形加减速
Jacktang 发表于 2025-2-7 07:46
电机实物0到2000加速再减速到0 的情况,加速度是每秒增加1000rpm,可以
感谢关注
- 2025-02-06
-
发表了主题帖:
【B-G431B-ESC1-无刷电机板】6-无刷电机梯形加减速
本帖最后由 qiao--- 于 2025-2-6 16:04 编辑
本期测评在上期速度闭环的基础上做电机的梯形加减速,梯形加减速具有以下的优点:
1. 减少机械冲击
作用:通过逐渐改变加速度,避免速度突变,降低对机械系统的冲击。
效果:延长设备寿命,减少磨损和故障。
2. 提高运动平稳性
作用:平滑的速度变化使运动更加稳定。
效果:提升运动精度,减少振动和噪音。
3. 优化能量消耗
作用:避免频繁启停和速度突变,降低能量损耗。
效果:提高系统能效,减少运行成本。
4. 增强系统响应
作用:合理的加减速设计能加快系统响应。
效果:提高生产效率,缩短运动时间。
5. 简化控制算法
作用:梯形加减速算法简单,易于实现和调试。
效果:降低开发难度,加快系统部署。
上期测评我们做了速度阶跃响应,而电机达到目标速度是ms级别的,而我们梯形加减速目的是几秒到达目标速度,那么写进速度的这个时间可以忽略不计,在系统的阶跃响应性能非常好的情况下,我们只需要保证写进速度的变量是按梯形变化的,那么梯形加减速就完成了。
下面是让电机进行梯形加减速的代码
void velocity_loop(Motor_State *motor, float target_vel)
{
if (motor->motor_on)
{
loop_counter_v++;
if (loop_counter_v >= 20)
{
if (target_vel > trapezoid_speed)
{
trapezoid_speed = trapezoid_speed + trapezoid_acc;
if (Math_abs(trapezoid_speed - target_vel) < trapezoid_acc)
trapezoid_speed = target_vel;
}
else if (target_vel < trapezoid_speed)
{
trapezoid_speed = trapezoid_speed - trapezoid_acc;
if (Math_abs(trapezoid_speed - target_vel) < trapezoid_acc)
trapezoid_speed = target_vel;
}
if (target_vel == 0)
{
if (target_vel == motor0.motor_param.speed)
{
suspend_motor(&motor0);
motor->vq = 0;
}
}
loop_counter_v = 0;
}
}
speed_pid_control(&speed_pid_rpm, &motor0, trapezoid_speed);
}
这样变量trapezoid_speed就是按照梯形增加或减少的。其中trapezoid_acc是加速度。
下面是trapezoid_speed按照梯形增加到2000然后减少到0的波形变化:
下面是电机实际速度的波形变化,由于hall算法低速的时候测速优点不准,所以低速时会有抖动是正常情况
下面是两个波形一起的波形图,可以看出速度跟随情况
最后给大家看一下电机实物0到2000加速再减速到0 的情况,加速度是每秒增加1000rpm:
[localvideo]66a0c8f8e4fbfc1d1fb1ec1baa9d5b59[/localvideo]
- 2025-02-05
-
回复了主题帖:
【B-G431B-ESC1-无刷电机板】3-开环VF强拖
lkh747566933 发表于 2025-1-21 14:15
我是硬件工程师,会设计电机驱动电路但是不会软件,学习一下。
共同学习
-
发表了主题帖:
【B-G431B-ESC1-无刷电机板】5-速度闭环
本期测评让电机进行速度闭环,电角度使用上期Hall算出的电角度。
在控制框图中本期做的属于这一步,属于加了一个外环
由于上期电流环Iq控制不稳定,因此这一期速度环的输出为Vq
其中pid的kq和ki值主要是调试速度的阶跃响应,下面是我调出适应我的这个电机的kp和ki值对应的阶跃响应
下面是速度闭环的控制代码
void speed_pid_control(PID *speed_pid_rpm, Motor_State *motor)
{
PID_Calc(speed_pid_rpm, motor->motor_param.speed_target, motor->motor_param.speed);
motor->vq = speed_pid_rpm->output;
}
pid计算公式在控制领域大家都很熟悉
这里不多介绍,只给代码:
// 进行一次pid计算
// 参数为(pid结构体,目标值,反馈值),计算结果放在pid结构体的output成员中
void PID_Calc(PID *pid, float reference, float feedback)
{
// 更新数据
pid->lastError = pid->error; // 将旧error存起来
pid->error = reference - feedback; // 计算新error
// 计算微分
float dout = (pid->error - pid->lastError) * pid->kd;
// 计算比例
float pout = pid->error * pid->kp;
// 计算积分
pid->integral += pid->error * pid->ki;
// 积分限幅
if (pid->integral > pid->maxIntegral)
pid->integral = pid->maxIntegral;
else if (pid->integral < -pid->maxIntegral)
pid->integral = -pid->maxIntegral;
// 计算输出
pid->output = pout + dout + pid->integral;
// 输出限幅
if (pid->output > pid->maxOutput)
pid->output = pid->maxOutput;
else if (pid->output < -pid->maxOutput)
pid->output = -pid->maxOutput;
}
对于hall测得的速度会有抖动的情况,因此对速度做一个简单的低通滤波,作为速度反馈。
encoder_hall->encoder_info.speed_rpm = lowPassFilter(speed_rpm, encoder_hall->encoder_info.speed_rpm, lpa);
低通滤波的代码如下
float lowPassFilter(float input, float prev_output, float alpha)
{
// 一阶低通滤波器公式:y(t) = alpha * x(t) + (1 - alpha) * y(t-1)
return alpha * input + (1 - alpha) * prev_output;
}
实现效果:
我这里分别将速度由0 -> 1000 > 2000 > 2500 -> 0 给大家做演示
[localvideo]3b366cc271a359f1870fdc26b6683a71[/localvideo]
速度波形如下所示:
总结:通过本期测评成功完成速度闭环,速度的抖动在5rpm左右,后面可以使用更可靠的滤波器优化。
-
发表了主题帖:
【RainbowLink USB 协议转换器】5-多协议同时运行
本期测评该RainbowLink 在多个协议同时通信时通信数据是否传输准确。
1. 测试环境
本期的测试环境为一个USB 转232/485的模块,一个RainbowLink ,还有杜邦线,测试环境如下:
2. 测试内容
本期测评主要是测试TTL通信和485通信同时存在的情况,TTL通信和232通信同时存在的情况,由于我手上的接收器只有1个,所以就只测试这些情况。
测试项
结果
TTL通信和232通信同时存在
TTL通信和485通信同时存在
总结:当多种通信协议或多个通道同时存在的时候,并不会影响通信的完整性,通信数据准确到达。
-
发表了主题帖:
【RainbowLink USB 协议转换器】4- 232通信测试
本帖最后由 qiao--- 于 2025-2-5 14:21 编辑
本期测评来测评一下这款工具的232通信的功能,看一下这款工具在不同的通信速率下232通信是否会丢包。由于232和485都属于硬件协议,所以本期测试的步骤和之前测试的步骤一样。
1. 测试环境
本期的测试环境为一个USB 转232的模块,一个RainbowLink ,还有杜邦线,测试环境如下:
2.测试内容
然后我们分别用两个上位机进行测试,一个SSCOM为串口模块的发送端,一个SSCOM为RainbowLink的接收端。
我们的测试项如下所示
通信波特率
测试结果
115200
500000
1000000
上面的测试结果可以看出以定频的通信频率测试分别在不同的通信波特率下的通信状况,数据传输在115200,500000的都准确无误,没有出现丢包的情况。
但是速率上到1000000的时候出现了乱码的情况。这里经过我的分析应该是我的RS232调试器的问题。类似于短板效应,他决定了我们通信的上线。
总结 :RainbowLink 的RS232通信在115200,500000的波特率下通信正常,但通信速率上到1000000后由于接收器的性能跟不上导致接受乱码。
- 2025-02-02
-
回复了主题帖:
有没有在RV1106开发板的buildroot上安装opencv-python的大佬,教我安装?
把opencv的库安装在其他外扩存储空间上,加上软链接,看我往期测评
- 2025-01-24
-
回复了主题帖:
【B-G431B-ESC1-无刷电机板】4-Hall测速,电角度估算,电流闭环
最后解决是在反PARK变换前面个加了一个符号就恢复正常了,有大佬知道原因吗
-
回复了主题帖:
【B-G431B-ESC1-无刷电机板】4-Hall测速,电角度估算,电流闭环
本帖最后由 qiao--- 于 2025-1-24 15:09 编辑
我的学号 发表于 2025-1-24 14:15 Q 轴给正电流电机却反转的情况,先确认下电机的 UVW 功率线的线序有没接错
感谢大佬,但是这样交换两次后总线电流增大,速度变低,功率利用率变低了,应该不对。
-
回复了主题帖:
【B-G431B-ESC1-无刷电机板】4-Hall测速,电角度估算,电流闭环
本帖最后由 qiao--- 于 2025-1-24 14:50 编辑
我的学号 发表于 2025-1-24 14:15 Q 轴给正电流电机却反转的情况,先确认下电机的 UVW 功率线的线序有没接错
确实是线序的问题,我换了一次线序,发现不正确,然后又换了一次。连着换两次就正确了
-
回复了主题帖:
【B-G431B-ESC1-无刷电机板】4-Hall测速,电角度估算,电流闭环
我的学号 发表于 2025-1-24 14:17
一般定义正对电机转轴时逆时针方向为电机运动的正方向,可以用手拖动转轴旋转,观察此时程序里的电角度计算 ...
Uq大于0对应的电机方向是正转的(如你所说那样),但是电角度是递减的
-
发表了主题帖:
【B-G431B-ESC1-无刷电机板】4-Hall测速,电角度估算,电流闭环
本帖最后由 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;
}
最终电机的转的情况如下:
[localvideo]0a41c9e9ef0e79f667fde206c0d659b5[/localvideo]
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 的阶跃响应如下
- 2025-01-22
-
回复了主题帖:
新年新挑战,任务打卡赢好礼!
3. 4. 5.
-
加入了学习《财哥说钛丝》,观看 财哥说钛丝(1)简介
-
加入了学习《自己动手写嵌入式操作系统》,观看 高级操作系统特性