STC32G 比较器及其应用编程

news/2024/5/16 23:19:43/文章来源:https://blog.csdn.net/billliu66/article/details/128807878

一 STC32G系列单片机寄存器简介

STC32G系列单片机内部集成了一个比较器,其正极可以在P3.7、P5.0、P5.1、或者ADC的模拟输入通道间切换;而负极可以是P3.7或者内部BandGap经过OP的REF电压。通过配置分时复用可以实现多个比较器的应用。

STC32G系列单片机的比较器有模拟、数字两级可编程滤波。模拟滤波可消除信号毛刺。通过设置数字滤波的CPU时钟数,等信号稳定后再比较。

STC32G系列单片机的比较器的比较结果可以从寄存器中读出,也可让其在单片机的端口输出,如从P3.4或P4.l输出。 STC32G系列单片机的中断源中包含比较器中断,比较器的比较结果由0变1,或者由1变0,皆可产生中断请求,可在比较器控制寄存器1中设置。

STC32G系列单片机比较器的内部结构图如下:

STC32G系列单片机比较器输出脚选择控制位寄存器为P_SW2的B3位,如下:

与STC32G系列单片机比较器相关的寄存器共有3个如下:

控制寄存器1的各bit位的作用如下:

控制寄存器2的各bit位的作用如下:

比较器扩展配置寄存器各bit位的作用如下:

二 STC32G系列单片机比较器相关寄存器配置编程

要使用STC32G系列单片机内部集成比较器,就离不开对其相关寄存器配置操作编程。最好的办就是将常用的配置操作做成库函数,供以后使用时调用。下面是STC32G比较器库函数的头文件与源文件的示例。

头文件

/*STC32G_Comparator.hDesigned by Bill LiuVersion 0.0 Modified last by Bill Liu,07/12/2022
enum
STC32G_CMP_PSOURCE                                     // comparator positive input source
STC32G_CMP_NSOURCE                                     // comparator negtive source///struct//
STC32G_ComparatorDef///macro function/
CMP_OUTPINSELP34();
CMP_OUTPINSELP41();
CMP_ENABLE();
CMP_DISABLE();
CMP_CLEARFLAG();
CMP_PEDGEINTENABLE();         //compare result change to positive Int enable
CMP_PEDGEINTDISABLE();        //compare result change to positive Int disable
CMP_NEDGEINTENABLE();            //compare result change to negtive Int enable
CMP_NEDGEINTDISABLE();        //compare result change to negtive Int disable
CMP_RESULTOUENABLE();
CMP_RESULTOUDISABLE();
CMP_GETRESULT(res);
CMP_AFILTERENABLE();            //0.1uS analog filter enable
CMP_AFILTERDISABLE();
CMP_INVERTRESOUTENABLE();
CMP_INVERTRESOUTDISABLE();
CMP_NSOURCEP36();      //set P3.6 as coparator negative input source
CMP_NSOURCEINREF();    //set inner bandgap viltage as coparator negative input source
CMP_PSOURCEP37();     //set P3.7 as compraror positive input source
CMP_PSOURCEP50();     //set P5.0 as compraror positive input source
CMP_PSOURCEP51();     //set P5.1 as compraror positive input source
CMP_PSOURCEADCIN();Function
CMP_ConfiguDigFilter(ui8 nData);                              //configure digital filter data, return void
CMP_HysVoltageSel(ui8 mSel);                                      //configure comparator DC input hysteresis voltage, return void
CMP_NSource(STC32G_CMP_NSOURCE mSel);                     //configure comparator negtive input source, return void
CMP_PSource(STC32G_CMP_PSOURCE mSel);                     //configure comparator negtive input source,  return void
CMP_InitDef(STC32G_ComparatorDef* mStruct);    // return void
CMP_StructInit(STC32G_ComparatorDef mStruct); //return void*/#ifndef    __STC32G_COMPARATOR_H
#define    __STC32G_COMPARATOR_H#include    "config.h"
#include "mtype.h"
#include "STC32G.h"#define CMP_OUTPINSELP34() {CMPO_S = 0;}
#define CMP_OUTPINSELP41() {CMPO_S = 1;}
#define CMP_ENABLE() {CMPEN = 1;} //comparator enable(switch on)
#define CMP_DISABLE() {CMPEN = 0;} //comparator disable(switch off)
#define CMP_CLEARFLAG() {CMPIF = 0;}
#define CMP_PEDGEINTENABLE() {PIE = 1;} //compare result change to positive Int enable
#define CMP_PEDGEINTDISABLE() {PIE = 0;} //compare result change to positive Int disable
#define CMP_NEDGEINTENABLE() {NIE = 1;} //compare result change to negtive Int enable
#define CMP_NEDGEINTDISABLE() {NIE = 0;} //compare result change to negtive Int disable
#define CMP_RESULTOUDISABLE() {CMPOE = 0;}
#define CMP_RESULTOUENABLE() {CMPOE = 1;}
#define CMP_GETRESULT(res) {(res) = CMPRES;}
#define    CMP_AFILTERENABLE() {DISFLT = 0;}    //0.1uS analog filter enable
#define    CMP_AFILTERDISABLE() {DISFLT = 1;}    //0.1uS analog filter disable
#define    CMP_INVERTRESOUTENABLE() {INVCMPO = 1;} //invert compare result out enable
#define    CMP_INVERTRESOUTDISABLE() {INVCMPO = 0;} //invert compare result out disable
#define CMP_NSOURCEP36() {CMPEXCFG &= 0xFB;}    //Negtive source is inner P36
#define CMP_NSOURCEINREF() {CMPEXCFG |= 0x04;} //Negtive source is inner Ref voltage
#define CMP_PSOURCEP37() {CMPEXCFG &=0xFC;}   //positve source is P37
#define CMP_PSOURCEP50() {CMPEXCFG &= 0xFC; CMPEXCFG |= 0x01;}   
#define CMP_PSOURCEP51() {CMPEXCFG &= 0xFC; CMPEXCFG |= 0x01;}
#define CMP_PSOURCEADCIN() {CMPEXCFG &= 0xFC; CMPEXCFG |= 0x03;}//*******************************************************
typedef enum
{PS_P37 = 0,PS_P50,PS_P51,PS_ADCIN
}STC32G_CMP_PSOURCE; // comparator positive input source//*******************************************************
typedef enum
{NS_P36 = 0,NS_BAND  //inner bandgap reference voltage
}STC32G_CMP_NSOURCE; // comparator negtive source//*******************************************************
typedef enum
{O_P34 = 0,    //compare result output at P34O_P41              //compare result output at P41
}STC32G_CMPO_PIN; // comparator output pin//*******************************************************
typedef struct
{STC32G_CMP_PSOURCE pSource;STC32G_CMP_NSOURCE nSource;BOOL outAble;STC32G_CMPO_PIN oPin;BOOL pIntAble;BOOL nIntAble;BOOL rInvAble;                     //invert compare result eanble/disableBOOL aFilter;ui8 dFilterCycles;ui8 dcInputHys;                 //DC input hysteresis valtage
}STC32G_ComparatorDef;/***********************************************************
Function: CMP_ConfiguDigFilter(ui8 nData);
Return value: void
nData: digital filter data,digital filter time: nData+2 system cycle times
Discription: configure digital filter data
Example:
CMMP_ConfiguDigFilter(0);
***********************************************************************/
void CMP_ConfiguDigFilter(ui8 nData);/***********************************************************
Function: CMP_HysVoltageSel(ui8 mSel);
Return value: void
mSel: selected hysteresis voltage,0: 0mV, 1: 10mV, 2: 20mV, 3: 30mV
Discription: configure comparator DC input hysteresis voltage
Example:
CMP_HysVoltageSel(0x01); //selected: 10mV 
***********************************************************************/
void CMP_HysVoltageSel(ui8 mSel);/***********************************************************
Function: CMP_NSource(STC32G_CMP_NSOURCE mSel);
Return value: void
mSel: negtive input source
Discription: configure comparator negtive input source
Example:
CMP_NSource(0x00); //ngeive sourve:P36
***********************************************************************/
void CMP_NSource(STC32G_CMP_NSOURCE mSel);/***********************************************************
Function: CMP_PSource(STC32G_CMP_PSOURCE mSel);
Return value: void
mSel: positve input source
Discription: configure comparator negtive input source
Example:
CMP_PSource(0x00); //ngeive sourve:P36
***********************************************************************/
void CMP_PSource(STC32G_CMP_PSOURCE mSel);/***********************************************************
Function: CMP_InitDef(STC32G_CompareDef* mStruct);
Return value: void
mStruct: STC32G_CompareDef pointer variable
Discription: init comparator struct to default
Example:STC32G_CompareDef mSruct;CMP_InitDef(&mSruct);  //init comparator struct to default
***********************************************************************/
void CMP_InitDef(STC32G_ComparatorDef* mStruct);/***********************************************************
Function: CMP_Init(STC32G_CompareDef mStruct);
Return value: void
mStruct: struct STC32G_CompareDef variable
Discription: configure comparator by mStruct
Example:STC32G_CompareDef mStruct;CMP_InitDef(&mSruct);mSruct.pSource = PS_P37;mSruct.nSource =NS_P36;CMP_Init(mStruct);  //configure comparator by mStruct
***********************************************************************/
void CMP_Init(STC32G_ComparatorDef mStruct);#endif

源文件

/*STC32G_Comparator.cDesigned by Bill LiuVersion 0.0 Modified last by Bill Liu, 07/12/2022
*/#include    "STC32G_Comparator.h"//***********************************************************************
void CMP_ConfiguDigFilter(ui8 nData)
{CMPCR2 &= 0xC0;CMPCR2 |= nData;
}
//End of CMP_ConfiguDigFilter(ui8 nData)//***********************************************************************/
void CMP_HysVoltageSel(ui8 mSel)
{//SysInit();CMPEXCFG &= 0x07;CMPEXCFG |= (mSel << 6);
}
//End of CMP_HysVoltageSel(ui8 mSel)//***********************************************************************
void CMP_NSource(STC32G_CMP_NSOURCE mSel)
{//SysInit();if(mSel)CMPEXCFG |= 0x01 << 2;elseCMPEXCFG &= 0xF3;}
//End of CMP_NSource(STC32G_CMP_NSOURCE mSel)//***********************************************************************/
void CMP_PSource(STC32G_CMP_PSOURCE mSel)
{//SysInit();CMPEXCFG &= 0xFC;CMPEXCFG |= mSel;
}
//End of CMP_PSource(STC32G_CMP_PSOURCE mSel)//***********************************************************
void CMP_InitDef(STC32G_ComparatorDef* mStruct)
{mStruct -> pSource = PS_P37;mStruct -> nSource = NS_P36;mStruct -> outAble = 0;             //disablemStruct -> oPin = O_P34;mStruct -> pIntAble = 0; // INT disable mStruct -> nIntAble = 0; // INT disablemStruct -> rInvAble  = 0;         // compare result invert disablemStruct -> aFilter = 1;      //0.1uS analog filter enablemStruct -> dFilterCycles = 0;mStruct -> dcInputHys = 0;
}
//End of CMP_InitDef(STC32G_CompareDef* mStruct)//***********************************************************************
void CMP_Init(STC32G_ComparatorDef mStruct)
{//SysInit();CMP_PSource(mStruct.pSource);CMP_NSource(mStruct.nSource);CMPOE = mStruct.outAble;CMPO_S = mStruct.oPin;PIE = mStruct.pIntAble;NIE = mStruct.nIntAble;INVCMPO = mStruct.rInvAble;DISFLT = mStruct.aFilter;CMP_ConfiguDigFilter(mStruct.dFilterCycles);CMP_HysVoltageSel(mStruct.dcInputHys);
}
//End of CMP_StructInit(STC32G_CompareDef mStruct)

三 STC32G单片机比较器的常见用法及其编程

  1. 启动掉电保护

下面是STC官方提供的掉电保护启动电路

其原理是:将7805稳压前的电压经分压电阻分压到一个适当的值,送入比较器+(P3.7),与单片机内部的Bandgap电压(1.19V)比较,当分压低于内部1.19V电压时,触发比较中断,在中断函数中将重要的参数写入单片机内部EEPROM,或外部存储器,这对一些测试仪器等设备十分有用。注意:如果写入的数据较多,需要在容量为104的电容器前,二极管后,再并一个容量较大的延时供电电容器。下面就写一个来实现掉电保护的测试程序。

程序头文件:

/*main.hDesigned by Bill LiuVersion 0.0 Modified last by Bill Liu ,03/25/2023
*/#ifndef     __MAIN_H__
#define     __MAIN_H__//#include "myport.h"
#include "mtype.h"
#include "config.h"
#include "STC32G_GPIO.h"
#include "STC32G_Delay.h"
#include "STC32G_UART.h"
#include "STC32G_EEPROM.h"
//#include "STC32G_PWM.h"
//#include "STC32G_ADC.h"
//#include "STC32G_EEPROM.H"
//#include "STC32G_SPI.h"
#include "STC32G_PWM.h"
//#include "STC32G_Timer.h"
#include "STC32G_comparator.h"STC32G_ComparatorDef mstuct;
#endif

源文件:

/*main.cDesigned by Bill LiuVersion 0.0 Modified last by Bill Liu, 03/25/2023
*/#include "main.h"ui8 str[30] = {0};
i16 t1 = 105;
i16 t2 = 115;
i16 t3 ,t4;void STC_CmpInt(void) interrupt 21    //comparator interrupt function
{EEPROM_SectorErase(0x0000);EEPROM_Write_nChar(0x0000,&t1,0x02);EEPROM_Write_nChar(0x0002,&t2,0x02);
}void main()
{SysInit();Uart1_Init(VBAUD_8BITS,G1, 0, 9600);CMP_CLEARFLAG();           //clear comparator INT flagCMP_InitDef(&mstuct);      //init comparator struct to defautmstuct.nSource = NS_BAND;  //set bandgap voltage as comparator negative source mstuct.nIntAble = 1;       // fall edge interrupt enbaleCMP_StructInit(mstuct);    //init conparator by    mstructCMP_ENABLE();              //comparator enableEA =1;                     //interrupt enableEEPROM_Read_nChar(0x0000,&t3, 2);EEPROM_Read_nChar(0x0002,&t4, 2);while(1){            LongToString(t3,str);    Uart1_SendString(str);Uart1_SendString("\r\n"); LongToString(t4,str);    Uart1_SendString(str);Uart1_SendString("\r\n");Uart1_SendString("    ");Uart1_SendString("\r\n");Delayxms(1000);}
}
//End of main()

将程序编译后下载到单片机。重启后,打开STC-ISP中的串口调试助手,如果看到如下结果,说明掉电保护启动成功。

如果看到的是如下结果,说明你的输入分压不合适,或者延时供电电容太小。

b. 电池电量过低检测

其原理与掉电保护类似,这里不再重复

c.锂电池温度检测,过高报警

市面锂电池输出线有的有两条线,有的有三条线。有三条线的有温度监测功能,在多出的一条线与电池负(GND)之间串接了一个热敏电阻,一般是NTC,利用这个电阻,就可搭成一个分压电路,利用比较器,就可实现温度监测,防止温度过高。其原理实现与a相似,这里就不重复了。

d 比较器搭配三极管或MOS管还可实现PWM恒流恒压,由于该单片机本身就内置了PWM模块,一般不需要用比较器来实现PWM恒流恒压,这里就不再做详细介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_87342.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库基础到进阶笔记整理包含事务、SQL优化、锁等内容

写在前面 本文是在学习MySQL数据库时整理的笔记&#xff0c;可供初学者学习 是在https://dhc.pythonanywhere.com/entry/share/?key12e4a7324f68371db3984d93e26e458962a4f0bc188ec23ec70637a4f3b4d58f 笔记基础上增加了一些内容以及后续的锁、InnoDB引擎等内容 课程参考b站黑…

Java数据结构与算法----搜索篇(DFS与BFS)

一.概念DFS&#xff08;Depth First Search&#xff09;深度优先搜索 和BFS&#xff08;Breadth First Search&#xff09;广度优先搜索 是两种广泛应用于搜索和遍历算法中的基本技术。这两种算法都涉及到搜索数据结构中的节点 。这里我们以二叉树为例&#xff0c;简单地图解一…

实验九 TSP问题

《算法设计与分析》实验报告 所在院系 计算机与信息工程学院 学生学号 学生姓名 年级专业 2020级计算机科学与技术 授课教师 彭绪富 学 期 2022-2023学年第一学期 提交时间 2022年10月26日 目 录 实验九-1&#xff1a;TSP问题 一、实验目的与要求 二…

【图解http】

目录了解web及网络基础TCP/IP协议族与HTTP关系密切的协议&#xff1a;IP、TCP和DNS各种协议与HTTP协议的关系URI和URLhttp协议HTTP是不保存状态的协议请求URI定位资源告知服务器意图的HTTP方法持久连接节省通信量HTTP报文编码提升传输速率压缩传输的内容编码分割发送的分块传输…

关于参加新星计划的收获

目录 作者简介 前言 一、新星计划介绍 二、新星计划创作目标 &#xff08;一&#xff09;创作打卡阶段第1周&#xff08;3/13-3/19&#xff09; &#xff08;二&#xff09;创作打卡阶段第2周&#xff08;3/20-3/26&#xff09; 三、参赛文章的构思与创作 &#xff08…

Go map 内存泄露

前言 在Go中, map这个结构使用的频率还是比较高的. 其实在所有的语言中, map使用的频率都是很高的. 之前在使用中, 一直都知道map的内存在元素删除的时候不会回收, 但一直没有仔细的研究为什么. 今天就来好好揣摩揣摩. func main() {m : make(map[int][128]byte)for i : 0; …

2023热门抖音权重查询小程序源码

2023热门抖音权重查询小程序源码 跟抖音上很火的一模一样&#xff0c;小程序适配优化。接口免费。小程序不是网页 修改教程: 1&#xff0c;如果想修改或者去除水印&#xff0c;直接删除或修改“index.html”12&#xff5e;22行 2&#xff0c;如果想修改logo&#xff0c;直接…

“全球首款旗舰”填补行业空白,两轮电动车技术创新为何只看绿源?

作者 | 曾响铃 文 | 响铃说 乒乓作为我们的“国球”&#xff0c;在数不清的体育赛事里书写辉煌战绩&#xff0c;也进一步被国人熟知、热爱。更难能可贵的是“国球”精神&#xff1a;“别人可能练了一千次&#xff0c;而我们却练了一万次”&#xff0c;冠军品质&#xff0c;奋…

MYSQL【基础篇】MYSQL 主要函数

MySQL中的函数主要分为以下四类&#xff1a; 字符串函数、数值函数、日期函数、流程函数 ​MySQL函数是MySQL数据库提供的内部函数。这些内部函数可以帮助用户更加方便的处理表中的数据 MySQL函数可以对表中数据进行相应的处理&#xff0c;以便得到用户希望得到的数据。这些函…

JAVA Session会话 Thymeleaf - 视图模板技术配置步骤

JAVAWebSession会话会话跟踪技术session保存作用域Thymeleaf - 视图模板技术配置过程Session会话 HTTP是无状态的&#xff1a;服务器无法区分这两个请求是同一个客户端发过来的&#xff0c;还是不同的客户端发过来的 现实问题&#xff1a;第一次请求是添加商品到购物车&#x…

C++中的string类【详细分析及模拟实现】

string类 目录string类一、stirng的介绍及使用1.为什么学习string类&#xff1f;2.标准库中的string类2.1 引入&#xff1a;编码2.2 basic_string3.string类的使用3.1 构造函数3.2 遍历string方式1&#xff1a;for循环方式2&#xff1a;范围for4.迭代器4.1 正向迭代器4.2反向迭…

Golang流媒体实战之二:回源

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 今天的实战是流传输过程中的常见功能&#xff1a;回源如下图&#xff0c;lal(源站)和lal(拉流节点)代表两台电脑&#xff0c;上面都部署了lalVLC在…

【蓝桥杯】巧克力

问题描述&#xff1a; 题解分析&#xff1a; 错误思想&#xff1a;本来的想法是先使用低价格的巧克力&#xff0c;并且判断需要吃几块【其中内容比较细】&#xff0c;直接计算即可&#xff0c;但是本题好像不可以用简单的最小价格的贪心来做 正确思路&#xff1a;创建一个结…

【内网安全】 横向移动IPCATSC命令Impacket套件CS插件全自动

文章目录域信息收集-目标&用户&凭据&网络域横向移动-IPC-命令版-AT&schtasks上线配置at < Windows2012 (该版本之前的操作系统使用at命令)补充反向连接上线效果图schtasks >Windows2012(适用于windows2012后的操作系统版本)建立IPC常见的错误代码域横向移…

【MySQL】JDBC---数据库编程

目录JDBC介绍准备工作操作数据库本文介绍 java 如何使用 jdbc 连接数据库以及连接数据库后的基本操作。JDBC介绍 首先来了解 JDBC(Java Database Connectivity)&#xff0c;java数据库连接。是 Java 提供一套用于操作数据库的接口 API&#xff0c;是 Java 中的数据库连接规范&…

Chapter8.2:PID控制器设计及MATLAB_SIMULINK应用

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…

Flink-FinkSQL进阶操作(系统函数,UDF,表聚合函数等,输入kafka,elasticsearch等外部系统)

11.7 函数 11.7.1 系统函数 标量函数 只有数值大小&#xff0c;没有方向的量&#xff0c;行变行 比较函数 逻辑函数 算数函数 字符串函数 时间函数 聚合函数 多行变一行 count(),sum(),rank(),row_number() 11.7.2 自定义函数(UDF) 分类 标量函数&#xff0c;聚合函…

【数据结构】二叉树及相关习题详解

新年新气象! 祝大家兔年 财源滚滚! 万事胜意! 文章目录前言1. 树的一些基础概念1.1 树的一些基本概念1.2 树的一些重要概念2. 二叉树的一些基本概念2.1 二叉树的结构2.2 两种特殊的二叉树3. 二叉树的性质4. 二叉树的存储5. 二叉树的基本操作5.1 构造一棵二叉树5.2 二叉树的遍历…

华为OD机试题【剩余可用字符集】用 Java 解 | 含解题说明

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典本篇题目:剩余可用字符集 题目 给定两个…

杨辉三角形 (蓝桥杯) JAVA

目录题目描述&#xff1a;暴力破解&#xff08;四成&#xff09;&#xff1a;二分法破解&#xff08;满分&#xff09;&#xff1a;题目描述&#xff1a; 下面的图形是著名的杨辉三角形&#xff1a; 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如…