失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 基于FPGA的FOC电流采样Bug调试记录

基于FPGA的FOC电流采样Bug调试记录

时间:2023-06-08 12:46:44

相关推荐

基于FPGA的FOC电流采样Bug调试记录

#基于FPGA的FOC电流采样Bug调试记录

博主在调试FOC闭环控制中遇到了一个bug,冥思苦想两三天,最终一步步地调试时序,最终找到了bug,在调试过程中学会了debug的思想,也明白了调试过程中要循序渐进,采用一步步的排除bug,先排除硬件bug,在排除软件Bug,软件bug通过时序一步步排除问题,最终找到是哪个环节出了问题,谨以此博客来记录这次难忘的调试经历。

Bug现象

本次FOC出现的BUG主要是电流采样的问题,电流采样是针对三相电机的相电流进行采样,正常情况下应该是复制相等相差120°的正弦波,然而我采出来的是相位相差120°,幅值却相差迥异的正弦波。

通过上位机测出的ADC输出的Ia、 Ib 、Ic的ADC值如下图所示(范围为0-4095),其中两相电流的ADC值为900多、另外一相位3000+,相位是正常的,幅值却相差很大。

三相重构电流的波形如下图所示。从图中也可以看出异常情况。

电机正常运行时,其三相电流应该如下图所示。

而我出现的bug如下图所示,电流采样是FOC闭环控制的关键所在,如果电流采样出现问题,那么电机必不可能实现FOC控制,因此如若想要实现电机FOC闭环控制,要保证电流的采样正确。

调试过程

根据现象,首先思考是电流采样环节出了问题,通过分析潜在的bug原因有这几方面:

硬件电路焊接错误或接触不良电机本身就存在故障直流偏置出现异常,所以导致幅值出现偏移软件代码逻辑出现问题芯片出现问题(概率极低)

针对这三个方面的问题,要进行一步一步的判断和分析,原因1方便判断,用万用表一步步地测量几个关键信号的电压及导通状态,即可判断出并不是硬件电路的焊接和接触问题。

为了验证是否是直流偏置的问题,应该首先让电机工作在开环FOC状态下,看电机在开环条件下的电流信号是否正常,结果发现电机在开环条件下正常转动,但电流采样仍处于上述的异常状态,通过电流钳测三相电机的相电流,可以看出幅值、相位正常,**因此可以排除是电机的问题。**为了验证是否是直流偏置的异常,正常情况下应该是1.2V的直流偏置信号,这个偏置信号是为了使ADC的输入采样点压范围为0-3.3V,通过示波器观察直流偏置信号发现是一切正常,同时观察到采样的波形也是三相相差120°的正弦波。这说明ADC侧的输入波形也是正常的。因此故障的范围进一步缩小,ADC输入侧信号波形正常,而输出侧波形异常,因此一定是采样转化的过程中出现问题。初步排除硬件问题。

调试到这里我意识到大概率是软件代码的问题,但ADC转化的代码通过modelsim仿真过时序,一般情况下不会出现问题的,但现在已排除了硬件的问题,所以有且仅能是软件的问题,AD是通过SPI来进行传输数据的,因此我通过singal tap来检测FPGA内部信号,主要检测SPI的输入输出端口的数据是否正常。

这里主要关注SPI的输入端(即AD输出端的数据),A、B、C三相的十进制数据分别为1987、1983、1981。与AD输入端的模拟信号相符合,这说明AD转化部分是正常的,有可能是在SPI读取数据中出现了问题,通过复杂的内部信号debug,最终发现读取数据的SPI miso输入端端口数据(AD输出端端口数据)时,16位数据整体右移一位,通道位数据占据了数据位的数据。从而导致出错,但反复查代码,仍未找到哪里出现了bug。

bug原因

刚开始以为是Verilog代码中沿下降沿采集数据,16位数据中只采了15次数据,按照时序分析,可能是SCK第一个下降沿的数据没有采进去,但修改采样时机,仍然出现这个问题。

经过分析,我觉得真正的问题不在于少采了1bit,其实当初我应该是考虑到少采1bit也是没问题的,反正通道号我们也不要。真正的问题在于在sck上升沿采样是不稳的,我现在是sck上升沿采样。我记得你提到过应该下降沿采样,如上图所示,蓝框框的12个上升沿是现在的采样点,但问题就来了,此时miso是处在跳变的边沿的,不稳。如果采到边沿后,就是对的。如果采到边沿前,就是错的,我这里对,你这里错的原因就在于,你用杜邦线了对吧,杜邦线的长短可能导致它采样到跳变沿前了。而我是专门画的FPGA板子,插上去的,采到的是跳变沿后。所以应该改成sck下降沿采样,此时miso是稳的,杜邦线拉多长都不怕。

核心原因就是因为应该是sck下降沿采样,但程序中写的sck上升沿采样,然而如果采用上升沿采样,我又采用的杜邦线,杜邦线的长短可能导致它采样到跳变沿前了。sck是输出,miso是输入,sck从fpga传到ad7928,miso再从ad7928传回来,如果整个路径很长,在fpga侧看来,就好像miso右移(延迟)了一段时间。这样的话就是相当于是四根线的延迟叠加了。其实这里不该这样的,因为是高速spi(sck频率十几mhz),常规做法应该是画到一个板子上,拉杜邦线有问题也是正常。高频信号线好像应该尽可能短,最好应该是要做出板子对插的格局。但代码确实应该改成下降沿采miso,这样能容忍更长的杜邦线。

最终解决了这个问题,得到了三相电流波形,如下所示

debug的步骤及经验

SPI时序正常就好,但主要你要直接看看SPI波形里面的读数

直接通过看SPI波形来看ADC的读数,看看偏置是否也不正常

我把这种debug思想叫做二分debug法,步骤是:

发现问题:ADC读数不正常用经验思考问题可能出在什么地方,尽量想全,不要有侥幸心理漏下任何一个可能。比如这个问题里,可能出问题的环节有:A.电压本身在板子上就不对了 B.读取电压的ADC读取器不正常 C.读取ADC电压的读取器正常,但数据在后级逻辑中的传播不正常用一定的手段排查问题出在哪个环节。比如我上次让你用示波器直接测板子上SOA,SOB,SOC的波形,就是为了排除A

一般除了问题,首先要思考出来一条链:A->B->C->D->E->F……,每个环节都有出问题的可能。二分debug法的思想就在于,从中间一个环节检查是否除了问题,比如查看C->D传递的数据是否有问题,如果有,那么问题就缩小到A,B,C环节。如果没有,那么问题就缩小到了D,E,F环节。然后递归继续二分

关于杜邦线的问题

杜邦线会造成信号延迟,尤其是高频信号延迟,而不是衰减

一般经验上讲,对产品设计,>10mhz的信号都不要拉杜邦线。

关于杜邦线的问题

杜邦线会造成信号延迟,尤其是高频信号延迟,而不是衰减

一般经验上讲,对产品设计,>10mhz的信号都不要拉杜邦线。

但原型机设计可以不那么考虑稳定性,拉杜邦线也行,只要能跑就行

如果本博客对您提供了帮助,那就麻烦点个赞吧

如果觉得《基于FPGA的FOC电流采样Bug调试记录》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。