完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这个电路是为了与目标电压进行比较,如果比目标电压高,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个回答
|
|
|
|
|
|
STM8L151比较器被拉高的原因可能有以下几点:
1. 输入阻抗:STM8L151的比较器输入阻抗可能较高,当与万用表连接时,万用表的输入阻抗较低,导致输入电压被拉高。为了减少这种影响,可以尝试使用输入阻抗更高的测量设备。 2. 单片机I/O口电流:当STM8L151的I/O口连接到比较器输入端时,可能会有微小的电流流过I/O口,导致输入电压上升。可以尝试将I/O口设置为高阻态,以减少电流的影响。 3. 电路布局和布线:电路板上的布局和布线可能导致信号干扰,从而影响测量结果。检查电路板的布局和布线,确保信号线远离可能产生干扰的元件,如电源线、地线等。 4. 电源电压波动:如果电源电压不稳定,可能会导致输入电压波动。检查电源电压是否稳定,如有需要,可以使用稳压器来稳定电源电压。 5. 比较器的参考电压:STM8L151比较器的参考电压可能受到电源电压、温度等因素的影响。检查比较器的参考电压是否稳定,如有需要,可以使用外部参考电压源。 6. 代码问题:虽然您提到代码能实现功能且输出结果与预期一致,但仍建议检查代码逻辑,确保没有导致输入电压被拉高的错误。 综上所述,要解决STM8L151比较器被拉高的问题,可以从以上几个方面进行排查和优化。希望这些建议对您有所帮助。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1678 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1580 浏览 1 评论
1012 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
703 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1626 浏览 2 评论
1892浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
673浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
537浏览 3评论
556浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
524浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-3 00:50 , Processed in 0.892427 second(s), Total 52, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号