STM32
直播中

申换换

7年用户 1513经验值
私信 关注
[问答]

STM8L151比较器被拉高的原因?

这个电路是为了与目标电压进行比较,如果比目标电压高,COMP_CSR2_CMP2OUT输出高,如果比目标电压低,COMP_CSR2_CMP2OUT输出低。代码能实现这个功能,输出结果与预期的一致,但是为什么用万用表测两输入端的电压都被拉高了,不接到单片机上时用万用表测为1.5V,但是接到单片机上会被拉到2.3V。不知道是什么原因,请教一下各位高手。
#include
unsigned int count=0;
unsigned char on_off=0;    //on 1  off 0
void delay(unsigned int ms)
{
  unsigned int x , y;
  for(x = ms; x > 0; x--)
    for(y = 1000 ; y > 0 ; y--);
}
void COMPInit()               //组2中PC3/4/7    组8中PD0/1/PE5
{
  CLK_PCKENR2_PCKEN25=1;
  //Close the I/O switch of any I/O of group 3 by setting CH7E in RI_IOSR1 or CH8E in RI_IOSR2 or CH9E in RI_IOSR3.
  //
  COMP_CSR3_INSEL=COMP_CSR3_INSEL|0x01;//选择负向输入端001 = I/O (Group 2 of I/Os

  PD_DDR_bit.DDR1 = 0;      //GPB->PIN2 设置端口PB->2的输入输出方向寄存器为输入方向
  PB_CR1_bit.C11 = 0;       //GPB->PIN2 Floating without
  //PB_CR2_bit.C21 = 1;       //GPB->PIN2  使能外部中断
  PC_DDR_bit.DDR4 = 0;      //GPB->PIN2 设置端口PB->2的输入输出方向寄存器为输入方向
  PC_CR1_bit.C14 = 0;       //GPB->PIN2 Floating without
  //PC_CR2_bit.C24 = 1;       //GPB->PIN2  使能外部中断

   RI_IOSR1_bit.CH4E=1;  //PC7 IO关
   RI_IOSR2_bit.CH5E=1;  //PC4 IO关
   RI_IOSR3_bit.CH6E=1;  //PC3 IO关

   RI_IOSR1_bit.CH22E=1;  //PD1 IO关
   RI_IOSR2_bit.CH23E=1;  //PD0 IO关
   //RI_IOSR3_bit.CH4E=1;   //PE5 IO关

   COMP_CSR2_CMP2=COMP_CSR2_CMP2|0x03;  //11: Event detection on both rising/falling edges of comparator 2 output

   RI_ASCR1_bit.AS7=1;   // I/O groups and selection PD1  +
   RI_ASCR1_bit.AS1=1;   // I/O groups and selection PC4  -

}
void LED1Init()
{
   //LED1 GPIO  INIT
    PD_DDR_bit.DDR5 = 1;    //设置端口PD->5的输入输出方向寄存器为输出方向
    PD_CR1_bit.C15 = 1;     //设置PD->5为推挽输出
    PD_CR2_bit.C25 = 1;     //设置PD->5的输出速率为10MHZ

    //LED2 GPIO  INIT
    PB_DDR_bit.DDR0 = 1;    //设置端口PB->0的输入输出方向寄存器为输出方向
    PB_CR1_bit.C10 = 1;     //设置PB->0为推挽输出
    PB_CR2_bit.C20 = 1;     //设置PB->0的输出速率为10MHZ

    //LED3 GPIO  INIT
    PB_DDR_bit.DDR1 = 1;    //设置端口PB->1的输入输出方向寄存器为输出方向
    PB_CR1_bit.C11 = 1;     //设置PB->1为推挽输出
    PB_CR2_bit.C21 = 1;     //设置PB->1的输出速率为10MHZ

    //LED4 GPIO  INIT
    PD_DDR_bit.DDR6 = 1;    //设置端口PD->6的输入输出方向寄存器为输出方向
    PD_CR1_bit.C16 = 1;     //设置PD->6为推挽输出
    PD_CR2_bit.C26 = 1;     //设置PD->6的输出速率为10MHZ
}
int main(void)
{
   //asm("sim");              //关总中断
   //CLK_CKDIVR = 0x00;       //内部时钟为1分频  系统时钟为16MHZ
   LED1Init();              //初始化LED1

   COMPInit();
   //asm("rim");              //打开系统总中断
   while(1)                 //主程序循环LED2闪,当有中断时,先运行中断,等中断运行完了才运行主程序   
   {                  
     PB_ODR_bit.ODR0=1;      //LED2灭
     delay(100);
     PB_ODR_bit.ODR0=0;      //LED2亮
     delay(100);     
     if(COMP_CSR2_CMP2OUT==1)
     { PB_ODR_bit.ODR1=1;    //PD1高 LED3闪
      delay(100);
     PB_ODR_bit.ODR1=0;
     delay(100);   
     }   
     if(COMP_CSR2_CMP2OUT==0)
     {PD_ODR_bit.ODR6=1;     //PC4高 LED4闪   
     delay(100);
     PD_ODR_bit.ODR6=0;
     delay(100);   
     }      
   }
}




回帖(2)

潘晶燕

2024-5-6 16:25:22
请确认,你的单片机地与电源地是同一参考点吗?
2.3V-1.5V=0.8V
感觉像是多了个二极管的电压。
举报

神船大幅

2024-5-6 16:46:55
STM8L151比较器被拉高的原因可能有以下几点:

1. 输入阻抗:STM8L151的比较器输入阻抗可能较高,当与万用表连接时,万用表的输入阻抗较低,导致输入电压被拉高。为了减少这种影响,可以尝试使用输入阻抗更高的测量设备。

2. 单片机I/O口电流:当STM8L151的I/O口连接到比较器输入端时,可能会有微小的电流流过I/O口,导致输入电压上升。可以尝试将I/O口设置为高阻态,以减少电流的影响。

3. 电路布局和布线:电路板上的布局和布线可能导致信号干扰,从而影响测量结果。检查电路板的布局和布线,确保信号线远离可能产生干扰的元件,如电源线、地线等。

4. 电源电压波动:如果电源电压不稳定,可能会导致输入电压波动。检查电源电压是否稳定,如有需要,可以使用稳压器来稳定电源电压。

5. 比较器的参考电压:STM8L151比较器的参考电压可能受到电源电压、温度等因素的影响。检查比较器的参考电压是否稳定,如有需要,可以使用外部参考电压源。

6. 代码问题:虽然您提到代码能实现功能且输出结果与预期一致,但仍建议检查代码逻辑,确保没有导致输入电压被拉高的错误。

综上所述,要解决STM8L151比较器被拉高的问题,可以从以上几个方面进行排查和优化。希望这些建议对您有所帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分