Microchip 单片机比较器应用案例

发布时间 2023-07-06 20:00:25作者: 斑鸠,一生。

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


1、原理分析

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

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

    下图为所使用单片机引脚分布及重映射引脚,加粗的RPx引脚可以根据数据手册进行重映射。

 

 

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
    }
}

 

 

3、实验结果

 

4、不足与改进