遇到的一些问题

焊接

焊接有排针原件黑色正方形小塑料应该与排母贴合的一面焊接才是对的。由于干活之前没有统筹没有观察,导致排针焊接反向,要取下来比较不容易,实测如果焊反会导致排针长度不够与排母接触不够等于模块没插上排母,焊接时注意烙铁头有效的一面焊接,尤其是电源要检测是否有短路的情况。焊接时间不宜过长,在烙铁接触焊盘后,焊锡丝接触烙铁3秒左右为好,有些焊锡丝比较垃圾有种金属的感觉建议不要使用。锡焊器要对准但不要暴力除焊锡以防排针受力加上高温使其折断;使用吸锡线要加上充分焊油,粘合度不宜过大防止产生PCB焊盘被沾下来脱落。
焊接PCB一般仅有下方排母有效,对于一端有端子一端无端子的线材需要剥线后给线镀锡增加硬度方面焊接和维护更建议替换成两头端口的方式。一般有XH2.54和PH2.0两种,两种形状一致,PH2.0 6P端口长度为12.4MM左右,XH2.54明显更长一定注意区分遇到参数方面的事情要问一下不要自以为是,目前因焊接原因已经损坏一块PCB板,一块单片机,因电源连焊导致两块32突然断电损坏PCB永久损坏。一块单片机损坏的情况下首先要做的是排查分析错误而不是把另一块直接插上去,一次严重的损坏必然会有线索提示。

电源

使用STLINK供电时不要打开外置18650电源,会导致单片机输出的5V与电池的5V叠加到DRV8833的VM输入端口,从而使DRV8833输出电压过大,电机电压过大及其危险。
注意降压模块的电压值。

原理图

230101

0212开发日志

深圳的STM32到了能正常初始化MPU6050,在不插10V转5V降压模块和电机驱动模块的情况下 屏蔽CAR_APP/CAR_TASKSet_PWM(Motor1,Motor2);代码,下午14点39分测试 MPU,OLED工作正常,蓝牙模块灯闪烁。

删除冗余代码

STM32 freeRTOS.c中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Start_sw_1Task(void const * argument)
{
/* USER CODE BEGIN Start_sw_1Task */
/* Infinite loop */
for(;;)
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
osDelay(200);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
osDelay(200);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
osDelay(200);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
osDelay(1000);
}
/* USER CODE END Start_sw_1Task */
}

属于贴片MOS管控制的LED灯闪烁代码占用一个线程可删除优化性能,将其注释掉,并分别查找该函数注释掉,该函数控制sw1_pwm_taskHandle任务查找并注释,关于FREERTOS任务线程ID和创建可见STM32 FreeRTOS的osThreadDef创建任务FreeRTOS学习笔记(11)— FreeRTOS的线程管理、定时器管理(CMSIS_API);烧入代码并编译无报错各模块工作正常!

蓝牙模块测试

蓝牙名称为HC-05,PIN码为默认的1234在蓝牙调试助手APP对话模式中可查看蓝牙串口发的详细信息。手机端显示RX,此时蓝牙状态灯时灭时闪。下午15点14分测试,蓝牙模块正常。

MPU通讯测试

灵敏度中上较为灵敏,零点漂移最大在-0.1左右,工作正常!

原来的降压模块IN-处管脚存在虚焊0213下午3点

同时该模块IN+管脚存在引脚长度不足的问题,以上问题可能是导致旧PCB损坏的原因

该模块存在不稳定因素暂停使用,将在使用万用表确保无误后继续使用。

PCB设计检查

经检查电源供电线路部分清楚排除因PCB设计问题导致的损坏。

电机

两个电机供电均接在DRV8833上应该会有过载保护,电机损坏可能性几乎为0。但建议使用新的电机驱动模块,电机编码器供电直接是32提供3.3V损坏可能性为0。

B站和知乎有一些和源码对应的PID控制讲解

0213开发日志

早上去拿快递门都没开妈的真是不方便

接入加密云存档

大鸟云备份

降压模块焊点及其测试

降压模块焊点完美但是排针有些小弯曲要注意
环境:未插入DRV8833
降压模块PCB 8个焊点两两相连,链接正常!
降压模块本体 8个焊点两两相连,链接正常!
开关关闭下in+为0v out为0V正常
开关打开下in+为7.99v out为4.99V正常

PCB供电测试

插入降压模块后接入32打开开关,OLED显示,蓝牙可接受数据,MPU初始化及传输正常。
PCB供电正常。早9点23结束测试,断开电源排线,一切顺利。

DRV8833模块

DRV8833模块焊接完毕,所有焊点十分完美等电机排线到达后进行测试

电机死区和PWM调速

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Set_PWM(int motor1,int motor2)
{
if(motor1>0)
{
PWMA2=Dead_Zone+(abs(motor1))*1.17;
PWMA1=0;

}
else
{
PWMA2 =0;
PWMA1=Dead_Zone+(abs(motor1))*1.17;
}


if(motor2<0) {

PWMB2 = Dead_Zone+(abs(motor2))*1.17;
PWMB1 = 0;
}
else
{ PWMB2 = 0;
PWMB1=Dead_Zone+(abs(motor2))*1.17;
}
}

电机死区应该是使电机刚好能转动的PWM数值,预计可通过对以上代码并将Set_PWM(100,100)那么可通过调整Dead_Zone找到电机的死区且实际的死区为Dead_Zone-117
DRV8833可以翻转IO口的高低电平使得电机正反转
1,2应该是代表正转/反转 A/B应该是代表电机1,2号

0214开发日志

先测机械中值

先使得小车保持中立位从OLED中读出参数pitch的值为1.5
#define Mechanical_balance 1.5 标准的宏定义

测电机死区

电机死区是使得电机刚开始转动的临界PWM数值,可以通过赋值Set_PWM(-100,-100)测得
我们这里大约测得为

1
2
int   Dead_Zone1=3100;    //电机死区1 4250
int Dead_Zone2=3000;

1,2代表电机序号,每个电机体制不同死区相差50-100属于正常,我这里的死区比较极限了因为里面赋值的100但是死区没有加上117,但是问题不大

调节PID

这里的PID分为直立环,速度环和转速环。
直立环用于检测角度与机械中值的偏差,如果小车向前进的方向倾斜说明KP过小不足以提供回复力
如果小车出现小幅度大范围低频率抖动说明KD过小不足以快速响应以消除抖动
速度环用于控制速度偏差根据机械特性Ki=Kp/200
转动换,用于使小车保持直线,对偏离方向的运动提供回复的扭力,非遥控状态依靠KD调节,遥控状态通过KP,KD共同调节,Kp主要提供左,右转动的扭力
以下为B站视频上的PID参数

1
2
3
4
5
6
7
8
struct pid_arg PID = {
.Balance_Kp=-300 ,//-230 245 170 -200 -280 -300
.Balance_Kd=-0.75,//-0.16 0.50 -0.5 -0.7 -0.6
.Velocity_Kp=-120,//-48 70 100 -115 -60 -80 -120
.Velocity_Ki=-0.6,//-0.24 0.21 0.325 -2.4 -0.3 -0.4 -0.6
.Turn_Kp = 180, //70
.Turn_Kd = 1.0, //0.5 1.5出现左右高频抖动
};

下午15点18测试,上述参数没问题,配合遥感很灵敏

关于蓝牙

蓝牙通讯有延迟,该小车不适合短时间频繁操作

关于32

该32 5V引脚有问题不过接电池的话不影响使用。

一切顺利,毕设完成,接下来进一步建模巩固PID知识

验证通过,但是手机摇杆要以中点为中心操作,不要在四块小正方形里面随便乱滑动!

0226日志

今天在源码里查找PWMA1发现#define PWMA1 TIM3->CCR2,TIM3应该是定时器而CCRx是捕获/比较寄存器(CCR)应该与PWM占空比有关。
突然想到一个问题,既然平衡小车保持平衡主要靠回复力也可叫扭矩,那么根据T=9550P/n 可知,转速越小扭矩越大,而在PID算法中则会增大PWM值增大转速来增大回复力,这不是矛盾了吗?
答:增大PWM时候功率P的增加速度大于n故扭矩整体变大(存疑),减速器的作用是相同功率下减少转速n以增大输出扭矩!

0227日志

hc_src04_start是超声波模块的启动函数,找到了蓝牙的接收函数未找到蓝牙的发送函数疑似直接用串口的printf发送
STM32 FreeRTOS的osThreadDef创建任务
这片文章线程优先级写的还算清楚,用osThreadDef创建任务时里面的参数都要搞清楚
这里的200HZ任务,或者别的频率任务是怎么实现的?
osDelay(5);延迟函数函数实现的。实际上程序内的语句是一直在运行的。

0228日志

原本打算用matlab Simulink对直立环PD进行定性分析,我在Simulink画了PD环节发现示波 器波形为一条直线,经研究是因为没有加入被控对象的传递函数模型导致无法显示输出波形,PID控制实质上根据被控对象的传递函数模型对输出量进行期望校正!
一般程序设计用的都是离散化PID即

  1. 一阶差分代替一阶微分
  2. 累加代替积分
    关于一阶差分的定义:
    定义1 当自变量从x变到x+1时,函数y(x)的改变量:

    称为函数y(x)在点x的一阶差分
    经Simulink下仿真Kp太小会有稳态误差
    占空比是当前PWM/7999

    0301日志

    换成了自己优化过的开发板,所有接口都用排母和端子连接了很舒服。
    机械中值变成了-1.8,测试中发现小车的motor1比较灵活需要抑制一下,所以电机死区改为
    1
    2
    int   Dead_Zone1=3100;    //电机死区1 4250
    int Dead_Zone2=3150;
    旧的PID参数转向很快,即使转向环的KD=1已经很大了,静止时仍然有偏移趋势,而且前后退速度不快估计是速度环被转向环抑制了
    同时为了减少小车轮子左右抖动的概率,下降转向环的KD,下降转向环的KP(减少转向瞬间的车身抖动),提高速度环KP,KI,提高直立环KD
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //PID调节参数
    struct pid_arg PID = {
    .Balance_Kp=-300 ,//-230 245 170 -200 -280 -300
    .Balance_Kd=-0.95,//-0.16 0.50 -0.5 -0.7 -0.6
    .Velocity_Kp=-130,//-48 70 100 -115 -60 -80 -120
    .Velocity_Ki=-0.65,//-0.24 0.21 0.325 -2.4 -0.3 -0.4 -0.6
    .Turn_Kp = 150, //70
    .Turn_Kd = 0.75, //0.5 1.5出现左右高频抖动
    };

    0302开发日志

    左右轮子其实静摩擦差距很大,但如果把死区值设置的相差过大的话,反而会造成左右高频抖动。M2略比M1大一些就行。
    为啥电机驱动输入IO都用的TIM3定时器生成的PWM?
    因为是软件PWM,这个项目IIC也是软件的
    freeRTOS和管脚的相关配置是在CubeMX内事先配置好的。

    一切顺利,万事如意!