这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【设计竞赛】程控恒流恒压电源

共21条 1/3 1 2 3 跳转至

【设计竞赛】程控恒流恒压电源

菜鸟
2018-04-08 13:56:28     打赏


1、开发板硬件环境熟悉

(1) 2018年319日 上午收到的开发板,红色的盒子很应景,另附一张精美的“剪纸感谢Microchip的开发板。

(2) 开发板做工很是精细,全球通用的电源适配器是极大的亮点,测试点很讲究。整体比较简单,左侧主控芯片液晶,右上同步降压,右下boost升压。背面是负载电阻和在线调试器官方名称为:PKON,极大的方便了用户,不用再单独购买调试器。

(3) 第一天按捺不住激动的心情,下载完开发板的资料,安装上IDE:MPLAB X IED 是基于Netbeans搞过Java的一定知道他的大名。那就需要jre,他本身也是Java编写的,原来电脑上开发过Android,所以应该会有JDK安装比较顺利,打开源代码重新烧录,第二次成功写入。结果是开机变成了都是1.25W+1.25W很快就过热报警了。总结下比较顺利的:笔者以前未接触过MicroChip的片子,所以电脑很干净,装上就连接成功了,驱动也不用切换。dsP33EP64GS502 对应的是16bit DSC 安装配套的xc16编译,Maplab Code Configurator(MCC)开发环境基本搭建完成。

(4) 下载开发板官方配套文件:MPLAB Starter Kit for Digital Power Design Package-v2015-12-15内有详细的代码说明和使用说明,用Maplab 打开后发现并没有使用MCC配置,而且关键部分使用了汇编语言,对于刚入手的笔者,还是很有难度的,努力啃骨头中……

 

blob.png



2018323日星期五

做出了自己的Hello word,开发板中液晶程序移植,开发板中SPI驱动用的是软件模拟的SPI,该款处理器带有硬件的SPI,打算用硬件的SPI代替,软件中有太多的等待,第一次没有成功,肯定是我打开方式不对,用软件模拟没有问题,下周争取解决。

2018326日星期一

液晶C0216使用的虽是SPI接口,但是并不是标准的,没有数据输出(液晶只管显示也用不到输出)所以用标准的SPI可能遇到问题,SPI通信可以理解成通信双方的移位寄存器相互交换数据,初步判断为这是dsPIC33EPC0216液晶通信的壁垒所在,后续有时间再继续研究。开始以为用软件模拟带来很多硬件消耗很浪费,但是随着对开发板例程的研究发现,环路控制部分就是在中断直接实现的,而实现部分恰巧就是那两个汇编文件,使用了硬件加速(Hardware Accelerated Function Register Assignment),数字电源看似简单,但涉及内容非常严谨细致。笔者以前简单地认为采样+数字补偿器+占空比输出,功力有限,目前尚未吃透开发板环路控制的实现方式,一旦突破,接下来的工作将比较容易展开。与想象中相悖的原理图如下,数字控制却存在一个模拟比较器。



blob.png

昨天还绞尽脑汁地思考,Digital Power Starter Kit(以后都称为Kit)是如何实现占空比调节的,其关键是在控制环路中未找到输出关于输出控制的寄存器。使用硬件加速的原理大概是:dsPIC33EP具有W1-W14备用寄存器,该寄存器能在处理器切换上下文之前装在数据,在之后也能保持,甚至能直接映射到中断响应上,这是提速的关键(参见数据手册DS70005127D  3.1 Registers),Kit使用了硬件加速,将2P2P补偿器用的数据接口指针或者地址预先存储到备用寄存器中,计算时直接调用函数即可。以同步buck为例,当时该函数的输出确是CMP1DAC。做了个测试,把CMP1DAC替换成控制占空比的寄存器PDC1,输出结果很是不稳定,而且电感啸叫,用示波器观察PWM,波动很大。


……
mov #ADCBUF1,               w1    ; Address of the ADCBUF1 register  (Input)
 ;mov #CMP1DAC,            w2    ; Address of the CMP1DAC target register (Output)
mov #PDC1,                  w2    ; Address of the PDC1 target register (Output)

  回到昨天的问题,数字环路中存在一个模拟比较器,而且还有DAC与想象中的数字电源差别很大,为什么不是直接控制占空比?看来这个比较器是关键,很明显是作用是峰值限流,如果是个模拟控制的就再平常不过了,后面的部分就是模拟控制?继续研究该芯片的PWM控制器,该PWM控制器的Current-Limit PWM Mode就是这种机制。后来在初始化中得到验证:将占空比配置成最大,比较器提前输出错误信号,提前关断PWM,实现稳压控制,不得不服!高速比较器,以及PWM调制这种硬件模式速度上感觉比直接输出占空比响应要快。


blob.png

PWM current-Limit Mode 摘自应用手册。




纹波和稳定度测试

 blob.png

Buck 3.3V 纹波 交流 10mV 20mS        

blob.png     

Boost 15V 波形 交流10mV 20m

blob.png

  Buck 3.3V实测值能稳定到四位数字   

       blob.png  

  Boost 15V实测值能稳定到四位数字


 实验板的纹波和电压稳定性满足设计的要求,观察纹波能控制在10mV以内无论是3.3V输出还是15V输出;电压能稳住四个有效数字。15实测14.75V与板子自己测量值略有偏差,可能是分压电阻等温飘等引起,瑕不掩瑜。条件有限暂时不考虑转换效率。

blob.png

这是在小功率下的可行性,当提升到上百瓦的功率,能否实现如此高的性能,拭目以待。


 

Starter Kit 测量值

319收到板子已经8天了,加油!!

201848日星期日

前几天仔细研读PWM ADC compare的数据手册和参考手册了,分享下心得:对于新手认认真真啃数据手册和参考手册是就是捷径,这个过程很煎熬,但是不能缺少。直接看例程会是云里雾里的,如果上手编程更是无从下手,手册永远是基础,对芯片功能有了充分的了解,再看例程,同时结合数据手册,会轻松许多,这也是开始就上手例程处处碰壁的教训。

接下来将依次展开UART通讯 屏幕显示 PWM控制 硬件搭建 调试等步骤。




管理员
2018-04-09 07:28:53     打赏
2楼

楼主加油


菜鸟
2018-04-09 13:25:52     打赏
3楼

期待啊~ 


工程师
2018-04-09 17:31:39     打赏
4楼

加油哇,膜拜大神


菜鸟
2018-04-12 11:06:34     打赏
5楼

1、通信接口配置协议编写

收获

认识了一种新的数据结构“位段”(位域):位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有01 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。该款处理器的配置字段就是用位域实现的,大大增加了配置的方便性。例如:

typedef union
{
    struct
    {
            uint8_t full:1;
            uint8_t empty:1;
            uint8_t reserved:6;
    }s;
    uint8_t status;
}UART_BYTEQ_STATUS tmp;


共用体Status中一位表示full ,一位表示empty 剩余6位暂时不用。可以用接口提直接访问该位,程序的可读性上大大提高同时节省了空间。MPLAB X的MCC非常好用,简单几步即可配置硬件Easy Setup 浅显易懂,如果想更加深入了解配置也可以点击寄存器,查看各个位。

 blob.png

总体设计,从Kit上引出两路PWMbuck),二者相位差180度,分别驱动两路正激拓扑实现交错正激,从而减小整流管的电流应力毕竟设计目标是100A,缩小LC的体积。将电压和电流信号引回板子做处理,对板子进行改造难免了。通信接口的处理将板子上I2C接口的GPIO1GPIO2配置为UARTdsPIC33EP的重映射功能太赞了。将GPIO1配置为Rxd GPIO2配置为TxD后续用洞洞板加个光耦隔离,目前先调通,加隔离为安全和抗干扰考虑。

 blob.png

I2C通信接口


本机地址

功能码

起始地址

写字节数

数据

ADDH

ADDL

0x01

0x10

0x00

0x00

……

0x00

0x00

设置多个寄存器,设置电源的启动和停止,电流值和电压值。设置成功后液晶显示即可。实时状态有液晶显示,暂不增加读取命令,通信协议不是难点也不是本项目的重点。

回到dsPIC33EP64GS502Uart上:已经用MCC完成端口映射,模式配置,中断使能。下边就是协议的植入。中断就分为接受中断和发送中断,而且缓冲区就是四个字节而且有多个中断模式可以配置:分别配置为接收到一个字符产生接收中断,发送缓冲区只要有空闲位置就产生发送中断。值得一提的是接收数据寄存器U1RXREG,只要读取该寄存器就直接影响只读寄存器U1STAbits.URXDA,这与以前接触的51还是有区别的,毕竟有四个字节的缓冲区。

buck的时基切换到第二主时钟,并将频率降至180Khz,从新调整补偿系数发现3.3V输出没问题,Boost受到影响。为了确认是buck影响到了boostbuck禁用,boost输出正常了。开发板设计用心良苦,将buck boost同频而且,boost移相180度,尽量减小对二者的影响,看来是有道理的。期间尝试给boost加大输入电容,不小心把boost的保险还给烧了,竟然不是自恢复的……

2018410日星期二

今天打算开启PWM,本设计拓扑为双端交错正激,双端正激具有复位可靠,能量回馈母线的特点,缺点是输出为半波整流,续流二极管电流应力大;交错法一则可以减小续流二极管电流应力,二来可以减小输出电感电容体积,前面已经简单介绍过了。拓扑原理如下,参数随着实验会后期修改。

 blob.png

图: 交错正激动原理


  相差180°的PWM1和PWM2,分别隔离驱动上桥和下桥,输出侧整流二极管每个开关周期内将有二次导通,电感脉动电流频率为开关频率的二倍。其缺点也显而易见:驱动电路复杂,磁芯利用率只有推挽拓扑的一半,成本较高,但是换来了较高的可靠性。

回到今天遇到的问题一旦使能了PWM将覆盖串口通信的映射,参口手册有提到700598C,多个外设映射到同一IO口,优先级高的将覆盖优先级低的,尴尬了……只能见Uart映射到SDA和SCK上,也没打算用IIC通信。

参考历程配置,没有PWM输出。最后发现是MCC配置默认是把PWMLOCK打开了,都是坑啊,部分配置都是无效,明天关掉试试。

2018411日星期三

前面PWM没有输出的问题已经解决,正是PWMLOCK的问题。

对于电流检测打算用分流器来检测但是分流器产生的电压信号太小,该款处理器内置PGA,但是PGA需要校正,校正数据就写在Flash中,手册中提示用汇编指令可以读取,汇编对笔者来说是盲区,所以尝试用C语言代替,参看《MPLAB® XC16 C Compiler Users Guide》,该参考手册是入手该芯片但不想涉及汇编的新手应该研读的。比如现在遇到的问题:读取存储在Flash中的PGA校准数据然后写入校准寄存器,手册上提供的使用汇编指令TABLRLTABBLRH) 和TABLPAG,该参考手册提供了内建函数如:unsigned int __builtin_tblrdh(unsigned int offset); 便可解决读取flash数据而不涉及汇编

具体步骤仅供参考:MCC不断有惊喜,初始化的时候就完成了校准,看来我的担心是多余的了,学习了

    uint32_t calibrationAddress;

    //Disable the module 
    PGA1CONbits.PGAEN = 0;

    calibrationAddress = 0x800E48;  //Flash address
    TBLPAG = (uint16_t)((calibrationAddress) >> 16);

    // Calibration data from a flash location
    PGA1CAL = __builtin_tblrdl((uint16_t)((calibrationAddress) & 0xFFFF));



菜鸟
2018-04-12 21:11:20     打赏
6楼

解决了昨天PGA校准的问题,其实也不是我解决的而是MCC解决的,今天又遇到了另外的问题,也与MCC有关,最后再说这个。

将板子的+9V----->辅助电源VCC

RA3----->PWM1

RA4----->PWM2

GND----->辅助电源GND

RA0--->PGA1

RA1----->VFB

GND----->信号GND

用到的引脚与板载连接全部断开,飞线出来作为控制板使用。

将芯片内部配置成如下连接。

blob.png

图:芯片内部配置结构


ADCORE0ADCORE1的读书读取出来将PGA设置成8倍,接入电位器调整电压观察ADC采样值发现ADC1采样值差不多,但是ADC0采集的电流值虽然也跳动,但不是采集的外部电压的8倍。让笔者开始怀疑人生了,怎么回事PGA配置寄存器仅两个,不能再简单了啊甚至读取了PGA的校正值发现不是0x00,说明也没有问题,难道是把PGA烧坏了,都是模拟输入了,应该不会吧。基本排除了PGA配置的问题,那就去看ADC了,试试直接采样RA0,没有问题;十万个为什么啊!笔者使用MCC配置的ADPGA,那么仔细检查是不是MCC配置出错了,不幸言中:

    // C3CHS AN3; C0CHS PGA1; C1CHS AN1; C2CHS AN2;
// ADCON4H = 0x01; //MCC自动配置的
    ADCON4H = 0x02;   //修改后

下载显示下,差不多8倍关系。尽信书则不如无书,也建议MPALAB的开发者确认下是否存在此Bug,瑕不掩瑜,还是很好用的,当然可以更好。也让笔者收获颇丰啊

blob.png


图:电流电压采样短接电位器&&液晶显示整型采样值


外接电位器看采样值,采样值为整形没有转换成浮点数,已成倍数关系,说明正常。但是线性度不是很好。考虑要不要用PGA……



blob.png

图:引出的控制线的七根信号线在采样信号线上外加了电位器电压,PWM输出加了个小灯


开发板已经被修改了,整体太乱了,且看局部吧。

本周更新告一段落,明天整理下思路。


管理员
2018-04-16 14:31:40     打赏
7楼

期待后续呀~~~

开发手记撰写得越完善,得奖几率越高呀~



菜鸟
2018-04-16 21:07:45     打赏
8楼

再谈备用工作寄存器(Alternate Working register

dsPIC33EPxxGS50x具有两组这样的寄存器,也就是说可以实现两组硬件加速的环路补偿。CPU默认工作在0号(#0)工作寄存器组。CPU上下文(可以理解为CPU工作寄存器组)切换有两种方式:手动和自动(硬件切换),手动方式调用汇编CTXTSWP #0x1,这种方式可以用在初始化工作寄存器的时候和调用补偿函数前(补偿函数工作在备用寄存器,达到加速的目的);自动切换则需好硬件和硬件中断配合,将工作寄存器对应的优先级与硬件中断的优先级相同,CPU就能自动切换上下文,详细内容可以参考《SMPS Control Library Help

回到数据手册中关于备用寄存器映射中断的描述The Alternate Working registers can be assigned to a specific Interrupt Priority Level (IPL1 through IPL6) by configuring the CTXTx<2:0> bits in the LTREG Configuration register.”可映射的中断优先级应该是(IPL1 to IPL7)而不是IPL1 to IPL6。可参考:

blob.png

图:备用工作寄存器映射中断控制

Starter kit 用的就是IPL7IPL6,分别用于buckboost的电压采样中断优先级

参考以上资料,将电流和电压采样中断优先级分别设置为IPL7IPL6CTXT也对应设置,即可完成CPU上下文的自动切换。ADC0ADC使能数字比较器,分别用作过流和过压保护。

blob.png

图:MCC备用工作寄存器优先级设置


中断优先级设置:后面已经对应自动对应上下文工作寄存器组

模拟输入

中断优先级

备用寄存器

数字比较器

功能

ADAN0

ILP7

CTXCT1

ADCMP0

过流保护

ADAN1

ILP6

CTXCT2

ADCMP1

过压保护


在过流保护中要软件关断PWM输出:有两种方案,1、将占空比置零,2、将FAULT值输出PWM。当然可以直接关掉PWM,但是这个太过生猛了,当然也没有必要关掉,另外如果再次开启需要重新初始化一些东西这是下下策。先说第二种方方案,这种方案适合具有虚拟端口而且快速比较器不能直接作为错误信号触发源的。本款(dsPIC33EP64GS502)处理器具有虚拟端口而且比较器信号也能直接作为FALULT的触发源。如果用第二种方案,那么就要使用虚拟引脚,控制虚拟引脚输出从而控制PWM模块将FAULT寄存器的值输出到PWM

有种舍近求远,故意将问题复杂化的感觉。而第一种方案,直接控制占空比,随时可以写入,目前说服自己实时性应该能满足要求,毕竟也就一个开关周期的事,过流时能保护住MOS管和整流管。如果后期发现不行那么,那么会考虑第二种方案,不行放大招关掉PWM

blob.png

图:比较器输出不能作为错误触发,通过虚拟端口实现


遇到的问题:打开了数字比较器01后,并打开相应的中断,已经排除其他因素,只要一进中断就死机,目前还没有找到问题,头疼中……

一点问题都能拖住整个进展。



菜鸟
2018-04-17 18:58:32     打赏
9楼

昨天晚上回家参看了例程,豁然开朗。数字比较器进入中断即使清除中断标志位,但是产生的中断条件依然存在,所以会一直进入中断,形成“假死”状态,找到问题所在就有解决的办法,即进入中断后要改变触发中断的方式,当然在闭环条件下可能不存在这种问题,但是短时间死机可能产生致命的后果

参考模拟电路中的滞回比较器,以电流保护为例说明:当电流值高于设定值ADCMPxHI触发过流保护,同时将比较器改为低于设定值ADCMPxLO触发解除过流保护中断,一旦再触发中断将解除过流保护,同时将比较器设置为当电流值高于设定值触发过流保护,如此循环。最大值和最小值存在一定差值来消除震荡。例如将过流保护值设置为110A,但是当电流值小于90A时才能恢复正常值,这也是模拟开关电源过热保护常用的保护机制。

至此数字比较器的问题解决了。

void __attribute__ ( ( __interrupt__ , auto_psv ) ) _ADCMP0Interrupt ( void )
{
    if(ADCMP0CONbits.HIHI==1) // 0CP
    {
        ADCMP0CONbits.HIHI = 0;
        ADCMP0CONbits.LOLO = 1;
        dpsFault.s.ocp = 1;
    }
    else                      // normal
    {
        ADCMP0CONbits.HIHI = 1;
        ADCMP0CONbits.LOLO = 0;
        dpsFault.s.ocp = 0;
    }
     //clear the ADCMP0 interrupt flag
    IFS11bits.ADCMP0IF = 0;
}

PWM配置

因为用到MC33151(手边仅有的MOS驱动器)是负逻辑的,所以将PWM的输出极性改为了active-low,此次对应的OVERDATFLTDAT也会对应的反转,使用的时候要注意。

相差180°的PWM其实就是推挽模式,此模式一路PWM输出的开关频率为配置频率的一半,例如:本设计将单个开关频率设置为180kHz,那么设置频率的时候就要设置为360kHz。而对应的占空比则最大值对应的是50%。笔者刚开始时按照180kHz配置的,占空比也对应地除了2,结果出来的是90kHz25%不到的占空比(设置了死区时间),基本上新手该踩的坑都踩了……

blob.png

图:PWMH和PWML输出 单路180kHz 相位差180度




专家
2018-04-19 09:03:12     打赏
10楼

向大神学习一下。


共21条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]