LJW 发表于 2018-7-6 16:30:30

路过的高手指导下,为什么这个IO口有时会控制失败

电路图如下
CTL_M1控制一个双MOS管芯片,MOS管控制一个小马达。当马达被挡住不动时,过载电流2A。
单片机ADC检测DET_FLOWOVER电压超过0.2V时,控制CTL_M1为0,关闭MOS管。
现在的问题是,当过载的时候10次有一两次CTL_M1不为0还是为1,电机关闭不了。刚开始以为是软件在哪里把CTL_M1又控制为1了,结果找来找去找不到。
后来把22R电阻换成1K电阻,再加10K下拉电阻就控制稳定了。
奇怪为什么会有这种现象了呢?差点怀疑人生,不再敢写代码了。

dukelec 发表于 2018-7-6 16:34:33

我就問你示波器量過沒有。。。。

順便想說的是檢測腳正常建議在 MCU 端並一個小電容濾波。。。

LJW 发表于 2018-7-6 16:45:36

用万用表量过确实是高电平,我并一个104电容再试试

LJW 发表于 2018-7-6 17:04:05

确定是高电平,还以为是电荷存贮在那里,用10K插件电阻短接IO口跟地来放电了还是高电平。IO口控制失效为高电平后程序再也控制不了了,之后断电后才能正常控制。
并一个电容滤波情况也是一样

qq335702318 发表于 2018-7-6 17:08:13

软件问题,仔细检查代码吧...
并电容是不能解决的
另外从你的描述和原理图来看,你最好找个专业点的硬件工程师配合

LJW 发表于 2018-7-6 17:08:46

估计应该是限流电阻太小的原因吧,一开始没往这方面想,以为软件拉低了肯定为低。

LJW 发表于 2018-7-6 17:12:17

我把软件中其他拉高IO的地方都屏蔽了,只剩下一个最开始的拉高,并且一旦拉高后不再控制拉高了,真的想不通是软件哪里有问题了

jyrpxj 发表于 2018-7-6 21:46:45

51或PIC单片机程序问题,一个端口有8位输出,再用逻辑运算改写其他位时,实际执行的是读,改,写。问题出在这个读上面。

LJW 发表于 2018-7-6 23:55:08

jyrpxj 发表于 2018-7-6 21:46
51或PIC单片机程序问题,一个端口有8位输出,再用逻辑运算改写其他位时,实际执行的是读,改,写。问题出在 ...

能否再详细说明下,想了半天没想明白。

jyrpxj 发表于 2018-7-7 01:58:32

LJW 发表于 2018-7-6 23:55
能否再详细说明下,想了半天没想明白。

PA=B00000011,假设你PA.0接了10欧电阻对地。
你如何操作仅使PA.1清零?
常规操作PA=PA&B11111101,
但这样做相当于先读取PA端口的各引脚的电平状态,然后进行与操作,最后将结果送到PA。
那么,先读PA得结果是B00000010,与操作&B11111101,得B00000000,这个结果送到了PA,而不是你期待的只清零PA.1。
即使你用位操作PA.1=0,实际上还是先读PA,然后将读出的值的bit1清零,然后再传送到PA。

51和PIC等很多单片机的端口寄存器都是输入和输出共用,所以特别注意这个问题。用极小电阻耦合负载的都要注意。

解决方案:用一个变量记录输出到PA的值,凡输出的改变,都对这个变量进行操作,再将变量的值送到PA。
经验之谈:对每个IO输出端口,都用一个变量做映射,作为衔接。

手机码字不易,承接各种产品开发,望有合作共赢,互利互惠。

LJW 发表于 2018-7-7 08:00:06

jyrpxj 发表于 2018-7-7 01:58
PA=B00000011,假设你PA.0接了10欧电阻对地。
你如何操作仅使PA.1清零?
常规操作PA=PA&B11111101,


感谢你的回复,明白意思了,蛮有道理的,回去了做个实验验证下。
我在想如果是软件原因,应该现象是确定的,不会是这样随机吧。

LJW 发表于 2018-7-7 08:12:06

jyrpxj 发表于 2018-7-7 01:58
PA=B00000011,假设你PA.0接了10欧电阻对地。
你如何操作仅使PA.1清零?
常规操作PA=PA&B11111101,


我先确定是不是这个原因导致的,再去想不确定性的原因吧。

Firman 发表于 2018-7-7 08:15:18

碰到问题,不要以原程序一味调。
用个IO口接个LED直接显示探测管脚是高是低。
这样指令也简单,绝对不会有软件问题,就只有硬件问题和设计是否合理。

LJW 发表于 2018-7-7 09:05:13

Firman 发表于 2018-7-7 08:15
碰到问题,不要以原程序一味调。
用个IO口接个LED直接显示探测管脚是高是低。
这样指令也简单,绝对不会有 ...

谢谢Firman的指导!没理解大神的意思,接个LED在这个管脚上比万用表量是要直观,跟指令简单有啥关联呢?

Firman 发表于 2018-7-7 09:20:50

LJW 发表于 2018-7-7 09:05
谢谢Firman的指导!没理解大神的意思,接个LED在这个管脚上比万用表量是要直观,跟指令简单有啥关联呢? ...

随便用一个空的IO接LED,
用LED做指示灯。

supertankhzt 发表于 2018-7-7 10:35:17

jyrpxj 发表于 2018-7-7 01:58
PA=B00000011,假设你PA.0接了10欧电阻对地。
你如何操作仅使PA.1清零?
常规操作PA=PA&B11111101,


接触STC时就有注意到它读端口有区分是读引脚电平还是读锁存器数据,汇编是用不同的指令,C语言只是写法稍有不同,需要注意,这个锁存器就相当于您增加的变量。

supertankhzt 发表于 2018-7-7 11:38:24

经KEIL测试,C语言读端口一般写法都会读引脚电平,而有一种写法可以读锁存器,而不用担心引脚电平被外界影响,这种写法就是读、算、写回本端口。
在汇编里对应的是MOV=读引脚,ANL、ORL等=读锁存器。

ycheng2004 发表于 2018-7-7 11:59:11

8051可以直接改单个IO口,

LJW 发表于 2018-7-7 13:39:29

Firman 发表于 2018-7-7 09:20
随便用一个空的IO接LED,
用LED做指示灯。

哦哦,理解了。如果程序跑过这段代码就点亮led,这种方法已经在1L的项目中使用了,确实蛮好用。

LJW 发表于 2018-7-12 19:43:55

有时间了想验证下上面坛友的方法,把22R电阻又焊上去,灌上之前的程序,结果发现工作又正常了。
怎么测试都没问题,每次过载都能成功关闭mos管。难道上次是虚焊导致的,当时只有一块板可以调试?
下次遇到奇怪的问题,看看其他板子是不是也是有同样的问题,排除虚焊的可能。
页: [1]
查看完整版本: 路过的高手指导下,为什么这个IO口有时会控制失败