找回密码
 立即注册
查看: 35|回复: 0

20-利用P5.0做比较器正极输入源,内部1.19V或P5.1口做负极输入源,STC32G144K246实验

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:78
  • 最近打卡:2026-07-21 13:27:09
已绑定手机

231

主题

168

回帖

1069

积分

版主

积分
1069
发表于 2026-6-29 16:05:17 | 显示全部楼层 |阅读模式
20-利用P5.0做比较器正极输入源,内部1.19V或P5.1口做负极输入源,STC32G144K246实验箱演示程序
主程序main.C代码如下(汇编版本在附件中):


/*---------------------------------------------------------------------*/
/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com  -----------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
/*---------------------------------------------------------------------*/

/*************  功能说明    **************

本例程基于STC32G144K246为主控芯片的实验箱进行编写测试。

使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。

edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。

比较器的正极可以是 P3.7、P5.0、OP1O、ADCIN、DAC1O、DAC2O 端口,

而负极可以是 P3.6、P5.1、OP2O、DAC1O、DAC2O 端口或者是内部 BandGap 经过 OP 后的 REFV 电压(1.19V内部固定比较电压)。

通过中断或者查询方式读取比较器比较结果,CMP+的电平低于CMP-的电平P47口输出低电平(LED1亮),反之输出高电平(LED1灭)。

下载时, 选择时钟 48MHz (用户可自行修改频率)。

******************************************/

#include "..\..\comm\STC32G144K246.h"

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

/****************  用户定义宏  ****************/

#define     MAIN_Fosc   48000000UL

/*****************************************************************************/

void CMP_Isr() interrupt 21
{
    CMP1_6P6N_CR1 &= ~0x40;         //清除CMP1IF中断标志
    P47 = (CMP1_6P6N_CR1 & 0x01);   //中断方式读取比较器比较结果
}

/********************* 主函数 *************************/
void main(void)
{
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0xff;   //设置为推挽输出
    P4M1 = 0x00;   P4M0 = 0xc0;   //设置为推挽输出
    PAM1 = 0x00;   PAM0 = 0xff;   //设置为推挽输出

//  CMP1_6P6N_CR1 &= ~0x20;     //禁止比较器上升沿中断
    CMP1_6P6N_CR1 |= 0x20;      //使能比较器上升沿中断
//  CMP1_6P6N_CR1 &= ~0x10;     //禁止比较器下降沿中断
    CMP1_6P6N_CR1 |= 0x10;      //使能比较器下降沿中断

    CMP1_6P6N_CR1 &= ~0x0c;     //比较器中断最低优先级
//  CMP1_6P6N_CR1 |= 0x04;      //比较器中断较低优先级
//  CMP1_6P6N_CR1 |= 0x08;      //比较器中断较高优先级
//  CMP1_6P6N_CR1 |= 0x0c;      //比较器中断最高优先级

//  CMP1_6P6N_CR1 &= ~0x02;     //禁止比较结果输出
    CMP1_6P6N_CR1 |= 0x02;      //使能比较结果输出

    CMP1_6P6N_CR2 &= ~0x80;     //比较器结果正向输出
//  CMP1_6P6N_CR2 |= 0x80;      //比较器结果反向输出

//  CMP1_6P6N_CR2 &= ~0x40;     //关闭0.1us模拟滤波功能
    CMP1_6P6N_CR2 |= 0x40;      //使能0.1us模拟滤波功能

    CMP1_6P6N_CR2 &= ~0x3f;     //关闭数字滤波
    CMP1_6P6N_CR2 |= 0x10;      //使能(n+2)个系统时钟数字滤波

    CMP1_6P6N_CR3 &= ~0xc0;
    CMP1_6P6N_CR3 |= 0x40;      //比较器DC迟滞输入选择,0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV

    CMP1_6P6N_CR3 &= ~0x3f;     //CMP1+: P3.7, CMP1-: P3.6
    CMP1_6P6N_CR3 |= 0x01;      //CMP1+: P5.0
//  CMP1_6P6N_CR3 |= 0x02;      //CMP1+: OP1O
//  CMP1_6P6N_CR3 |= 0x03;      //CMP1+: ADCIN
//  CMP1_6P6N_CR3 |= 0x04;      //CMP1+: DAC1O
//  CMP1_6P6N_CR3 |= 0x05;      //CMP1+: DAC2O

//  CMP1_6P6N_CR3 |= 0x08;      //CMP1-: P5.1
//  CMP1_6P6N_CR3 |= 0x10;      //CMP1-: OP2O
    CMP1_6P6N_CR3 |= 0x18;      //CMP1-: BGV(1.19V)
//  CMP1_6P6N_CR3 |= 0x20;      //CMP1-: DAC1O
//  CMP1_6P6N_CR3 |= 0x28;      //CMP1-: DAC2O

    CMP1_6P6N_CR4 &= ~0x03;     //CMP1O: P3.4
//  CMP1_6P6N_CR4 |= 0x01;      //CMP1O: P4.1

//  CMP1_6P6N_CR1 &= ~0x80;     //关闭比较器1模块
    CMP1_6P6N_CR1 |= 0x80;      //使能比较器1模块

    EA = 1;

    while (1)
    {
//        P46 = (CMP1_6P6N_CR1 & 0x01);   //查询方式读取比较器比较结果
    }
}
//========================================================================


20-利用P5.0做比较器正极输入源,内部1.19V或P5.1口做负极输入源.zip

19.46 KB, 下载次数: 7

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-22 10:21 , Processed in 0.065416 second(s), 42 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表