文末有福利5 Q1 r$ K% Y( S" ] ( F4 x% c, Z* |1 C- R9 J $ T+ I' R" i( N- a 前面的帖子提到了stm32电机启动程序写完之后,只要上电后电机转动起来,过不了几秒就会停下里然后再次启动。 ; e: X4 R& j. z5 X% V/ g 修改别人的电路结果还是这样,我有点失望了,一开始以为是自己的程序有问题,以为是高级定时器三路PWM输出的时候有某一个函数应该调用而没有调用的原因造成的(我用的是标准库函数写的,打算等整个系统完全没问题了再改写为寄存器编程方式)。但是查阅ST官方资料,百度google都用了,就是没找到驱动程序有啥问题啊。一开始是直接给电机一个很高的占空比,这样可能太直接,不妨缓和点,所以简单的写了一个缓慢启动,让电机在20S左右的时间内速度从0增加到70%的速度,这样应该可以了吧,结果还是不行。那我就开始怀疑人生了。 $ K$ u; c: ^4 { 经过一番漫无目的的横冲直撞之后,我觉得这样是找不到出路了。不妨停下来换个脑子来解决这个问题。 + q. g+ S: k& A) f- n: _2 G 那就是理论分析呗。; N; v7 p* i6 o0 H9 F. u, q 但是之前的横冲直撞并不是没用,至少给我提供了很多实验现象和一些大概的数据。根据这些东西我做出如下分析与猜想:5 X0 H) r1 i% A& Y 1、原理图有问题;+ T* y! z8 o2 X: w5 u' d" B. V 2、原理图没问题但是PCB布局布线存在缺陷;+ e3 \! C% F* a: [ 3、电池放电能力不足;; X, j/ \3 y* I 4、电机回路电流波动对单片机系统产生影响;+ m* a! A; h8 Z C5 [4 ? 5、程序有问题(这个可能性比较小,但仍然存在); 那接下来就是对这些问题一一验证: 首先,原理图是否有问题,我可以去参考国外一些做的比较好的开源小四轴看看。经过对比后发现除了他们的电源系统比较复杂之外,其他的和我画的这个大同小异,尤其是电机驱动这块,大家用的都是SI2302。再者我原理图用的SI2302,它是可以让电机转起来的,所以应该没问题。至于电源系统,我认为使用一个一毛钱的AMS1117-3.3总比那些看起来复杂的系统成本要低很多。+ g1 ~2 C' U" [ 其次,PCB缺陷这个问题我暂时很难验证,那就测试电池放电能力,制作一个简单的回路,把四个电机同时用一个电池供电,发现转动速度很强劲,和之前发生问题时最大转速相比,应该达到了电机的最大速度。因为我把其中一个电机固定在一个空的四轴板上,这个电机安上桨叶转动时产生的升力就完全可以把整个PCB带起来,而且感觉很轻松的样子。四个电机同样的转速带动整个飞机和电池是完全没问题的。从理论上计算,可知3.7V,600mah,20C的锂离子电池放电能力约为600*20ma=12A,这是一个很恐怖的数字,假设这个参数是虚假的,真实放电能力只有10C,那也有6A的放电能力,而一个空心杯电机在全速转动的时候,需要的电流约为0.2A,所以即使整个电池放电能力只有1-2A,那也不至于整个系统不能工作。所以排除第三种猜想。' U: ~+ g& p1 Q0 X3 S- R) Y/ g 0 o' f D6 i1 W8 i 对于电池回路对电流波动产生了影响,那我们看原理图发现其实在电机的地和控制系统的地是单点连接的啊,已经把影响降低了,所以我又否定了第四个猜想。8 W$ m* |: V- ? ! _! m! y' X, X$ n 至于程序,那再给我几天时间我可能还是找不出问题,因为我之前就是怀疑程序问题,已经把各种可能性都排除了。 1 u! P$ } @6 _" _3 B4 t/ L6 } 换个脑子不好用,那就继续回到板子上,进行测量,一个点一个点进行测量。! B+ l, ]+ z) l) @0 `% v2 d 首先让有问题的系统先工作,然后测量电池电压,发现电池系统在启动的时候,电池电压会逐渐降低,一个充满电的电池电压大概为4.2V,在电机加速的时候,这个电压逐渐降低,然后变到2.8V,这是不是就是问题的原因呢?. _7 z0 O! D* k6 Z( O0 i; E7 o 然后顺藤摸瓜,继续往下差,测量3.3V电系统。9 G' a" n& p3 V 发现当电机转之前这个电很稳定,就是3.3V,然后随着电机转到一定转速之后,这个数字突然开始下降。从3.3V变到2.8V之后电机突然变为0,然后电机停转,过两秒钟之后电机又开始起转。' T5 V1 k& J/ w $ z& o7 N& L5 m" I9 p; d3 N 发现新大陆了呀。/ }$ A; C; j) v/ P* _ + C! a/ F0 X5 n6 G* Q 根据上面的情况,我们不难推断出,一个简单粗暴的事实(这时候我开始想,这么简单的问题为啥之前绞尽脑汁都没想到呢)——电机转速达到一定值之后,系统掉电重启了,这就很容易解释为啥电机会转动到一定转速之后停下,然后又开始起转,这样的实验现象了。 那么为什么会突然掉电呢?当然是1117出问题了,这时候我就开始想了,之前测试的时候电池电压已经到2.8了,那么很明显已经低于1117要求的输入电压了啊。1117-3.3的输出是3.3V,而输出应该在4.5V左右,但是在低于4.5V不多的情况下依然可以工作,可是你现在已经低于输出的3.3V了,他肯定要罢工的嘛。: t- c0 V2 O( x% a0 N 所以系统掉电很正常嘛,但是为啥不是直接从3.3变为0呢,我测量的时候输出是从3.3慢慢变到2.8V之后然后突然变到0的,其实很简单,因为输出电容有蓄电能力,它有一个短暂的放电过程。" v, H% g! e/ Q! } 1 K( W6 X! r$ G% a5 |( x 整个结论说明一个问题:原理图有问题,而且有大问题。整个板子压根就不能用,而且小修小改都没用了。那么我们需要寻找新的降压方案。5 \8 h8 U. R" D: c/ R 4 Z7 J- A; r& [( A$ S) l# n& R* M 之前我找了很多原理图的问题,但是没有用过锂离子电池的我,天真的以为他的电压是非常稳定的。结果他给我整了这么一台戏。, x0 W: ]0 `3 b+ H) g 那么有人就问了。这电池也太不经用了,为啥电压这么快就降低到2.8了。 我告诉你,其实并不是电池电压降低了,而是电池电压被拉低了。/ }/ {+ W. N6 x; S 这时候我开始有头绪了:$ _& N- v3 Y/ O 一个空心杯的电阻是1欧姆左右,那么四个并联起来是多大?是不是0.25欧姆左右了。而锂离子电池是不是有内阻?肯定有了,而且锂离子电池的内阻是一个非常复杂的东西,这个你百度一下就有了。电池所带的负载电阻很低,而电池本身有内阻,这样电池内阻就可能会带来很大的电压降,所以电池对外输出的电压就降低了。5 G# Q" x! {4 ]0 O ) t; e$ m! A' f0 p* z( P 所有的电池都是这样的,这个我们没办法从根源上解决,那么我们就想办法曲线救国。9 ^& ^. x5 Y& q' ?; ]1 x - u. f$ |, N2 k1 f7 U( P- m: D, L 网上主流的解决这个问题的思路有两种: 1、先升压到5V再降压,这样保证电池输出电压降低之后,单片机系统依然有稳定的电源供应。- m" k9 N0 s1 z9 O& L% d& f# q 2、采用更低压差的LDO。这个从一定程度上能解决问题,但是我想,这种情况最起码要保证电池电压在3.3+差压之上,而且四轴在飞行的过程中不能有剧烈的调整,因为电机在剧烈加速的时候,需要的电流很大,会进一步拉低电池电压,可能直接导致在空中翻转的时候瞬间控制系统掉电。) r6 c- X' y' v% ?- d 综合方案1和方案2,我肯定选择方案1。, ?- E8 L7 r- a }/ b4 n: a4 ?' R / f8 C8 o* h& u. {" x6 |. z 然后在网上买了几个降压模块。为啥买模块?是为了验证自己的想法究竟对不对。买到的模块如下:+ f& H5 ~# c8 G: d% h3 p 然后大概对四轴的电源系统进行了一下改造,使用这个东西先升压之后再降压给单片机供电,发现非常稳定,可以保证电机持续运行在最高转速直到电池电量几乎耗尽(当然,在使用过程中尽量不要把电池电量完全耗尽,可能会导致不可恢复的损失)。 " Q' |& T, @9 J9 A2 ~/ U+ o) } 接下来我提出了如下方案:3 p& l$ X i! G. ?6 K, g- B6 ` 采用SX1308把电池电压升压到5V,然后使用500ma电流输出,低差压的LDO——HT7833把5V稳压到3.3V供单片机和蓝牙、无线等使用。8 Q& Z6 i- L1 t) f$ ` * a9 ^6 D" c) ^* n$ M& {( r 其中升压模块的电路和布局完全参照1308的文档。7833电路参照合泰的文档,我需要做的只是给7833输出之后加了一个0值电阻,然后把数字地、模拟地、电池地给分来了,然后采用0值电阻连接。当然这三个电阻的封装、精度都是很关键的。0值电阻的用法,我会在后面仔细写出来。( d/ V; ^( @% {* f$ m7 d. D6 P" { 7 a. w/ M- |4 [( a2 T4 g 这一版电源方案放在这个小四轴上而言是比较奢侈的,因为一个7833毕竟就不便宜了。但是非常稳定,毕竟无线和蓝牙的顺势电流可能很大,加上有人可能会扩展GPS模块等,所以这个500ma的电流先准备着就行了。+ U& K, V# K) U2 U' h- @ * M1 y' `- `6 s- z 然后我把修改后的PCB打样结果如下: 这里大家会发现,这个板子的形状比起之前这个有所改变: ( a" z/ V. d4 F& n . o- g0 j4 l* O+ `; B' e, ~ 因为考虑到增加了很多元器件,所以板子尺寸必须增加,于是增加了中间放置元器件的部分的面积,另一方面,电机安装孔周围尺寸并不需要那么大,所以进一步降低,然后做出了前面那个图的PCB板。 , i: g2 [2 c4 V* p 这个板子经过测试发现一切ok。电池电压带来的风波告一段落。/ U; b2 y3 O, [* D6 K 把这个环节涉及的一些文档上传上来:, H% G" t% f, V) Y |
对于这种系统的供电,一般才用的解决方案都是DCDC(开关电源)+LDO(线性电源)。至于开关电源和线性电源区别我在这稍微介绍一下(这个很简单百度一大堆)。. s4 Q* G2 w7 l+ W) ]
1、开关电源是直流电转变为高频脉冲电流,将电能储存到电感、电容元件中,利用电感、电容的特性将电能按预定的要求释放出来来改变输出电压或电流的;线性电源没有高频脉冲和储存元件,它利用元器件线性特性在负载变化时瞬间反馈控制输入达到稳定电压和电流的。
2、开关电源可以降压,也可以升压;线性电源只能降压。
3、开关电源效率高;线性电源效率低。, y: [1 r, q+ u% s5 U# q. j
4、线性电源控制速度快,波纹小;开关电源波纹大。
4 h/ a: x% y0 c7 Q
帖子中问题的主要原因其实就是上述的第二条,线性电源LDO只能降压不能升压,所以当电机大功率运行时,电池由于有内阻的原因将输出电压拉低,导致LDO输入电压过低,LDO无法正常工作,系统reset。而系统reset后,回路电流变小,系统又可以正常工作,进而反复故障。所以最好的解决办法就是前端加一个开关电源把电压稳定在5V左右,然后再用LDO降压至单片机的3.3V工作。就是boost+ldo解决方案。" b C' r, ]& q4 \% j
这样就有同学会问,为何要用两个电源,既然LDO不好用,为何不只用一个DCDC直接将输出稳定在3.3V就可以了呢?这个问题29楼其实已经解释的很好了,不过我再补充两点。这个就是上面说到的第4点,开关电源纹波很大,而线性电源纹波很小。一般单片机用到的DCDC电源纹波在几十到上百毫伏不定。这种用单DCDC给单片机供电有一个功能会严重受影响,那就是ADC。大家都知道ADC的基准电压是由VDD和Vref来决定,先不说Vref,单说VDD,就拿STM32的12位ADC来说,ADC分辨率3.3/4096=0.8mV,而如果你的供电电源有几十甚至几百毫伏的纹波,那么测量出来的ADC数值会浮动非常大,为以后滤波算法造成很大影响。不过其实这个纹波大小,一般的单片机都可以承受的了,因为MCU等数字电路都有一定的噪声容限,只要不超出该容限就可以工作。但这样的系统品质和可靠性均不佳,所以应改进电源设计并加强滤波、去耦。所以DCDC+LDO的解决方案就诞生了,这也是现在最常用的MCU电源管理解决方案。
评分
查看全部评分
你qq联系我(465449409)
一开始没想到这方面,,,,
。内容详细。
文中:& t' ?, ?# B& _( O$ O
1117-3.3的输出是3.3V,而输出应该在4.5V左右 . I! |$ p! X h( Z5 b E
//此处应为输入吧?/ C( g, @* t/ E* |! V) o
其次:买的模块是升压模块吧?+ @, ]5 q. \* c% a D6 r; e
一点一点碰壁的。。。。
对的,你看的很仔细
不懂也可以慢慢学习直到懂,。。
点评
谢谢。
遇到问题,折腾两周把问题找到,瞬间感觉一开始好傻,一直在朝错误的方向分析
对,尤其自己画的板子,应该要明确的知道每个点应该是什么电压,那如果不是这个电压,就要考虑是什么原因造成的
我就喜欢把弯的掰直了