一、整体设计思路
要实现对风班的控制,难点在于获取当前风板的“状态”和寻找合适的算法来改变电机的驱动功率。可以采用MPU-6050通过姿态解析来获取风班的角度状态,并根据当前的角度信息,采用PID算法对左右的风扇的功率进行控制,从而达到改变风板角度的目的。此外,可以使用定时器来判定当前角度与目标角度的误差,若误差在一定时间内处于合理范围,则认为以达标,可以点亮LED作为光电提示。最后采用OLED显示屏显示相关数据,方便进行调试。
二、器件选型
2.1 角度获取
(1)MPU6050
MPU6050是一款由InvenSense公司生产的微电子机械系统(MEMS)传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器广泛应用于智能手机、平板电脑、可穿戴设备、无人机、机器人以及其他需要精确运动跟踪和平衡控制的场合,可以用来获取角度信息。
优点:价格便宜,MPU6050官方有相应DMP库来完成姿态解析,操作简单。
缺点:MPU6050具有动态稳定性,而无静态稳定性,稳定时效果不好。
(2)MPU60X0
MPU-60X0是全球首例9轴运动处理传感器。它集成了3轴MEMS陀螺仪, 3轴MEMS 加速度计,以及一个可扩展的数字运动处理器 DMP(DigitalMotion Processor),可用 I2C 接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其 I2C 或 SPI 接口 输出一个 9 轴的信号(SPI 接口仅在 MPU-6000 可用)。MPU-60X0 也可以通过其 I2C 接口 连接非惯性的数字传感器,比如压力传感器。 MPU-60X0 对陀螺仪和加速度计分别用了三个 16 位的 ADC,将其测量的模拟量转化 为可输出的数字量。
优点:准确度更高
缺点:价格贵
综合考虑,此题角度精度要求不太高,选择MPU6050来进行角度获取。
2.2 电机选择
(1)775电机
775电机,它通常指的是一种小型直流电机,具有小型化、直流供电、多种电压选项(6V 、12V 、24V等)、易于控制等特点。
优点:价格便宜,操作简单,功率大。
缺点:没有风道,风力可能会分散。
(2)直流涡旋风扇RK12032M12B
直流涡旋风扇RK12032M12B是一种直流轴流风扇,它通过直流电压和电磁感应来工作,将电能转化成机械能,从而带动风叶转动产生气流。这种风扇具有高风量、高静压、高可靠性和低噪音的特点,适用于需要高效冷却的多种设备和行业。
优点:自带风道,风力集中,输出功率较大。
缺点:价格较贵。
综合考虑到后续带负载可能对风力要求较高,选择直流涡旋风扇RK12032M12B 。
2.3电机驱动模块
L298N是SGS公司生产的一款通用的电机驱动模块。其内部包含4路逻辑驱动电路,有两个H桥的高电压大电流全桥驱动器,接收TTL逻辑电平信号,一个模块可同时驱动两个直流电机工作,具有反馈检测和过热自断功能。利用L298N驱动电机时,主控芯片只需通过/O口输出控制电平即可实现对电机转向的控制,编程简单,稳定性好。
2.4 器件说明
BOOM | 作用 |
电机*2 | 驱动 |
STM32F103C8T6 | 主控 |
LED | 声光提示 |
L298N*2 | 电机驱动电路 |
OLED | 显示信息 |
MPU6050 | 获取角度 |
12V电源*2 | 供电 |
三、电路与程序设计
3.1 I/O口说明
I/O口 | I/O功能 |
Key1(PB12) | 增加目标角度 |
Key2(PB14) | 减小目标角度 |
Key3(PA8) | 选择角度1或角度2 |
Key4(PA10) | 启动 |
Key5(PA12) | 模式选择 |
LED (PA0) | 光电提示 |
OLED_W_SCL(x) (PB8) | OLED时钟线 |
OLED_W_SDA(x) (PB9) | OLED数据线 |
电机1控制A(PA4) | 电机控制1 |
电机1控制B(PA5) | 电机控制2 |
电机1PWM(PA6) | 电机PWM输出 |
电机2控制A(PA1) | 电机控制1 |
电机2控制B(PA2) | 电机控制2 |
电机2PWM(PA7) | 电机PWM输出 |
3.3 关键代码
PID算法
float pid_left(float now, float target,float left_p,float left_i,float left_d)
{
//位置PID
p_err_1=target-now;
p_sum_1+=p_err_1;
p_diif_1=p_err_1-p_last_err_1;
//更新误差
p_last_err_1=p_err_1;
//对积分进行限制
if(p_sum_1>100){p_sum_1=100;}
if(p_sum_1<-100){p_sum_1=-100;}
return (make_sure1((left_p)*p_err_1+(left_i)*p_sum_1+(left_d)*p_diif_1));
}
最小输出
float make_sure1(float pwm)
{
if(pwm>100-min_pwm1){pwm= 100-min_pwm1;}
if(pwm<-0){pwm= -0;}
return pwm+min_pwm1;
}
模式改变定时
void TIM4_IRQHandler()
{
//模式0和模式2的定时
if(model==0||model==2){
//在稳定4s后,清除pid参数和min_speed
if(over_state)
{
tim4_count++;
if(tim4_count>4) //稳定了4s,回到原点
{
pid_p1=0;
pid_i1=0;
pid_d1=0;
pid_p2=0;
pid_i2=0;
pid_d2=0;
min_pwm1=0;
min_pwm2=0;
tim4_count=0;
}
}
//如果未稳定,则计数为0
else{tim4_count=0;}
}
//模式1和模式3的定时
if(model==1||model==3){
//如果稳定了
if(over_state){
tim4_count++;
//等待1s
if(tim4_count>1)
{
//进行翻转
tim4_mod=!tim4_mod;
tim4_count=0;
//看翻转了几次
model_count++;
}
}
//如果未稳定,则计数为0
else{tim4_count=0;}
//摆动周期设置 摆动3次
if(model==1&&model_count>3)
{ model_count=0;
model2_enable=0;
model=5; //任意一个未知数
//修改正确的pid参数 角度为f1
tim4_mod=0; //避免意外发生
pid_change(target_angle);
}
//摆动周期设置 摆动4次
if(model==3&&model_count>4)
{ model_count=0;
model4_enable=0;
model=5; //任意一个未知数
//修改正确的pid参数 角度为f2
tim4_mod=1; //避免意外发生
pid_huge_change(angle_two);
}
}
//防止卡在中断函数里面
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}
四、指标完成情况
4.1 基础部分
(1) 预置风板控制角度(控制角度在45°~135°之间设定)。
完成。
(2)评委在45°~ 135°范围内设定两个角度值
基本完成,有时出现超调。
(3)显示风板实时位置的角度。风板的实时角度位置、位置变更和任务完成应有明显的声光提示。
完成。
4.2 拓展部分
(1)预置风板控制角度(控制角度在45°~135°之间设定)。
完成。
(2)在45°~135°范围内预置两个角度值
基本完成,有时出现超调。
代码下载:链接:https://pan.baidu.com/s/1JlkzzLpJersep5hHVQiiMw
提取码:1234