对比两个流程可以知道:如果不考虑相位问题,那么可以使用DMA+ADC采集数据,比如0.5s开启一下DMA与定时器采集一次,采集到的100个数据保存在数组里面,关闭定时器与DMA,采集好以后进行处理一下存储在当前电压值的变量里面,但是这样的一组周期内的电压,存在着可能无法判断是否错相的情况,比如采集ABC三相,当A出现下降沿过抬高电压位置时,开始计时,可能从这时开始到这个周期结束没有发生B相出现上升沿过抬高电压的情况,这样判断错相就会出现问题,当然,也可以直接使用DMA+ADC去类似0.2ms就进行一次转换,不间断的进行这个流程,这个方式我认为与0.2ms手动开启AD转换,不经过DMA传输直接读取寄存器ADC-DR的值相差的功耗不大。(待测)
根据100个离散点求得该引脚的电压的有效值: 均方根公式:
这个网上不少,直接百度即可Xi为离散点的电压值,N为100,Xrms为电压有效值 其中要注意的是:Xi²实则为(引脚处电压 – 抬高电压)²
下面为正相序时的波形图:
改天抽时间重画,原来的文件没了譬如检测AB有无错相,当A出现下降沿并且过0点时(实际程序中是过抬高电压值时),开始计时,当B出现上升沿并且过0点时停止计时,这段时间T = 16.67ms,如果考虑一些特殊情况,比如电压的频率波动,开启计时的时间存在误差,可以假定T ≥15.5ms,AB为正相序。 下面为反相序时的波形图:
由此图我们可以看出,依旧像上面说的那样,在A(假定是A)相电压出现下降沿过0点时开启计时,在B相电压出现上升沿过零点时停止计时,此时时间远远小于正相序时的时间,如果无误差时T = 3.3ms,考虑到上述误差影响,那么我们把时间T ≤3.6ms时判断得AB为反相序。在程序中扩大了一下范围,把这个判断是否为反相序的时间调整为4.0ms,如果这段时间小于4.0ms,那么就认为是错相,大于的话默认为正相序。
<1>. 当存在缺相时,不执行错相判断函数; <2>. 当存在缺相时,将通信返回的内容里面的错相位置为0,只将缺相对应位置为1。 <3>. 当不存在缺相时,只判断AB是否错相,从A出现下降沿过0点开始计时,B出现上升沿过0点关闭计时,判断是否小于4.0ms,若是,则将错相位全部置为1,如果不是,全部置为0。 <4>. 关于缺相判断,在求得电压的有效值后,有一个范围,目前设定为50mv,如果小于50mv,说明该相电压缺相。