1、开始选择dma方式去采样,读出ad采样的数据值波形是正常的。移植完计算相关的函数后,计算的值相对实际的值有较大的偏差,此时修改固有系数,计算的值没有发生相应的变化,将固有系数改为0后,依然不会有变化;将固有系数改大后会出现很小的变化。检查程序的计算部分,发现计算单项电压电流的公式中,for循环的计数部分出现越界,导致数组计算的也出现错误,修正后,计算结果可以通过改变固有系数来调整。
2、此时计算出的电压和电流值在电压和电流较小时跳动很小,电压电流加大后,计算的值跳动很大,但采样的波形是很完整,跳动很小的,按照之前的方式进行采样,修改ADC采样方式。
3、改变adc采样的方式为查询的方式进行采样,计算的值依然有很大的跳动,并且不像之前计算的数据有一定的规律,计算后电压和电流的数据交错出现。此时读出波形的数据不正常,通道之间的数据是混乱的。尝试过改变采样时间,结果是无效的。经过查看相关寄存器,发现在切换一遍通道后,所有的通道依次都被打开了。经过查找原因是库函数中在配置通道寄存器时,ADC1->CHSEL |= ADC_Channel;这样一来,所有的通道在切换一遍以后,就所有的通道都打开了,导致转换的结果不正常。将库函数略作修改后,采样数据波形正常。
4、此时计算仍然会有很大的跳动,尝试将10个连续的波形数据采样出来(采样波形是正常的),然后直接将首个波形和最后一个波形的数据带入程序中,直接进行计算,发现有很大的偏差,确定是计算相关程序部分有错误。在程序中加断点,单步跟踪计算数据,查看FFT计算后的数据不正常,将Acuvim393的FFT程序移植过来,计算结果正常。
5、此时只加一相电压,在MBDebug上读出数据三相电压都有,并且完全相同,电流只有A相和B相有;检查采样程序后发现之前修改过的采样点数没有修改回来,导致采样数据的数组出现越界,后面的数据被覆盖了。修改采样点数后,采样计算正常。
总结:
1、尽量按原有的机制去进行移植修改。
2、计算相关的部分出现问题,先检查逻辑有没有问题;然后检查相关数组部分是否有越界,数据类型是否产生截断,导致结果错误。
3、STM32部分硬件跳转Hardfault IRQHandler是由于数组越界导致的;
4、使用库函数,注意应用的正确性;
5、在修改程序的过程中注意备份并说明,这样可以减少来回修改程序的时间,方便查找问题,提高工作效率;
6、注意理清思路,按照既定路线逐个排查问题,多动手记录相关测试部分。