矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 7647|回复: 45

我在做设计时遇到的单片机的一个小细节

[复制链接]
     
发表于 2018-12-25 01:08:32 | 显示全部楼层 |阅读模式
我在自制设计一台“双刀流”T12焊台的时候,用到单片机STC15F104W来进行T12的驱动信号及待机控制,驱动很成功,但是待机功能却不能触发,这令我百思而不得其解。我设想的T12待机功能其实很简单,因为T12手柄中的待机系统其实就相当于一个开关,当人们在进行焊接作业的时候,手柄是处于
活动状态的,那么手柄内的滚珠开关里的滚珠就会走来走去,碰撞到弹簧片的开关就会形成一次次的导通断开。

1.PNG

当没有去使用T12的时候,T12手柄是静止的,那么这个开关就会一直断开。所以我在单片机设计的时候,非常简单地使用了以下方案:

2.PNG

我使用了单片机的5脚进行这个事件的的检测。可以看到,我将单片机的P3.0接一条线到手柄的检测线一端,而另一条线接与单片机同样的地,那么我只要在单片机的程序中开始将P3.0设为普通IO口并状态设为1,然后我开启P3.0对应的下降沿中断触发事件。那么在工作时,只要手柄一震动,开关就会将P3.0口的电压下拉到地,就会马上触发中断事件,而在中断事件中,我写代码在中断发生后就持续工作(或清零之前积累秒数),如果长时间没有此事件发生,那么主程序中就会积累秒数,到达一定秒数后进入待机状态。

//中断触发服务程序
void exint4() interrupt 16 //INT4中断入口
{
Led = !Led; //将测试口取反
int_mu_save=T0_CloseMu; //重置待机倒计时
int_ms=0;
int_s=0;
}/
/主程序
void main(void)
{
SleepTC=1; //睡眠锁定打开监控 P3.0设状态1
INT_CLKO |= 0x40; //(EX4 = 1)使能INT4中断
EA = 1;
...


设计看似一切完美,但是实际组装机器使用的时候却发现无论手柄怎么静止放置,始终都会一直工作而无法进入待机状态。程序没错啊!仔细检查了很久,没能发现问题,况且这板子在上机之前测试过,是能准确地进入待机状态的。这下子一个激灵,我想起了,对!上机前测试能正常,现在上机后,差别在什么?就是插入手柄,大家想想,一个手柄,线那么长,那么很可能这条长长的线感应了空间中的市电交流电,即使我手柄不动,这个感应电叠
加到端口上,就可能会将端口上的5V电位(1)拉到地或以下(0),我是这样分析的:

3.PNG

那么实际上这个端口会被感应电叠加而下拉到0,这个中断就会一直被触发清零计数而不能进入待机。怎么解决这个问题呢?我想到的是单片机自身的上拉电阻值太大,上拉电流不够造成受干扰情况比较大,那么我只需要人为再增加一个上拉电阻使其稳定即可!

4.PNG

于是我便增加1只10k电阻上拉至电源正,然后信心满满地试机,结果,大跌眼镜,不行!!还是老样子,是上拉电流还不够?没办法,我只好将10k换成1k(狠),这下子行了吧?结果上机一试,还是不能准确进入待机!这下子真的有鬼了!连1k这么强的上拉也不能对抗干扰??有鬼!有鬼!会不会我什么都
错了?这个世界是真实的吗??
想了一天,终于想出来可能的问题所在!就是这个INT4,顾名思义这个叫下降沿触发,什么叫下降沿?就是坡度,在坡度下降的边触发,而不管这个坡度是否够深!!这就所以为什么叫下降沿触发而不叫0电位触发的原因了!
我想是这样的:

5.PNG

这样一解释的话,那么我在程式中增加1句:

//中断触发服务程序
void exint4() interrupt 16 //INT4中断入口
{
if (SleepTC==0)//增加的句,下降沿触发也必须确认电平为0
{
Led = !Led; //将测试口取反
int_mu_save=T0_CloseMu; //重置待机倒计时
int_ms=0;
int_s=0;
}
}


增加的这句以确保当前事件是因为震动开关的接通而将电位下拉至0所产生的,而不是因为感应干扰在这些微弱的波动中的坡度而产生的。
结果,结果是达到程序设计要求的!手柄在静止一段时间后能稳稳地进入待机状态!而在使用的时候又能正常工作状态。
后记,我之前一直认为下降沿事件就等于端口的状态由1转为0所产生的,而现在我改变了我的观念,现在我认为我的想法才是正确的,单片机不一定要进入0状态才会触发下降沿中断,虽然我还没有时间可以做这个实验证明,这里发出来是想让大家注意这个细节,以便我们设计能减少BUG,稳健地运行!!
谢谢阅读!最后奉上我的作品“双刀流T12”美图让大家欣赏:

6.JPG

后记:前面得意洋洋地说了一大通,结果经过今晚上实验电路加示波器证明,我是错的!!事实上,即使加了1K的上拉电阻,依然不能阻止干扰将端口的电位拉至0电位或负电位!根据实验,还证明了单片机确确实实要电位下降至1.5V以下才会触发一次下降沿中断(此时端口状态肯定处于0),而必须电位上升到2V以上之后再下降至1.5V以下才能触发下一次下降沿中断!!根据实验证明了单片机是正常的,下降沿也确实是从1至0才会触发,我临时改变的观点反而是错的!
那么加了1K的上拉电阻起到的作用是什么?从示波器可以看到,1K的电阻使得端口被干扰下拉的时间变短,仅仅10-15nS,就会被1K电阻拉回高电位。
而后来为什么我加了那么一句判断语句
if (SleepTC==0)
就变得稳定正常了呢?
是因为这个语句单片机也是需要时间来执行的!当端口被干扰下拉触发下降沿事件起,再到执行这个判断语句,这段时间后,实际端口的干扰下拉早已被1K电阻拉至正常电位状态,因此此时再加入一句判断,实际上端口早已恢复到1状态了!
这不就是和按键消抖程序一模一样了吗?事实正是如此!!多加几个同一样的判断,每个判断单片机都是需要执行时间的!干扰的特点就是持续时间短,因此这个状态早已退出!
这就是为什么后来我加了一句判定语句就变得正常的原因!!而非我之前所想的!!
谢谢大家,看来我前面几页说了分析了一大堆,都是错的!!本来这个文档也没存在的价值了,但我不舍得删,那就保留吧!当作以后的警醒作用,凡事都要就事实分析,而不是一切都想当然了!
最后的最后:通过实验,我发现在端口上加一个103(10nF)的电容,也能够很有效地防止干扰的发生。

7.PNG

评分

5

查看全部评分

     
发表于 2018-12-25 06:54:35 | 显示全部楼层
最后就是加了个103,问题解决。其实适当运用下模拟技术,数字电路也会工作得更稳定。

评分

1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

     
 楼主| 发表于 2018-12-25 01:11:46 | 显示全部楼层
我在做设计时遇到的单片机的一个小细节.rar (678.79 KB, 下载次数: 173)
回复 支持 反对

使用道具 举报

     
发表于 2018-12-25 02:18:50 | 显示全部楼层
本帖最后由 壹法拉 于 2018-12-25 02:34 编辑

分析的细致,图文并茂!
实践证明,很多时候,莫名其妙的问题出现,百思不得其解时,都是我们自己太主观,甚至怀疑是否单片机本身有问题,最后某天突然灵感来了,问题解决了,真的很痛快!
有一次我在电话里诉说我遇到的BUG,给别人比喻我遇到的问题,就如同拿钥匙开门,怎么拧也不开,一次,偶尔挪动一下门口的垃圾袋,门就能打开了;这莫名其妙的关联,怎么可能,但最后证明,虽然垃圾袋与门没什么关系,但是这个动作的时间很重要;

解决单片机程序中的BUG是一种快乐!不次于第一次装响收音机的愉悦!

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2018-12-25 05:25:50 | 显示全部楼层
说的很好,能分享原程序吗?

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2018-12-25 08:27:57 | 显示全部楼层
图文并茂,小白都看懂了

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2018-12-25 09:04:12 来自手机 | 显示全部楼层
楼主通过这次制作,收获大大的。如果不是在学习时对这个问题有明确的认识,并且应用中不出现这种环境,对这个下降沿触发,依然会按自己的理解用。经过这一次,搞明白了其中的确切定义,对以后的使用会带来极大的好处。过去很多时候靠硬件,想沿触发要用电容分离,有时还要施密特触发整形,现在就是一个指令。但对这个指令,也许在规格书上有明确的规定,多大的电压触发。或者是持续多宽的时间触发。总的来说,硬件简化了,软件就累了,板子上元件越少,程序越多。给楼主鼓掌

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2018-12-25 11:51:32 | 显示全部楼层
虽然过程曲折,但楼主通过此diy收获颇丰,特别是最后的试验

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2018-12-27 13:36:18 | 显示全部楼层
很不错的设计,分析很细致。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2018-12-27 21:12:24 | 显示全部楼层
我如果设计的话,控制就用微动开关

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2018-12-27 22:27:54 | 显示全部楼层
早上示波器早就解决了,要善于利用仪器。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2018-12-27 23:15:32 | 显示全部楼层
输入口接个电容就能有效的解决干扰问题,按键有时也要加个电容来解决干扰问题

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2019-1-16 05:12:54 | 显示全部楼层
哪个公司的,明天老板会找你谈话,呵呵,
回复 支持 反对

使用道具 举报

     
发表于 2019-1-16 07:48:51 | 显示全部楼层
我被STC15F104W的定时器折腾过,使劲用它的定时器1,各种莫名其妙的程序不正常,过了几天一查手册,原来这个片子没有T1呀!只有T0与T2
回复 支持 反对

使用道具 举报

     
发表于 2019-1-16 08:24:09 | 显示全部楼层
很宝贵的经验,学习了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-16 23:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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