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

共13条 1/2 1 2 跳转至

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

菜鸟
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-12 11:06:34     打赏
2楼

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     打赏
3楼

解决了昨天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 21:07:45     打赏
4楼

再谈备用工作寄存器(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     打赏
5楼

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

参考模拟电路中的滞回比较器,以电流保护为例说明:当电流值高于设定值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 12:30:30     打赏
6楼
大神不敢当,互相学习

菜鸟
2018-04-23 22:52:25     打赏
7楼

上周主要完成的是硬件电路搭建:驱动电路和主功率变换部分,由于时间紧张加上烧毁了主片,心情不佳,就没有实时更新。

驱动变压器绕制,初级20T,次级30T+30T,共需要要两个驱动变压器以驱动两组:

驱动变压器绕至好后,搭建驱动电路放置到驱动板上,方便调试。由于调试过程中的手误,将主芯片烧毁,心疼啊……,迅速从网上订购5片,万幸没有烧掉板子上的下载器。

本设计使用的MC33151是负逻辑导致,即使将引脚配置成上拉,开机上电瞬间也会出现误动作,看来非得外加上拉电阻方可。但是这样调试起来不是很方便,于是在MC33151前分别加了两个NPN的三极管SS8050作为反相器。驱动电路分享给大家,欢迎讨论:

blob.png

图:双路驱动电路原理图




左边的二极管为保护二极管,烧毁一个片子后吸取的教训,这样做有两个好处:一、防止误操作(比如笔者)高压倒灌入MCU;二、运行时,防止毛刺电压干扰到MCU.变压器绕制,要注意同名端,其实就是一个方向问题。如都是用顺时针绕制,起绕为同名端,就不容易出错了。先饶初级再绕次级,绕好一个再绕一个。

blob.png

图:驱动变压器半成品

blob.png

图:驱动变压成品


blob.png

图:驱动板最终成品


主功率部分制作,原理图已经上传过了,采用交错双端正激,只是外加了整流电路,没有使用主动PFC。变压器次级过大电流采用2mm*4mm铜条绕制,初级采用1mm漆包线绕制,初级:次级=324,主变一共两个。另外需要一个滤波电感,通用使用铁氧体绕制,不过要加气息。使用2mm*4mm铜条双根并绕,单根经过做实验,100A电流是发热量太大。

blob.png

图:主功率变换部分原理图


blob.png

图:主功率部分实物图半成品

整流二极管采用MBR60100三管并联,不要小瞧这个TO220封装的管子,搞到手时笔者也不信,这么细的引脚能过60A,于是用手头上的电源加到了60A,发热量很大压降在0.8左右,硬是抗住没有烧坏,请收下我的膝盖,但是一定要固定在散热片上,发热量非常大。

初级比较好处理,电流并不是很大,暂定使用4IRF8408A 500V)。

背部次级走线也本着两根铜条,防止发热量过大,小电流是过流没问题,但是大电流时一定要谨慎,否则发热很严重。

blob.png

图:主功率变换部分背部走线

blob.png

图:主功率变换部分成品(加了整流和LC滤波)

至此功率主板搭建完成,手都快磨出泡来了,当然也可以直接做PCB,但是亲自动手搭建能发现非常细节的问题,为以后PCB的设计,提供非常好的参考,磨出泡也是值了。

接下来将进行程序调试,及上电测试。




菜鸟
2018-04-25 19:46:06     打赏
8楼

现在遇到三个问题:

第一个:经过驱动后输出占空比发生变化;

第二个:交错正激,在电感处并联,并不是单纯的的两个两个正激变换的叠加;

第三个:dsPIC33EP64Gs502 内部12bit AD转换器稳定度与线性度的问题,这个和内部PGA类似,不是特别稳也不是特别准;

 

先说第一个:MCU输出占空比47%左右,结果到隔离驱动输出已经达到了53%,中途忘记拍照片了,应该可以想象的到,上电的后果,光是驱动变压器都会饱和,拿33V实验电源加上,异响非常大。最后找到原因是是三极管反相器上啦电阻太大导致的,调整上拉电阻,是输出占空比接近(或略小于)设定值。最终确定上拉电阻在200R左右。占空比的问题解决了。

 再说第二个:都是在外加33V实验电源下测得,先上图

blob.png

图:只有一路工作的双管正激,波形很正常 CH1:Vds CH2:Vgs


blob.png

图:两路工作的双管正激 CH1:Vds CH2:Vgs


当两路同时工作时由于共用一个电感和续流二极管,二者相互影响,起初觉得波形应该是二者的简单叠加,但是实验结果很是不一样,控制dsPIC33调整占空比,波形确实发生,而且确实是二者相互影响的结果,仔细查阅资料后发现是二者交错后变压器次级在管段期间不是被钳位到0V而是输出电压导致。确实也有类似波形,暂且认为是正常,同时也发觉这样并联续流二极管工作频率很高,损耗也会增加,所以效率上会受影响,没有完美的方案,但是减小了输出电感的体积。

起初担心二极管反向恢复的问题,但是考虑到使用的是肖特基,续流二极管应该问题不大,而且在散热器的边缘,离风扇最近。


blob.png

图:CH1 :Vgs CH2:整流二极管侧电压


第三个问题解决中……欢迎大家一起讨论



菜鸟
2018-04-26 22:11:35     打赏
9楼

关于AD线性度和稳定度的讨论:

dsPIC33EP64GS502这款单片机自带的AD在外加稳定电压情况下采样的稳定度还是可以的(仅测试的单端采样),但是线性度和满度上差强人意:理想的情况下是从0409512-bit)但实际上mV级的电压采样有问题,而且将电压接到电源正上,采样值竟然不是4095。因为当初烧掉的处理器,是能到达4095的,后来新买的片子却只能到达4050左右,连续实验了两片都是这样,理想和现实的差距,但是可以理解AD都有线性区。后来买的片子对应下图的“实际情况1”而开始的可能对应“实际情况2”。只要是一条直线就可以通过软件算法来校正,实验情况也确实如此,笔者将对应“实际情况1”的片子校正到了理想状态,即:将y=kx+b变成了y=x。除去开始一小段非线性区,之后测量还是很满意的,说明AD的采样值是一条直线,对于刚开始的一小段非线性区,可以通过叠加电压到采样电压来“隐藏”,这样便可以实现整段的线性。

如果在补偿时调用浮点运算,肯定会非常耗费CPU时间,处理器提供了Q15内建函数,可以加快运算。但是,有更简单的办法:这个过程是可逆的,我们设定输出电压也可以校正到AD的输出值,这样就解决了AD采样的问题,这样就校正一次就可。AD采样时有偏差,我们设定值时考虑上偏差,这样将输出设定的值。

另外AD提供的准差分采样能否实现较好的线性度和零点问题有待进一步实验验证。


blob.png

图:AD采样理想情况与实际情况



菜鸟
2018-05-05 17:01:54     打赏
10楼

本周主要处理数字环路问题:

使用的硬件加速,自动切换CPU上下文,由于汇编是笔者的盲区,对于汇编笔者也就停留在mov的认知上了,尽可能避开汇编用C语言来实现。具体步骤如下:

1、加入MicroChip的数字环路控制库

官网下载路径http://www.microchip.com/SWLibraryWeb/product.aspx?product=SMPS%20Control%20Library

内部有使用手册,但是不够详细,这里给出笔者的配置步骤

1)将接口文件smps_control.h"包含进自动的工程中,如笔者的:使用Brow加入包含头文件的文件夹即可


blob.png

2)加入工程文件,这个调试的时候用的着

这次加入的是*.x的工程文件

blob.png


3)加入编译好的库文件这次加入的是*.a文件

blob.png

至此就可以调用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的运行环境

如有遇到类似问题的,不妨从上面几个方面找找问题。

本周遇到了诸多非常诡异的问题,总算跌跌撞撞,数字环路函数控制函数总算能调用了。诡异地一周,就在今天,笔者骑的共享单车,上下楼的功夫就没了(费用随时间增加的),调了监控发现没有骑出小区,最后发现不知被哪个哥们放到地下室了,从地下室推出来都费劲,哎无语了。





共13条 1/2 1 2 跳转至

回复

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