当前位置:网站首页>[stc8g2k64s4] introduction of comparator and sample program of comparator power down detection

[stc8g2k64s4] introduction of comparator and sample program of comparator power down detection

2022-04-23 14:45:00 perseverance52

【STC8G2K64S4】 Comparator introduction and comparator power down detection example program


STC8GK2 Introduction to comparator

STC8G A comparator is integrated in the series MCU . The positive pole of the comparator can be P3.7 Port or ADC Analog input channel , The negative electrode can P3.6 Or internal port BandGap after OP After REFV voltage ( Internal fixed comparison voltage ). The application of multiple comparators can be realized through multiplexer and time-sharing multiplexing .
There is a programmable two-stage filter inside the comparator : Analog filtering and digital filtering . Analog filtering can filter out the burr signal in the comparison input signal , Digital filtering can wait for the input signal to be more stable before comparison . The comparison result can be obtained directly by reading the internal register bit , The result of the comparator can also be output to the external port in the forward or reverse direction . The comparison result is output to the external port, which can be used as trigger signal and feedback signal of external events , It can expand the application scope of comparison .

  • Internal structure diagram of comparator
     Insert picture description here
  • Comparator related registers
     Insert picture description here
  • Comparator control register 1(CMPCR1)
     Insert picture description here
     Insert picture description here
  • Comparator control register 2(CMPCR2)
     Insert picture description here
     Insert picture description here
     Insert picture description here
  • Wiring instructions
     Insert picture description here

Use of comparator ( Interrupt mode )

/*STC8G2 MCU interrupt mode to obtain P36 Pin voltage value and internal voltage 1.19V Compare the voltage , Output the result to P10,  When P36 Pin voltage is higher than 1.19v when , be P10 Output high level , lower than 1.19V An interrupt is triggered ,P10 Output low level */
#include "reg51.h"
#include "intrins.h"
sfr CMPCR1 = 0xe6;
sfr CMPCR2 = 0xe7;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
sbit P10 = P1^0;
sbit P11 = P1^1;

void cmp() interrupt 21 using 1
{
    
	CMPCR1 &= 0xbf;// Manually clear the interrupt flag ,1011,1111
	P10 = (CMPCR1 & 0x01); // Compare the result of the comparator CMPRES Output to the test port to display 
}
void main()
{
    	
    P0M0 = 0x00;// Set up a IO The port is a quasi two-way port 
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
		P10 =0;// initial P10 The port is low 
    CMPCR2 = 0x00;
    CMPCR2 &= ~0x80; // Comparator forward output 
// CMPCR2 |= 0x80; // Comparator reverse output 
    CMPCR2 &= ~0x40; // Can make  0.1us  wave filtering 
// CMPCR2 |= 0x40; // prohibit  0.1us  wave filtering 
// CMPCR2 &= ~0x3f; // The result of the comparator is output directly 
    CMPCR2 |= 0x10; // The comparator result passes through  16  Output after de dithering the clock 
    CMPCR1 = 0x00;
    CMPCR1 |= 0x30; // Enable comparator edge interrupt 
// CMPCR1 &= ~0x20; // Disable comparator rising edge interrupt 
// CMPCR1 |= 0x20; // Enable the rising edge of the comparator to interrupt 
// CMPCR1 &= ~0x10; // Disable the falling edge interrupt of the comparator 
// CMPCR1 |= 0x10; // Enable the falling edge of the comparator to interrupt 
    CMPCR1 &= ~0x08; //P3.7  by  CMP+ Input foot 
// CMPCR1 |= 0x08; //ADC  Input pin is  CMP+ Input foot 
		CMPCR1 &= ~0x04; // Inside  1.19V  The reference signal source is  CMP- Input foot 
 // CMPCR1 |= 0x04; //P3.6  by  CMP- Input foot 
// CMPCR1 &= ~0x02; // Disable comparator output 
    CMPCR1 |= 0x02; // Enable comparator output 
    CMPCR1 |= 0x80; // Enable comparator module 
		EA =1;
    while (1)
    {
    
    }
}


Use of comparator ( A query )

If the query method is , Is in the while In the loop, the status of the corresponding register is continuously queried to determine the current comparator input pin (P37 mouth ) The voltage value of .

/*STC8G2 MCU interrupt mode to obtain P36 Pin voltage value and internal voltage 1.19V Compare the voltage , Output the result to P10,  When P36 Pin voltage is higher than 1.19v when , be P10 Output high level , lower than 1.19V An interrupt is triggered ,P10 Output low level */
#include "reg51.h"
#include "intrins.h"
sfr CMPCR1 = 0xe6;
sfr CMPCR2 = 0xe7;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
sbit P10 = P1^0;
sbit P11 = P1^1;

//void cmp() interrupt 21 using 1
//{
    
// CMPCR1 &= 0xbf;// Manually clear the interrupt flag ,1011,1111
// P10 = (CMPCR1 & 0x01); // Compare the result of the comparator CMPRES Output to the test port to display 
//}
void main()
{
    	
    P0M0 = 0x00;// Set up a IO The port is a quasi two-way port 
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
		P10 =0;// initial P10 The port is low 
    CMPCR2 = 0x00;
    CMPCR2 &= ~0x80; // Comparator forward output 
// CMPCR2 |= 0x80; // Comparator reverse output 
    CMPCR2 &= ~0x40; // Can make  0.1us  wave filtering 
// CMPCR2 |= 0x40; // prohibit  0.1us  wave filtering 
// CMPCR2 &= ~0x3f; // The result of the comparator is output directly 
    CMPCR2 |= 0x10; // The comparator result passes through  16  Output after de dithering the clock 
    CMPCR1 = 0x00;
    CMPCR1 |= 0x30; // Enable comparator edge interrupt 
// CMPCR1 &= ~0x20; // Disable comparator rising edge interrupt 
// CMPCR1 |= 0x20; // Enable the rising edge of the comparator to interrupt 
// CMPCR1 &= ~0x10; // Disable the falling edge interrupt of the comparator 
// CMPCR1 |= 0x10; // Enable the falling edge of the comparator to interrupt 
    CMPCR1 &= ~0x08; //P3.7  by  CMP+ Input foot 
// CMPCR1 |= 0x08; //ADC  Input pin is  CMP+ Input foot 
		CMPCR1 &= ~0x04; // Inside  1.19V  The reference signal source is  CMP- Input foot 
 // CMPCR1 |= 0x04; //P3.6  by  CMP- Input foot 
// CMPCR1 &= ~0x02; // Disable comparator output 
    CMPCR1 |= 0x02; // Enable comparator output 
    CMPCR1 |= 0x80; // Enable comparator module 
// EA =1;
    while (1)
    {
    

// CMPCR1 &= 0xbf;// Manually clear the interrupt flag ,1011,1111
	P10= (CMPCR1 & 0x01); // Compare the result of the comparator CMPRES Output to the test port to display 
    }
}

As a power down detection , It is best to use interrupt mode , To deal with Events , take P37 As an external voltage detection port , If the internal voltage is used for comparison , Namely 1.19V As a comparative value . It is recommended to use P36 As CMP- Input foot , Receive 3.3V On voltage , Single chip microcomputer adopts 5V Power supply ,P37 Pin detection 5V Voltage value , When the detection voltage is lower than 3.3V when , The interrupt will be triggered , It is equivalent to increasing the reference voltage of the comparison to 3.3V, The implementation related code is as follows :CMPCR1 |= 0x04; //P3.6 by CMP- Input foot

  • P36 As CMP- Enter the pin code
/*STC8G2 MCU interrupt mode to obtain P36 Pin voltage value and internal voltage 1.19V Compare the voltage , Output the result to P10,  When P36 Pin voltage is higher than 1.19v when , be P10 Output high level , lower than 1.19V An interrupt is triggered ,P10 Output low level */
#include "reg51.h"
#include "intrins.h"
sfr CMPCR1 = 0xe6;
sfr CMPCR2 = 0xe7;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
sbit P10 = P1^0;
sbit P11 = P1^1;

void cmp() interrupt 21 using 1
{
    
	CMPCR1 &= 0xbf;// Manually clear the interrupt flag ,1011,1111
	P10 = (CMPCR1 & 0x01); // Compare the result of the comparator CMPRES Output to the test port to display 
}
void main()
{
    	
    P0M0 = 0x00;// Set up a IO The port is a quasi two-way port 
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
		P10 =0;// initial P10 The port is low 
    CMPCR2 = 0x00;
    CMPCR2 &= ~0x80; // Comparator forward output 
// CMPCR2 |= 0x80; // Comparator reverse output 
    CMPCR2 &= ~0x40; // Can make  0.1us  wave filtering 
// CMPCR2 |= 0x40; // prohibit  0.1us  wave filtering 
// CMPCR2 &= ~0x3f; // The result of the comparator is output directly 
    CMPCR2 |= 0x10; // The comparator result passes through  16  Output after de dithering the clock 
    CMPCR1 = 0x00;
    CMPCR1 |= 0x30; // Enable comparator edge interrupt 
// CMPCR1 &= ~0x20; // Disable comparator rising edge interrupt 
// CMPCR1 |= 0x20; // Enable the rising edge of the comparator to interrupt 
// CMPCR1 &= ~0x10; // Disable the falling edge interrupt of the comparator 
// CMPCR1 |= 0x10; // Enable the falling edge of the comparator to interrupt 
    CMPCR1 &= ~0x08; //P3.7  by  CMP+ Input foot 
// CMPCR1 |= 0x08; //ADC  Input pin is  CMP+ Input foot 
// CMPCR1 &= ~0x04; // Inside  1.19V  The reference signal source is  CMP- Input foot 
   CMPCR1 |= 0x04; //P3.6  by  CMP- Input foot 
// CMPCR1 &= ~0x02; // Disable comparator output 
    CMPCR1 |= 0x02; // Enable comparator output 
    CMPCR1 |= 0x80; // Enable comparator module 
		EA =1;
    while (1)
    {
    
// P10= (CMPCR1 & 0x01); // Compare the result of the comparator CMPRES Output to the test port to display 
    }
}

版权声明
本文为[perseverance52]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204231426130235.html