无人机项目设计过程中遇到的问题(建议收藏)
说明
本文列出了博主在完成无人机项目的过程中遇到的一些主要的问题,并给出了对应的原因、解决方法,部分问题暂未解决,无人机视频参考如下
纯手搓无人机!耗时近一个月的四旋翼无人机成功起飞!
MPU6050读取ID问题
由于ID读取一直是0xD1导致DMP初始化过不了,引起程序不断重启,然而在此之前,相同的代码是可以运行的,不知道为什么突然就出现错误了,而且将手指按在MPU6050的SCL和SDA引脚处发现有时候可以正常读取,因此合理怀疑有可能是硬件出了问题,因此购买了一颗新的的芯片进行测试,暂时未到。
由于软件IIC是可以运行的,因此很难说到底是硬件问题还是代码的问题,因此为了进一步分析原因,使用逻辑分析仪对时序进行分析,然而有意思的现象出现了,当我把SCL、SDA和GND接到逻辑分析仪上面后,发现此时居然可以正常读取ID号并读取数据信息了,拔掉SDA与逻辑分析仪的连接线后,发现依旧可以正常读取,但是一旦把SCL与GND拔掉,又恢复到无法正确读取数据的状态了,到这里其实就可以很大概率上确定上面的所有问题不是出在代码上,而是硬件自身的问题了。但是为什么把SCL和GND两根线接到逻辑分析仪上后模块又恢复正常,还在分析原因中。。。
经过一行一行检查代码,终于找到了问题所在!!!原因是我使用的驱动代码中,与IIC有关的等待从机应答的函数上,实际上,在IIC通信中,应答0是有效应答,应答1是无效应答,然而问题在于MPU6050的驱动代码中,判断的是返回0是无效,返回1是有效,这两个代码之间刚好搞反了!!!所以导致上面的问题出现,于是我把驱动代码中与IIC有关的代码重写了,但是为了避免修改与MPU6050有关的代码,我就按照他那个意思把Wait_Ack()的代码返回值进行了取反,这样就完美解决了上面提到的问题!!!修改后的IIC_Wait_Ack()如下;
int IIC_Wait_Ack(void)
{
uint8_t ack;
IIC_W_SCL(0);
IIC_W_SCL(1);
ack=IIC_R_SDA();
IIC_W_SCL(0);
IIC_W_SDA(1);
// 对于IIC 实际上应答0是有效应答 应答1是无效应答
// 但是由于写这个驱动的人可能搞反了 后面的驱动代码中都是反着判断的
// 因此这里需要将返回值取反一下
return ~ack;
}
MPU6050引脚更改问题
将IIC驱动的引脚进行更改,发现更改后代码就无法执行了,只能把SCL和SDA分别设为PB8和PB9才能运行。待新的MPU6050到手后再测试看是什么原因引起的。
后期补充:上面的问题(即第一个问题)解决后,这个问题自然就不存在了,经过测试,发现此时修改引脚已经没什么问题了。
空心杯电机驱动电压不足问题
在使用升压模块将输入电压升到5V后,作为空心杯的驱动电压,使用2N7002MOS管来驱动电机,结果发现驱动能力很弱,经过测试发现mos管是导通状态,栅极电压达到3.3v左右,因此排除mos没有完全导通的原因,进一步测量电机两端电压发现仅有0.5v左右的电压,严重低于驱动电压0.5v,在此期间检测升压电路的输出电压,发现输出电压是正常的5v没有被拉低,说明电压输出是正常的,经过讨论后怀疑是mos管的内阻过大导致的分压,经过检测,发现mos管两端的分压达到4.4v左右,加上电机两端的电压刚好5v,证实了猜想,因此选取内阻较小的AO3400mos管进行替代,目前mos管暂未到手。
换成AO3400mos管后,发现电机转动速度快很多,电机两端电压接近电源电压,因此可以确定,一方面是原mos管内阻过高引起,而内阻过高可能是因为3.3v的驱动电压不足以让2N7002mos管完全导通。
3.7v锂电池作为供电电压时的升压降压选择
当选择3.7v锂电池为模块的供电时,可以不进行升压,直接将3.7v输出分为两路,一路用于空心杯电机的驱动电压,另一路先进行降压,降到3.3v为stm32提供供电,这样就不需要升压电路,仅需要一路降压电路即可。
NRF24L01贴片可以发送数据 但是接收不到数据并且MISO引脚接收到的数据全是1
NRF24L01贴片在无人机上发送数据时是正常的,但是接收数据的时候,接收引脚上全是1,一开始以为是代码出问题了,检查了几个小时后,感觉可能不是代码的问题,因为同样的代码在另一个设备上正常运行,可以接收数据,于是考虑到MISO引脚时钟接收到1,因此怀疑可能是引脚存在连锡的情况,发现芯片上连接MISO与SCK的引脚是相邻引脚,并且经过检查发现,这两个引脚输出高点低电平均不正常,高电平始终无法到达3.3v,于是可以肯定,就是这两个引脚连锡引起的问题,于是对引脚进行了清理,再次写入接收数据的代码终于可以正常运行了。
四个空心杯电机其中有一个电机转速明显比另外三个慢一些
经过排查,发现是由于驱动的mos管的引脚存在虚焊问题,加锡后问题并没有解决。。。再次检查发现貌似是该电机的齿轮与桨叶的齿轮卡扣不完美导致的问题,问题由硬件缺陷所引起。
使用软件IIC读取MPU6050数据读出全是0的问题(非DMP库函数读取)
因为使用DMP库函数读取速度太慢了,读取一次需要大约3ms,并且不知道为什么数据总是会有噪音,因此选择用一般的方法读取加速度角速度然后进行转换,但是发现读出来的数据全是0,也不是一直读出的全是0,就是经常上电后读取到的数据就全是0,有时候上电后读取到的数据是正常的,不知道为什么,经过查询发现,在初始化前以及初始化后分别添加100ms的延时,该问题就解决了!插一嘴,因为这个问题我以为是我板子坏了,又重新焊了一个板子,结果发现还是这个问题,害得我浪费一个板子。。。再插一嘴,换了这个方法后,还是很慢。。。吐了呀 明天改用硬件IIC试试吧
后续来了!!!
几经波折,继由于角速度读取数据波动导致我不得不丢弃DMP库换其他方法读取数据后出现一系列问题,我终于解决了角速度异常值的问题,在缩短IIC的延时时间后,这个问题就再也没出现了!而且MPU6050的读取时间也大大缩短了
STLINK下载一直提示internal commad error!!!
直接上解决办法,网上看到别人说是需要按着复位按键下载,但我试了不行,后来经过尝试发现,需要外接电源才能解决此问题!也就是说你的stlink下载器要与开发板进行连接,还需要额外对开发板供电,而不是依赖stlink的3.3v供电,至于原因是什么不知道。。。接后续,刚刚烧录了几次后又不管用了。。。这些不知道原因的bug真的很逆天。。。我服了
内环PID控制角速度时总是倾向于朝一个方向倾斜
由于一个电机的齿轮与桨叶齿轮卡扣不是很密,时不时会分离,导致该侧升力不足,与前面那个问题的原因是同样的
mpu6050能读取ID号,但读取数据全是0
经过仔细查找,发现MPU6050的电路设计时,误将AD0引脚接到了vcc,因此导致了器件ID不同,变为0x69,因此,导致上面的问题,将驱动文件中的相关代码进行修改后,mpu6050可以正常读取数据了
分割
后面内容是下图中的无人机设计过程中出现的问题,因为视频中展示的无人机存在一些缺陷,因此博主选择了新的机身,使用电路板作为机身进行新一阶段的无人机开发以避免固有问题。二者是统一的,可以以下面的为主。
电机一开始转动nrf24l01芯片就无法工作了
124号电机的转动对NRF24L01模块的工作不会产生影响,但是一旦将左下角的3号电机装上后,只要3号电机开始转动,nrf24l01模块就会不工作,估计是3号电机的布线有问题,对通信模块的线路产生了电磁干扰。等待修改布线…
后续
为了避免出现上面的问题,此次pcb设计时特意对所有信号线进行了处理,并且保证了通信模块的周围没有无关线路经过从而产生电磁干扰,此外还对通信模块的电源以及四个电机的电源进行了额外的滤波处理,在做了上面这些处理后,我惊奇的发现居然还是没用!!!依旧是会出现同样的问题,我真没招了。。。有没有遇到过同样问题的小伙伴说一下到底是什么原因。
10月3日更新后续
再次对pcb进行优化之后,问题还是会时不时地出现,经常性丢信号,怀疑是电机转动导致nrf24l01模块供电不足直接断电了,但是已经没有像之前那样只要一启动就直接丢信号了。继续优化中。。。
10月12日继续更新后续
终于,在修改了不知道多少版电路后,NRF24L01模块与电机冲突的问题终于解决了!!!之前的电路设计中,都是直接将VBAT降压到3.3V,然后VBAT单独给电机供电的,这就导致电机启动的时候会导致此时电压很不稳定,从而导致NRF模块的供电电压不足导致模块重启,因此就会产生前面的问题。为了解决此问题,额外添加了升压模块,将VBAT升压到5V,然后再将5V电压降压到3.3V给主控以及NRF供电,用于提供稳定的3.3V供电。至此,这个困扰了我奖金两个月的问题,在打了十几版板子后终于解决了!修改后的电路图如下。
另外,最初计划如果这一版电路还是不行的话,就继续优化供电部分,思路就是将NRF24L01模块的供电来源再单独用XC6206分一个出来,该电压仅用于NRF24L01模块的供电,也就是一个XC6206用于主控以及MPU6050的供电,另一个XC6206单独用于NRF24L01的供电。但既然这一版已经没问题了,因此也不想再继续修改了,实在是累了。。。感兴趣的小伙伴建议在设计电路时,加上这一个设计建议。
关于NMOS驱动电路的问题
在实际实验中发现,AO3400可能会在一些无意的违规操作下导致烧毁,例如短接输出。此时由于MOS损坏,输出电机端无法进行控制,需要重新焊接新的完好的MOS管。
此外,在该部分电路中,博主发现一个问题,就是一个电阻在没有焊接到电路板上之前,用万用表进行测量电阻阻值发现结果是正常的,但是一旦将电阻焊接到电路板上之后,再次测量就会发现电阻的阻值改变了,因为有4个NMOS驱动电路,我分别对100Ω和10K的电阻进行了这样的实验,发现100欧姆的是正常的,但是10K电阻中,有两个在焊接上去之后的测量结果并不是10K,而是小于10K的一个值,例如5K多一点,但是另外两个10K电阻却是没有问题的,不知道是什么原因,如果说是由于并联其他元器件引起的话,那么为什么有两个10K电阻的阻值是正常的呢?这个问题暂时不知道是为什么。有了解的小伙伴可以在评论区分享一下。
新版本的无人机空心杯电机输出转速不一致的问题

上面那个冲突的问题解决后,又出现了新的问题,真是翻过一座山又遇一座山,千难万险无穷尽也。现在的问题是,对于四个电机,我输出同样的pwm时,发现1、2号电机在一个较低的pwm值以下不会启动,而23号电机会启动,更换了2号电机和4号电机后,发现还是存在此问题,因此可以确定不是电机本身的问题,而是软件或电路的问题,但是四个电机的驱动电路是一模一样的,因此考虑是软件方面出问题了,经过查询可能是引脚pwm设置的问题,1、2号电机用的是TIM1的PWM驱动,电机3、4用的是TIM2的PWM驱动,由于TIM1属于高级定时器,因此可能会与通用定时器之间的PWM输出存在略微差别,现将驱动引脚进行更改,全部改为TIM2的通道(PA0、PA1、PA2、PA3)进行PWM输出,等待打板中。。。
上图为新版驱动引脚设置
后续更新
打板完成后,发现该问题解决了,说明确实是定时器不同造成的结果,剩下的就是调节PID了,该过程基本上没有技术上的难度,由于博主较忙,该项目可能不会再进行后续更新了,因此项目就到此为止了。
更多推荐



所有评论(0)