上周主要完成的是硬件电路搭建:驱动电路和主功率变换部分,由于时间紧张加上烧毁了主片,心情不佳,就没有实时更新。
驱动变压器绕制,初级20T,次级30T+30T,共需要要两个驱动变压器以驱动两组:
驱动变压器绕至好后,搭建驱动电路放置到驱动板上,方便调试。由于调试过程中的手误,将主芯片烧毁,心疼啊……,迅速从网上订购5片,万幸没有烧掉板子上的下载器。
本设计使用的MC33151是负逻辑导致,即使将引脚配置成上拉,开机上电瞬间也会出现误动作,看来非得外加上拉电阻方可。但是这样调试起来不是很方便,于是在MC33151前分别加了两个NPN的三极管SS8050作为反相器。驱动电路分享给大家,欢迎讨论:
图:双路驱动电路原理图
左边的二极管为保护二极管,烧毁一个片子后吸取的教训,这样做有两个好处:一、防止误操作(比如笔者)高压倒灌入MCU;二、运行时,防止毛刺电压干扰到MCU.变压器绕制,要注意同名端,其实就是一个方向问题。如都是用顺时针绕制,起绕为同名端,就不容易出错了。先饶初级再绕次级,绕好一个再绕一个。
图:驱动变压器半成品
图:驱动变压成品
图:驱动板最终成品
主功率部分制作,原理图已经上传过了,采用交错双端正激,只是外加了整流电路,没有使用主动PFC。变压器次级过大电流采用2mm*4mm铜条绕制,初级采用1mm漆包线绕制,初级:次级=32:4,主变一共两个。另外需要一个滤波电感,通用使用铁氧体绕制,不过要加气息。使用2mm*4mm铜条双根并绕,单根经过做实验,100A电流是发热量太大。
图:主功率变换部分原理图
图:主功率部分实物图半成品
整流二极管采用MBR60100三管并联,不要小瞧这个TO220封装的管子,搞到手时笔者也不信,这么细的引脚能过60A,于是用手头上的电源加到了60A,发热量很大压降在0.8左右,硬是抗住没有烧坏,请收下我的膝盖,但是一定要固定在散热片上,发热量非常大。
初级比较好处理,电流并不是很大,暂定使用4个IRF840(8A 500V)。
背部次级走线也本着两根铜条,防止发热量过大,小电流是过流没问题,但是大电流时一定要谨慎,否则发热很严重。
图:主功率变换部分背部走线
图:主功率变换部分成品(加了整流和LC滤波)
至此功率主板搭建完成,手都快磨出泡来了,当然也可以直接做PCB,但是亲自动手搭建能发现非常细节的问题,为以后PCB的设计,提供非常好的参考,磨出泡也是值了。
接下来将进行程序调试,及上电测试。
现在遇到三个问题:
第一个:经过驱动后输出占空比发生变化;
第二个:交错正激,在电感处并联,并不是单纯的的两个两个正激变换的叠加;
第三个:dsPIC33EP64Gs502 内部12bit AD转换器稳定度与线性度的问题,这个和内部PGA类似,不是特别稳也不是特别准;
先说第一个:MCU输出占空比47%左右,结果到隔离驱动输出已经达到了53%,中途忘记拍照片了,应该可以想象的到,上电的后果,光是驱动变压器都会饱和,拿33V实验电源加上,异响非常大。最后找到原因是是三极管反相器上啦电阻太大导致的,调整上拉电阻,是输出占空比接近(或略小于)设定值。最终确定上拉电阻在200R左右。占空比的问题解决了。
再说第二个:都是在外加33V实验电源下测得,先上图
图:只有一路工作的双管正激,波形很正常 CH1:Vds CH2:Vgs
图:两路工作的双管正激 CH1:Vds CH2:Vgs
当两路同时工作时由于共用一个电感和续流二极管,二者相互影响,起初觉得波形应该是二者的简单叠加,但是实验结果很是不一样,控制dsPIC33调整占空比,波形确实发生,而且确实是二者相互影响的结果,仔细查阅资料后发现是二者交错后变压器次级在管段期间不是被钳位到0V而是输出电压导致。确实也有类似波形,暂且认为是正常,同时也发觉这样并联续流二极管工作频率很高,损耗也会增加,所以效率上会受影响,没有完美的方案,但是减小了输出电感的体积。
起初担心二极管反向恢复的问题,但是考虑到使用的是肖特基,续流二极管应该问题不大,而且在散热器的边缘,离风扇最近。
图:CH1 :Vgs CH2:整流二极管侧电压
第三个问题解决中……欢迎大家一起讨论
关于AD线性度和稳定度的讨论:
dsPIC33EP64GS502这款单片机自带的AD在外加稳定电压情况下采样的稳定度还是可以的(仅测试的单端采样),但是线性度和满度上差强人意:理想的情况下是从0到4095(12-bit)但实际上mV级的电压采样有问题,而且将电压接到电源正上,采样值竟然不是4095。因为当初烧掉的处理器,是能到达4095的,后来新买的片子却只能到达4050左右,连续实验了两片都是这样,理想和现实的差距,但是可以理解AD都有线性区。后来买的片子对应下图的“实际情况1”而开始的可能对应“实际情况2”。只要是一条直线就可以通过软件算法来校正,实验情况也确实如此,笔者将对应“实际情况1”的片子校正到了理想状态,即:将y=kx+b变成了y=x。除去开始一小段非线性区,之后测量还是很满意的,说明AD的采样值是一条直线,对于刚开始的一小段非线性区,可以通过叠加电压到采样电压来“隐藏”,这样便可以实现整段的线性。
如果在补偿时调用浮点运算,肯定会非常耗费CPU时间,处理器提供了Q15内建函数,可以加快运算。但是,有更简单的办法:这个过程是可逆的,我们设定输出电压也可以校正到AD的输出值,这样就解决了AD采样的问题,这样就校正一次就可。AD采样时有偏差,我们设定值时考虑上偏差,这样将输出设定的值。
另外AD提供的准差分采样能否实现较好的线性度和零点问题有待进一步实验验证。
图:AD采样理想情况与实际情况
本周主要处理数字环路问题:
使用的硬件加速,自动切换CPU上下文,由于汇编是笔者的盲区,对于汇编笔者也就停留在mov的认知上了,尽可能避开汇编用C语言来实现。具体步骤如下:
1、加入MicroChip的数字环路控制库
官网下载路径http://www.microchip.com/SWLibraryWeb/product.aspx?product=SMPS%20Control%20Library
内部有使用手册,但是不够详细,这里给出笔者的配置步骤
1)将接口文件smps_control.h"包含进自动的工程中,如笔者的:使用Brow加入包含头文件的文件夹即可
2)加入工程文件,这个调试的时候用的着
这次加入的是*.x的工程文件
3)加入编译好的库文件这次加入的是*.a文件
至此就可以调用MicroChip的数字环路控制函数了。
2、初始化备用寄存器
初始化备用寄存器,本来打算使用asm(“mov xx,xx”)来实现,发现宏在asm中始终报错,头文件也加入了,但是宏在汇编中无法调用,无奈放弃了。只能使用汇编文件了,于是仿照例程新建汇编文件了,但是默认的新建的汇编文件扩展名是”.s”,始终编译不过去,最后鬼使神差地把扩展名换成了“.S”,竟然奇迹通过了,Mplab X 还有这个要求。越是“简单”的问题越是难以发现,身心俱疲,导致后来写好了却忘记调用,一系列连锁反应,没用初始化带来的是更加诡异的问题……,所以注意两点:一、asm(””)无法调用宏定义,二、汇编文件最好用“.S”。就不贴代码了,历程和官方文档都有。
3、调用
使用了自动切换上下文,前面已经提到MCC如何配置在中断文件中计入即可:例如
void __attribute__ ( ( __interrupt__ , auto_psv , context) ) _ADCAN1Interrupt ( void ) { if(curDps.mode==0) PDC1 = 0; // stop if(curDps.mode == 1) // cv mode { // don't read or write any thing in this section asm("mov _voltageControlReference, w0"); SMPS_Controller2P2ZUpdate_HW_Accel(); } curDps.voltage = ADCBUF1; // show the test value //clear the ADCAN1 interrupt flag IFS6bits.ADCAN1IF = 0; }
注意:由于CPU运行在备用寄存器,所以一旦进入到如下程序
asm("mov _voltageControlReference, w0"); SMPS_Controller2P2ZUpdate_HW_Accel();
就不要再访问里面的任何变量,否则也会带来诡异的问题,具体原因是中断函数工作在备用寄存器,而外部调用时工作在默认寄存器,常理说不应该出现问题,但是可能xc16编译环境支持不好(猜测),所以最好不要访问,如上例中如果修改voltageControlReference可能出现问题。
总结:
1、C和汇编混合编程时,汇编中无法调用宏文件(目前暂且这么认为)
2、汇编文件最好用大写扩展名“.S”
3、数字控制环路函数一定要初始化,不初始化编译不会报错,但是运行肯定玩完
4、使用备用寄存器做硬件加速,一定要注意CPU的运行环境
如有遇到类似问题的,不妨从上面几个方面找找问题。
本周遇到了诸多非常诡异的问题,总算跌跌撞撞,数字环路函数控制函数总算能调用了。诡异地一周,就在今天,笔者骑的共享单车,上下楼的功夫就没了(费用随时间增加的),调了监控发现没有骑出小区,最后发现不知被哪个哥们放到地下室了,从地下室推出来都费劲,哎无语了。
再谈AD采样和备用寄存器的
AD采样问题:
AD采样的线性问题如前讨论可以通过软件校正,硬件抬高电位避开非线性区,而差分采样并不能避开小电压信号时的非线性区,也就是说差分采样无法避开非线性区。本设计的电流采样和电压采样是共地的如图:
用二极管将要采样的信号抬高大0.5V左右,避开非线性区;而电流采样将无法使用单端放大,可使用差分放大,但是实验证明PGA的放大效果不是太理想,电流信号直接采样电压最大不超过500mV,而且干扰很大,暂时放弃恒流功能,仅实现恒压功能。如果内部AD的能对于mV级电压的测量,那么实现恒流功能就没问题了。
与硬件加速相关的备用寄存器问题:
1. 采用自动切换,ADC中断关联备用寄存器,意味着切换到中断中时不能进行其他操作,只能是:
// asm("mov _voltageControlReference, w0"); // SMPS_Controller2P2ZUpdate_HW_Accel();
但是采样电压要随时能控制启动和停止,通过关闭中断能实现,但是存在一定的隐患可能导致占空比没及时关闭,不打算使用这种办法,一旦加入其他C语言代码,就有可能破坏备用寄存器中的数据(汇编直接操作用户寄存器是没问题的)但是汇编优势笔者的软肋。所以放弃了硬件加速功能。实验中也出现程序异常的情况,最后定位便是硬件切换导致的。
2. 手动转换,asm("CTXTSWP #0x2");之后不要有其他操作。但是也出现了问题,查看汇编指令能解决,但是还出现诡异的问题,算了放弃。
3. 干脆不适用硬件加速,总之这样问题解决了,没有出现异常,不用硬件加速总能使用dsp指令加速。这里需要注意,官方库中没有编译,需要自己重新编译下生成库文件,还又出现了一个非常诡异的问题:数字长度按照手册的2233,总是报错section冲突,但是改成3333奇迹般的通过了,这是什么*¥%!太诡异了!出这个问题也是醉了,解决他也是死了不少脑细胞。
报错
// so stranger !!!!!!!!!!!!!!!!! int16_t voltageController2P2ZControlHistory[2] __attribute__ ((section (".ybss"))); //2 int16_t voltageController2P2ZACoefficient[2] __attribute__ ((section (".xbss"))); // 2 int16_t voltageController2P2ZErrorHistory[3] __attribute__ ((section (".ybss"))); // 3 int16_t voltageController2P2ZBCoefficient[3] __attribute__ ((section (".xbss"))); // 3
编译通过
// so stranger !!!!!!!!!!!!!!!!! int16_t voltageController2P2ZControlHistory[3] __attribute__ ((section (".ybss"))); //2 int16_t voltageController2P2ZACoefficient[3] __attribute__ ((section (".xbss"))); // 2 int16_t voltageController2P2ZErrorHistory[3] __attribute__ ((section (".ybss"))); // 3 int16_t voltageController2P2ZBCoefficient[3] __attribute__ ((section (".xbss"))); // 3
4. 继续谈个诡异的问题
在AD中断中删除关于ADCBUFx的操作,上电就死机,至今也没发现原因,不过这个确实也符合操作,在AD转换中不操作AD结果,你还想干啥。
220V上电测试
解决完这些问题,第一次220V上电,由于内部掉了块焊锡,导致放电少了一路MOS管,但是并没有发现,只发现最大电压输出才14V(@28A),这是就该怀疑只有一路工作了,结果加10V(@100A)时IRF840爆掉了,100A 10V 1KW,单路IRF840肯定不行,开始怀疑是次级整流管,抗冲击能力不够,但是拆下来,测量发现没坏,又重新按上(9个啊)。将IRF840(TO220)换成IRFP460(TO247),过流和散热能力提升了一个等级,上电测试,次级整流管硬是抗住了100A的电流,95mΩ左右的电炉丝加到了10V的电压,输出功率1KW左右,有噪音,可能是变压器和电感没有浸漆的缘故,液晶已经被干扰到无法显示,但是程序并没有跑飞,电压受控,命令也能响应。
简单总结下:
1、汇编最好还是要学的,在C等高级语言流行的天下,处理器DSP级别汇编还是必不可少
2、MPLAB的使用,对于这款新上手的IDE一定要有耐心,确实没有Keil,IAR成熟,但是也有好多非常赞的功能比如MCC DCDT等
dsPIC33EP64GS502这款处理器的性能和抗干扰能力还是非常出色,编程方面由于是刚刚接触,磨合的还不是太好,刚刚开始有的是功夫,有的是惊喜。
实验板子整体展示
通信协议部分
命令分为两类
一、控制命令
命令类型 | 设置命令 | 数据长度 | 设置值 | 校验值 | ||
0x01 | 0x01(恒压) | 2 | 电压高位 | 电压低位 | 校验值高位 | 校验值低位 |
0x01 | 0x02(恒流) | 2 | 电流高位 | 电流地位 | 校验值高位 | 校验值低位 |
二、调试命令
命令类型 | 设置命令 | 数据长度 | 设置值 | 校验值 | ||
0x00 | 0x00(设置占空比) | 2 | Duty高位 | Duty低位 | 校验值高位 | 校验值低位 |
0x00 | 0x01(增加占空比) | 0 | 校验值高位 | 校验值低位 | ||
0x00 | 0x02(减小占空比) | 0 | 校验值高位 | 校验值低位 | ||
0x00 | 0x03(增加输出电压) | 0 | 校验值高位 | 校验值低位 | ||
0x00 | 0x04(减小输出电压) | 0 | 校验值高位 | 校验值低位 | ||
0x00 | 0x05(增加电流) | 0 | 校验值高位 | 校验值低位 | ||
0x00 | 0x06(减小电流) | 0 | 校验值高位 | 校验值低位 | ||
0x00 | 0x07(显示模式切换) | 0 | 校验值高位 | 校验值低位 | ||
0x00 | 0x08(读取电压值) | 2 | 电压值高位 | 电压值低位 | 校验值高位 | 校验值低位 |
测试一 | |||||
连接线电阻Rw(Ω) | 0.027 | ||||
测试负载Rl(Ω) | 2.12 | ||||
实际负载RL(Ω) | 2.147 | ||||
测试序号 | 输入功率Pin(W) | 输出电压(V) | 输出电流(A) | 输出功率(W) | 效率(%) |
1 | 3.1 | 1.08 | 0.50 | 0.54 | 17.5 |
2 | 5.7 | 2.01 | 0.94 | 1.88 | 33.0 |
3 | 9.5 | 3.11 | 1.45 | 4.50 | 47.4 |
4 | 14.8 | 4.17 | 1.94 | 8.10 | 54.7 |
5 | 19.95 | 5.09 | 2.37 | 12.07 | 60.5 |
6 | 27.1 | 6.04 | 2.81 | 16.99 | 62.7 |
7 | 33.9 | 7.16 | 3.33 | 23.88 | 70.4 |
8 | 42.2 | 8.13 | 3.79 | 30.79 | 73.0 |
9 | 51.7 | 9.14 | 4.26 | 38.91 | 75.3 |
10 | 62 | 10.12 | 4.71 | 47.70 | 76.9 |
11 | 73.4 | 11.09 | 5.17 | 57.28 | 78.0 |
12 | 81 | 12.29 | 5.72 | 70.35 | 86.9 |
13 | 90.9 | 13.16 | 6.13 | 80.66 | 88.7 |
14 | 104.1 | 14.25 | 6.64 | 94.58 | 90.9 |
15 | 122.2 | 15.61 | 7.27 | 113.49 | 92.9 |
16 | 132.1 | 16.3 | 7.59 | 123.75 | 93.7 |
17 | 145.9 | 17.22 | 8.02 | 138.11 | 94.7 |
18 | 179.9 | 18.18 | 8.47 | 153.94 | 85.6 |
19 | 201.3 | 19.27 | 8.98 | 172.95 | 85.9 |
20 | 215.4 | 20.17 | 9.39 | 189.49 | 88.0 |
21 | 235 | 21.27 | 9.91 | 210.72 | 89.7 |
22 | 253.2 | 22.22 | 10.35 | 229.96 | 90.8 |
23 | 271.3 | 23.15 | 10.78 | 249.61 | 92.0 |
24 | 289.5 | 24.18 | 11.26 | 272.32 | 94.1 |
测试二 | |||||
连接线电阻Rw(Ω) | 0.027 | ||||
测试负载Rl(Ω) | 1.01 | ||||
实际负载RL(Ω) | 1.037 | ||||
测试序号 | 输入功率Pin(W) | 输出电压(V) | 输出电流(A) | 输出功率(W) | 效率(%) |
1 | 3.8 | 1.05 | 1.01 | 1.06 | 28.0 |
2 | 8.2 | 2.07 | 2.00 | 4.13 | 50.4 |
3 | 14.2 | 3.04 | 2.93 | 8.91 | 62.8 |
4 | 24.5 | 4.14 | 3.99 | 16.53 | 67.5 |
5 | 35.1 | 5.22 | 5.03 | 26.28 | 74.9 |
6 | 47.4 | 6.22 | 6.00 | 37.31 | 78.7 |
7 | 60.9 | 7.18 | 6.92 | 49.71 | 81.6 |
8 | 75.3 | 8.07 | 7.78 | 62.80 | 83.4 |
9 | 93.2 | 9.07 | 8.75 | 79.33 | 85.1 |
10 | 109.7 | 10.08 | 9.72 | 97.98 | 89.3 |
11 | 130.1 | 11.13 | 10.73 | 119.46 | 91.8 |
12 | 153.4 | 12.16 | 11.73 | 142.59 | 93.0 |
13 | 184.6 | 13.36 | 12.88 | 172.12 | 93.2 |
14 | 205.4 | 14.1 | 13.60 | 191.72 | 93.3 |
15 | 238.2 | 15.15 | 14.61 | 221.33 | 92.9 |
16 | 268 | 16.04 | 15.47 | 248.10 | 92.6 |
17 | 321.8 | 17.12 | 16.51 | 282.64 | 87.8 |
18 | 355.9 | 18.16 | 17.51 | 318.02 | 89.4 |
19 | 392 | 19.17 | 18.49 | 354.38 | 90.4 |
20 | 425.3 | 20.14 | 19.42 | 391.15 | 92.0 |
21 | 468 | 21.24 | 20.48 | 435.04 | 93.0 |
22 | 506.7 | 22.34 | 21.54 | 481.27 | 95.0 |
23 | 547.4 | 23.37 | 22.54 | 526.67 | 96.2 |
24 | 582.9 | 24.18 | 23.32 | 563.81 | 96.7 |
测试三 | |||||
连接线电阻Rw(Ω) | 0.027 | ||||
测试负载Rl(Ω) | 0.48 | ||||
实际负载RL(Ω) | 0.507 | ||||
测试序号 | 输入功率Pin(W) | 输出电压(V) | 输出电流(A) | 输出功率(W) | 效率(%) |
1 | 5.5 | 1.09 | 2.15 | 2.34 | 42.6 |
2 | 12.54 | 2 | 3.94 | 7.89 | 62.9 |
3 | 25.74 | 3.03 | 5.98 | 18.11 | 70.4 |
4 | 41.6 | 4.08 | 8.05 | 32.83 | 78.9 |
5 | 60.1 | 5.03 | 9.92 | 49.90 | 83.0 |
6 | 86.6 | 6.15 | 12.13 | 74.60 | 86.1 |
7 | 114 | 7.05 | 13.91 | 98.03 | 86.0 |
8 | 152.6 | 8.22 | 16.21 | 133.27 | 87.3 |
9 | 191.6 | 9.16 | 18.07 | 165.49 | 86.4 |
10 | 231.3 | 10.23 | 20.18 | 206.42 | 89.2 |
11 | 275.5 | 11.14 | 21.97 | 244.77 | 88.8 |
12 | 327 | 12.11 | 23.89 | 289.25 | 88.5 |
13 | 388.7 | 13.15 | 25.94 | 341.07 | 87.7 |
14 | 438.5 | 14.04 | 27.69 | 388.80 | 88.7 |
15 | 510 | 15.2 | 29.98 | 455.70 | 89.4 |
16 | 571.8 | 16.11 | 31.78 | 511.90 | 89.5 |
17 | 657.9 | 17.26 | 34.04 | 587.59 | 89.3 |
18 | 714.5 | 18.17 | 35.84 | 651.18 | 91.1 |
19 | 792.3 | 19.21 | 37.89 | 727.86 | 91.9 |
20 | 862.5 | 20.12 | 39.68 | 798.45 | 92.6 |
21 | 940.3 | 21.12 | 41.66 | 879.79 | 93.6 |
22 | 1022 | 22.17 | 43.73 | 969.45 | 94.9 |
23 | 1108 | 23.1 | 45.56 | 1052.49 | 95.0 |
24 | 1194 | 24.14 | 47.61 | 1149.39 | 96.3 |
测试四 | |||||
连接线电阻Rw(Ω) | 0.027 | ||||
测试负载Rl(Ω) | 0.095 | ||||
实际负载RL(Ω) | 0.122 | ||||
测试序号 | 输入功率Pin(W) | 输出电压(V) | 输出电流(A) | 输出功率(W) | 效率(%) |
1 | 7.9 | 0.5 | 4.10 | 2.05 | 25.9 |
2 | 17.18 | 1.1 | 9.02 | 9.92 | 57.7 |
3 | 29.4 | 1.55 | 12.70 | 19.69 | 67.0 |
4 | 50.7 | 2.07 | 16.97 | 35.12 | 69.3 |
5 | 81.2 | 2.55 | 20.90 | 53.30 | 65.6 |
6 | 112.4 | 3.05 | 25.00 | 76.25 | 67.8 |
7 | 146.2 | 3.57 | 29.26 | 104.47 | 71.5 |
8 | 191 | 4.16 | 34.10 | 141.85 | 74.3 |
9 | 228.4 | 4.54 | 37.21 | 168.95 | 74.0 |
10 | 273.6 | 5.02 | 41.15 | 206.56 | 75.5 |
11 | 331.6 | 5.54 | 45.41 | 251.57 | 75.9 |
12 | 397.2 | 6.01 | 49.26 | 296.07 | 74.5 |
13 | 457.4 | 6.5 | 53.28 | 346.31 | 75.7 |
14 | 541.8 | 7.06 | 57.87 | 408.55 | 75.4 |
15 | 621.4 | 7.56 | 61.97 | 468.47 | 75.4 |
16 | 715.8 | 8.05 | 65.98 | 531.17 | 74.2 |
17 | 790.7 | 8.55 | 70.08 | 599.20 | 75.8 |
18 | 870.1 | 9.02 | 73.93 | 666.89 | 76.6 |
19 | 983.7 | 9.55 | 78.28 | 747.56 | 76.0 |
20 | 1080 | 10.07 | 82.54 | 831.19 | 77.0 |
21 | 1174 | 10.52 | 86.23 | 907.13 | 77.3 |
22 | 1268 | 11.05 | 90.57 | 1000.84 | 78.9 |
23 | 1364 | 11.56 | 94.75 | 1095.36 | 80.3 |
24 | 1616 | 12.42 | 101.80 | 1264.40 | 78.2 |
回复
有奖活动 | |
---|---|
【有奖活动——B站互动赢积分】活动开启啦! | |
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |