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;
后序:
对于数字电源来说,由进制转换造成的占空比变化趋势相反,这属于致命的错误。因此,在平时应细心学习。