搜索
bottom↓
回复: 19

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

[复制链接]

出60入0汤圆

发表于 2018-7-6 16:30:30 | 显示全部楼层 |阅读模式
电路图如下
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下拉电阻就控制稳定了。
奇怪为什么会有这种现象了呢?差点怀疑人生,不再敢写代码了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出615入1076汤圆

发表于 2018-7-6 16:34:33 | 显示全部楼层
我就問你示波器量過沒有。。。。

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

出60入0汤圆

 楼主| 发表于 2018-7-6 16:45:36 | 显示全部楼层
用万用表量过确实是高电平,我并一个104电容再试试

出60入0汤圆

 楼主| 发表于 2018-7-6 17:04:05 | 显示全部楼层
确定是高电平,还以为是电荷存贮在那里,用10K插件电阻短接IO口跟地来放电了还是高电平。IO口控制失效为高电平后程序再也控制不了了,之后断电后才能正常控制。
并一个电容滤波情况也是一样

出0入0汤圆

发表于 2018-7-6 17:08:13 | 显示全部楼层
软件问题,仔细检查代码吧...
并电容是不能解决的
另外从你的描述和原理图来看,你最好找个专业点的硬件工程师配合

出60入0汤圆

 楼主| 发表于 2018-7-6 17:08:46 | 显示全部楼层
估计应该是限流电阻太小的原因吧,一开始没往这方面想,以为软件拉低了肯定为低。

出60入0汤圆

 楼主| 发表于 2018-7-6 17:12:17 | 显示全部楼层
我把软件中其他拉高IO的地方都屏蔽了,只剩下一个最开始的拉高,并且一旦拉高后不再控制拉高了,真的想不通是软件哪里有问题了

出0入213汤圆

发表于 2018-7-6 21:46:45 来自手机 | 显示全部楼层
51或PIC单片机程序问题,一个端口有8位输出,再用逻辑运算改写其他位时,实际执行的是读,改,写。问题出在这个读上面。

出60入0汤圆

 楼主| 发表于 2018-7-6 23:55:08 来自手机 | 显示全部楼层
jyrpxj 发表于 2018-7-6 21:46
51或PIC单片机程序问题,一个端口有8位输出,再用逻辑运算改写其他位时,实际执行的是读,改,写。问题出在 ...

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

出0入213汤圆

发表于 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输出端口,都用一个变量做映射,作为衔接。

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

出60入0汤圆

 楼主| 发表于 2018-7-7 08:00:06 来自手机 | 显示全部楼层
jyrpxj 发表于 2018-7-7 01:58
PA=B00000011,假设你PA.0接了10欧电阻对地。
你如何操作仅使PA.1清零?
常规操作PA=PA&B11111101,

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

出60入0汤圆

 楼主| 发表于 2018-7-7 08:12:06 来自手机 | 显示全部楼层
jyrpxj 发表于 2018-7-7 01:58
PA=B00000011,假设你PA.0接了10欧电阻对地。
你如何操作仅使PA.1清零?
常规操作PA=PA&B11111101,

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

出0入0汤圆

发表于 2018-7-7 08:15:18 | 显示全部楼层
碰到问题,不要以原程序一味调。
用个IO口接个LED直接显示探测管脚是高是低。
这样指令也简单,绝对不会有软件问题,就只有硬件问题和设计是否合理。

出60入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2018-7-7 11:38:24 | 显示全部楼层
经KEIL测试,C语言读端口一般写法都会读引脚电平,而有一种写法可以读锁存器,而不用担心引脚电平被外界影响,这种写法就是读、算、写回本端口。
在汇编里对应的是MOV=读引脚,ANL、ORL等=读锁存器。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入30汤圆

发表于 2018-7-7 11:59:11 来自手机 | 显示全部楼层
8051可以直接改单个IO口,

出60入0汤圆

 楼主| 发表于 2018-7-7 13:39:29 来自手机 | 显示全部楼层
Firman 发表于 2018-7-7 09:20
随便用一个空的IO接LED,
用LED做指示灯。

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

出60入0汤圆

 楼主| 发表于 2018-7-12 19:43:55 | 显示全部楼层
有时间了想验证下上面坛友的方法,把22R电阻又焊上去,灌上之前的程序,结果发现工作又正常了。
怎么测试都没问题,每次过载都能成功关闭mos管。难道上次是虚焊导致的,当时只有一块板可以调试?
下次遇到奇怪的问题,看看其他板子是不是也是有同样的问题,排除虚焊的可能。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 17:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表