zoukankan      html  css  js  c++  java
  • Boost PFC调试Bug与数据类型强制转换异常(极度重要)

            最近小弟在调试一个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;

                 后序:

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

  • 相关阅读:
    thinkphp5整合 gatewaywork实现聊天
    php输出日志
    php的ob函数实现页面静态化
    30个php操作redis常用方法代码例子
    redis三种启动方式
    Redis实战
    支付宝即时到账接口开发
    PHP生成excel表格文件并下载
    微信平台提供三种公众号
    【Performance】chrome调试面板
  • 原文地址:https://www.cnblogs.com/cjyc/p/15412435.html
Copyright © 2011-2022 走看看