代码改变世界

Boost PFC调试Bug与数据类型强制转换异常(极度重要)

2021-10-15 19:45  斑鸠,一生。  阅读(562)  评论(0编辑  收藏  举报

        最近小弟在调试一个Boost PFC电路,出现了下面一个现象:

        程序正常运行一段时间,然后突然输入电流增大,突然短路。

        图一:正常运行时,各关键信号波形;

                  通道一:Boost 变换器开关管驱动电压波形;

                  通道二:输入电压波形;

                  通道三:输入电流波形;

                  通道四:Boost 变换器输出母线电压波形;

 

 

 

 

 

 

 

 

 

 

 

        图二:异常时,各关键信号波形;

                  通道一:Boost 变换器开关管驱动电压波形;

                  通道二:输入电压波形;

                  通道三:输入电流波形;

                  通道四:Boost 变换器开关管Vds波形;

 

 

 

 

 

 

 

 

 

 

 

           现象分析:

                  1、注意看异常时的驱动电压,

                  当发生过流时,有好几个周期的占空比都特别大;

                  2、按照负反馈的思路,

                  当输入电流大于设定时,输出的占空比应该是减小的。误差越大,占空比减小越大。

                  3、而,现在的现象是:

                  当输入电流大于设定值,输出的占空比并没有减小。仍然保持这最大占空比。

                  4、如果是参数的P、I值不对,那么。前面的电流波形应该也不会正常。

            最后发现是软件数据类型强制转换错误,本应该输出最小占空比的,却输出了最大占空比。


             软件分析:

                  signed int的数据类型:最高位是符号位,其中,1为负数,0为正数

                  unsigned int 的数据类型:没有符号位。

                  这也是造成转换误差的根源。

                  数据类型的强制转换,本质来说是同样的二进制,使用不同的识别方式去识别二进制。

                  例如:

signed int a = -1;
unsigned int b;

//Calculate
    b = a;

//Test result
    b = 32769;

                    对于16位的二进制,1000 0000 0000 0001;

                    数据类型为 unsigned int 表示值为:32769;

                    数据类型为 int 表示值为:-1;

                           那么:

                                  理应最小值,变成最大值了。

                                  理应最小占空比,变成了最大占空比了。

                            所以,出现了图二显示的电路短路。

unsigned int IL1_Duty;
signed int IL1_Sum;

//数据转换出错,按理应该是最小占空比,变成了最大占空比。
       IL1_Duty = (__builtin_mulss(IL1_P,IL1_Err)>>8) + IL1_Sum;                 

        IL1_Duty = (IL1_Duty > 10232)?10232:IL1_Duty;       //Duty < 1
        IL1_Duty = (IL1_Duty < 1024)?1024:IL1_Duty;        //Duty  > 0.1

  总结:(以int 为16位为例)                             

           对于unsigned int 强制转换为signed int:

                        当unsigned int 在对应int数据类型的正数范围内时: 强制转换不会造成异常;

                        当unsigned int 在对应int数据类型的正数范围外时: 强制转换会变为负数

                          实际转换公式为:b = - (a - 2n-1),其中n为进制位数。

                        经过输出占空比的限幅,那么最大占空比可能变成最小占空比。

unsigned int a = 100;
signed int b;

//Calculate
        b = a;
//Result
        b = 100;
unsigned int a = 32769;
signed int b;

//Calculate
        b = a;
//Result
        b = -1;

         对于signed int 强制转换为unsigned int:

                       当signed int 在对应unsigned int数据类型的正数的一半范围之内时: 强制转换不会造成异常

                       当signed int 在对应int数据类型的正数范围之外时: 强制转换会变为很大的正数。

        实际转换公式为:b = - a + 2n-1,其中n为进制位数。

                       经过输出占空比的限幅,那么最小占空比可能变成最大占空比。

signed int a = 100;
unsigned int b;

//Calculate
        b = a;
//Result
        b = 100;
signed int a = -1;
unsigned int b;

//Calculate
        b = a;
//Result
        b = 32769;

             后序:

                      对于数字电源来说,由进制转换造成的占空比变化趋势相反,这属于致命的错误。因此,在平时应细心学习。