代码改变世界

Microchip 单片机比较器及逐周期电流保护应用案例

2023-07-06 19:57  斑鸠,一生。  阅读(495)  评论(0编辑  收藏  举报

  现在数字控制芯片的功能越来越模拟化,新控制产品经常集中比较器,可编程运放等模拟且可编程配置器件,灵活使用它们可以节约电路成本。本文用于记录dsPIC33系列单片机比较器应用案例。


1.比较器原理

  1.1、原理分析

  型号为dsPIC33EP64GS502的单片机比较器模块单元,功能并不复杂,主要有12位的DAC,多个比较器输入口,和比较器结果输出可配置。

  比较器的反向输入端与DAC的负端连接在一起,比较结果可配置。

    下图为所使用单片机引脚分布及重映射引脚,加粗的RPx引脚可以根据数据手册进行重映射,未加粗的RPx引脚,不可以用来做重映射,暂时还没有找到原因。

 

 

  1.2、代码分析

  通过在比较器CMP1A口给一个直流电压,DAC产生一个三角波,并将比较器的输出重映射给RB15引脚。

void DAC_Init(void)
{
    RPOR7bits.RP47R = 0b011000;//比较器结果重映射,RP47连接到模拟比较器输出 1
    TRISBbits.TRISB15 = 0;
    
    CMP1CONbits.CMPON = 0;//模块关闭
    CMP1CONbits.DACOE = 1;//DAC 模拟电压输出到 DACOUT 引脚
    CMP1CONbits.ALTINP = 0;
    CMP1CONbits.INSEL = 0b00;//比较器的输入信号源选择位,选择 CMP1A 输入引脚
    CMP1CONbits.EXTREF = 0;//内部参考电压源为 DAC 提供参考电压
    CMP1CONbits.CMPPOL = 0;//输出同相
    CMP1CONbits.RANGE = 1;//DAC最大值为AVDD
    CMP1DAC = 0xfff;//比较器 x DAC 控制寄存器
    CMP1CONbits.CMPON = 1;//使能比较器
}
int main()
{
    unsigned int i = 4095,Flag = 0;
    System_Colck();//时钟设置
    System_Init();//初始化
    DAC_Init();

    while(1)
    {
        if(Flag == 0){
            i++;
            if(i >= 4095)
                Flag = 1;
        }
        if(Flag == 1){
            i--;
            if(i <= 1)
                Flag = 0;
        }
        CMP1DAC = i;//比较器 x DAC 控制寄存器,最大值0xfff
    }
}

 

  1.3、实验结果

   红色波形为DAC产生的电压,黄色波形为比较器CMP1A输入的电压,绿色波形为比较器的输出电压,绿色波形最底端为零点平,刻度均为1V/div。时间刻度为1ms/div。

  从下图实验波形可以看出,当比较器CMP1A的输出电压高于DAC电压时,输出电平为高电平,反之为低电平。

  同样,可以修改比较器输出结果的极性,当比较器CMP1A的输出电压高于DAC电压时,输出电平为低电平,反之为高电平。

 

2、使用模拟比较器做逐周期电流保护或者latched电流保护


  2.1、原理分析

  使用模拟比较器做逐周期电流保护,在检测到过流的时候可以关断PWM信号,在下个PWM周期,若故障消除,会恢复到正常的工作模式,如果故障信号仍然存在,那么PWM信号继续关断。另外一个Latched工作模式,只要检测到一次过流保护,那么就会永久关断PWM信号,直至控制器复位。

  该模式的优势在于不依靠中断函数,响应及时,可以配置为自动恢复。

  2.2、代码示例

  需要注意的是,由于dsPIC33Ex系列的控制器,IOCONx 和 FCLCONx 寄存器有写保护功能。因此,对该寄存器的写入需要事先去除写保护。

#pragma config PWMLOCK = OFF   

  去除写保护后的程序如下:

void PWM_Init(void)
{   
    IOCON1bits.PENH = 1;            // PWM controls I/O port
    IOCON1bits.PENL = 1;           

    IOCON1bits.PMOD = 0;            // Complementary Mode
    
    IOCON1bits.POLH = 0;            // Drive signals are active-high
    IOCON1bits.POLL = 0;            // Drive signals are active-high

    IOCON1bits.OVRENH = 0;          // Override disabled
    IOCON1bits.OVRENL = 0;      
    IOCON1bits.OVRDAT = 0b00;       // Override data PWMH and PWML
    IOCON1bits.FLTDAT = 0b00;       // If fault occurs:
                                    // PWMH = 0 & PWML = 1  
    DTR1    = 80;
    ALTDTR1 = 110;
    
    PWMCON1bits.IUE = 0;            // Disable Immediate duty cycle updates
    PWMCON1bits.ITB = 0;            // Select Primary Timebase mode 
    PWMCON1bits.DTC   = 0;          // Positive Deadtime enabled

    FCLCON1bits.FLTSRC = 0b01101;   // Fault Control Signal assigned to CMP1,直接配置即可,不需要引脚重映射
    FCLCON1bits.FLTPOL = 0;         // Fault Signal is active-high
    FCLCON1bits.FLTMOD = 0;         // Current Limited latched。

// FCLCON1bits.FLTMOD = 1; Cycle-by-cycle current limited PTPER = 0x0FF8; PDC1 = PTPER >> 1; PTCONbits.PTEN = 1; } void DAC_Init(void) { CMP1CONbits.CMPON = 0; CMP1CONbits.INSEL = 0b00; CMP1CONbits.RANGE = 1; CMP1CONbits.HYSSEL = 1; CMP1DAC = 2964; CMP1CONbits.CMPON = 1; } int main() { System_Colck(); System_Init(); DAC_Init(); PWM_Init(); while(1){ }
return 0; }

  2.3、实验结果

    下面实验波形中,CH1是占空比为0.5的PWM信号,CH2是输入到模拟比较器输入口的过流信号,比较器的阈值电压为2.4V,高于2.4V为有效值。

  在Cycle by cycle模式下,当比较器的输入电压小于设置的2.4V时,PWM信号可以自动恢复,然而Latch 模式需要复位信号或者重启才能恢复。

    Cycle-by-Cycle mode:

 

 

   Latch mode:

 

 3.总结

  使用数字控制器的模拟比较器去实现过流检测具有成本低,响应块,配置灵活,体积小等特点,可以实现电源行业的峰值电流模式的电源。

  其中Cycle by cycle 模式常用于实现峰值电流模式控制,Latch 模式常用来实现过流保护模式。