打印

普通管脚软开通程序的汇编编程思路,谁来说说

[复制链接]
2677|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 donghailao 于 2014-8-26 11:31 编辑

PIC的一个管脚可以承担 25mA 的电流,实践证明,是没有问题的。。

可是,管脚后面的负载里有滤波电容,例如10uF, 情况就不同了,瞬间电流很大,实施对系统冲击大,可引起电源保护、掉电复位等异常。为避免尴尬,需要设计软开通程序,即逐渐开通这个管脚,使电流平滑上升。
用片内PWM管脚输出,自然是毫无疑问的,代码量少,时间也不一定独占,自然是首选。

不幸的是,我的PWM能够直接输出的所有管脚(包括二次迁移功能脚)都被设计做其他用处了, 现在就有四、五个普通I/O管脚需要编程为软开通,那么程序设计思路应该如何构思。

也不一定看代码,说说思路即可,软开通的时间可以是一、二秒或者几秒,这段时间可以被软开通独占。

也可以利用片内PWM资源或其他所有定时器等资源,但是不允许在PWM管脚上直接输出PWM(那样问题就简单的不用讨论了),我们讨论的是普通I/O的输出编程。

各位老师同学,请不啬指教,提几个思路。
沙发
yklstudent| | 2014-8-26 12:13 | 只看该作者
软件模拟产生PWM不就可以了 总不会定时器也没有吧

使用特权

评论回复
板凳
donghailao|  楼主 | 2014-8-26 12:25 | 只看该作者
本帖最后由 donghailao 于 2014-8-26 12:27 编辑
yklstudent 发表于 2014-8-26 12:13
软件模拟产生PWM不就可以了 总不会定时器也没有吧

用到定时器是可以想到的,你认为PWM的那些资源有用吗或者说能否用它们的中断简化编程?

使用特权

评论回复
地板
donghailao|  楼主 | 2014-8-26 12:30 | 只看该作者
yklstudent 发表于 2014-8-26 12:13
软件模拟产生PWM不就可以了 总不会定时器也没有吧

看到你的头像,对你的C编译器感到兴趣,它是MCC18是吧

使用特权

评论回复
5
yewuyi| | 2014-8-26 17:15 | 只看该作者
不需要操这个心。

在PIC、FREESCALL、ST、AT、NXP、TI各家MCU厂家中,PIC的IO设计是最复杂,也是最皮实的。

如果只有一个IO口接10uf的话,10uf这么大,一般都是铝电解,其自身的等效ESR就比较大,而且IO口内部有等效限流电阻,在VCC确定的情况下,你想输出更大的电流都是不太可能的。

当然,你的电容如果特别大,根据RC常数那么充电的时间就会很长,IO内部的等效限流电阻就会发热,如果你是在不断的充放,那这个发热就会累积,这确实不好,如果只是偶尔一次充电,根据我的判断,影响应该不大。

另外,必须特别指出的是:
1、在IO口接这么大的电容,至少我没发现有任何价值!
2、在IO口接这么大的电容有可能造成debug的时候连接不上等异常现象。
3、在IO口上街这么大的电容本身属于越界设计,不管PIC实际中是否能撑得住,这都是一种不合理的设计。
4、如果特别想接这个电容,因为考虑到这个电容很可能是铝电解,估计上面的频率不会太高,可以考虑串一个电阻或者电感,实在不行,用铜箔画出波浪纹绕线圈,把铜箔线搞细一点(铜箔线细到一定程度就相当于串电阻了)

使用特权

评论回复
6
donghailao|  楼主 | 2014-8-26 20:56 | 只看该作者
yewuyi 发表于 2014-8-26 17:15
不需要操这个心。

在PIC、FREESCALL、ST、AT、NXP、TI各家MCU厂家中,PIC的IO设计是最复杂,也是最皮实的 ...

版主的眼力确实独慧,作为实际芯片运行,依照我对PIC  单片机的理解,我也认为应该直接就能通过,当然要采取些措施,包括在I/O之后加电感(我加了22uH),在单片机总供电端加大电容。

现在问题是PIC的仿真、调试器ICD3,感谢叶版在另一个帖子的指导,它现在可以运行了。
现在仿真只要遇到这个I/O的的输出电压,就立即复位了。于是乎才有这个帖子的问,才有软接通的想法。

好吧,一不做,二不休!
借您的第一条吉言   1、在IO口接这么大的电容,至少我没发现有任何价值!
我明天在办公室就把那四个I/O之后的电解都去掉,每只都是10uF的钽固态,速度不低。这样至少就可以仿真调试了。待程序通过,实战时可以试着再把电容装回去,试运行一阵子,或者干脆就不装回,而是把单片机总供电口的电容加大到220uF,我看行。

哎呀,我今天一天都在编写软开通程序,虽然也也算是成功了(思路在楼下另叙述),毕竟很麻烦,不如直接开通简单啊。 感谢版主的第一条,它起了醍醐灌顶的效果。:lol

早要是看见叶版的回复,早就能想出先摘掉电容的想法来。





使用特权

评论回复
7
donghailao|  楼主 | 2014-8-26 21:30 | 只看该作者
事情的起因是有四个光电模块需要在运行的时候,选择其中的2个用,另外2个电源关闭。厂家说明书给的就是10uF电容。
因为每个模块电流才 17 mA , 自然就设计用I/O供电了,没想到调式仿真出了问题。

现在我向老师同学汇报一下,我的软开通思路和进展。
1、用TIMER1 16位定时器,产生溢出中断,每次中断里都把某I/O电平拉高,周期 大约16个毫秒。并设立中断计数器Q
2、用CCP1捕捉器去捕捉TIMER1产生中断,每次中断里都把某I/O电平拉低。这样就可以输出占空比为  CCP1H:CCP1L  /65535  的脉宽。
3、中断计数器Q,每次都改变一次 CCP1H:CCP1L 的值,初次=0  以后每次累加一个值k,直到增加到接近但不超过65535为止。

这样可以得到 一个周期为 16毫秒的PWM信号,它的精度和K有关,K越小(最小=1)精度越高,启动时间越长,反之亦然。实际可以在   精度-----启动时间  两者之间权衡。

我表达能力差,罗嗦半天,不知道说明白没有。




使用特权

评论回复
8
yewuyi| | 2014-8-27 08:17 | 只看该作者
10uf的话,你用20mA的电流给他充电,16ms时长后,这个电容都快要充满了吧(你可以大概计算一下RC参数,然后根据那个对数表看看,我估计差不多要80%以上了)

使用特权

评论回复
9
yewuyi| | 2014-8-27 08:18 | 只看该作者
17mA,你就直接输出好了,那还要什么10uF电容干啥?

使用特权

评论回复
10
gx_huang| | 2014-8-27 08:29 | 只看该作者
明显设计不合理,尽量不要这么设计。
LZ都说过了,导通瞬间,电流很大,会导致VCC电压瞬间下降复位等。
对GPIO也是超额使用,而且是大大的超额使用。
最好串联一个小电阻,比如50-100欧姆,尽量大一些。

使用特权

评论回复
11
mcu5i51| | 2014-8-27 11:02 | 只看该作者
PWM可以减缓冲击电流吗?
还是老老实实加上电感或电阻吧

使用特权

评论回复
12
donghailao|  楼主 | 2014-8-27 20:03 | 只看该作者
本帖最后由 donghailao 于 2014-8-27 20:05 编辑
yewuyi 发表于 2014-8-27 08:18
17mA,你就直接输出好了,那还要什么10uF电容干啥?

光电通信模块 --------好几个,都是吃粮食的大户,17mA对于电池供电的设备就是大电流了
在高靠通信链路里,要有自动切换模块的冗余功能, 就I/O作为光电模块的电源开关使用了。

按照制造厂家对它的设计要求,退耦合电容要尽量靠近光模块。厂家推荐值22uF,我这还减量使用了10uF哩。

使用特权

评论回复
13
donghailao|  楼主 | 2014-8-27 20:18 | 只看该作者
shu_lin1 发表于 2014-8-27 11:31
电容放在IO开关之前不可以?

实在没办法才能放到I/O之前,那样违背了退耦合电容要尽量接近用电设备的原则。

今天 ,已经实验软件模拟PWM,实现了软开通,ICD3仿真成功,不再出现异常复位了。
这次,取消了TIMER1\CCP1模块中断的编程思路,因为它要占用中断资源,采用了纯软件实现的软开通,代码量也不多,早晚我重新整理一下,把代码贴出来。

使用特权

评论回复
14
yewuyi| | 2014-8-28 08:28 | 只看该作者
donghailao 发表于 2014-8-27 20:03
光电通信模块 --------好几个,都是吃粮食的大户,17mA对于电池供电的设备就是大电流了
在高靠通信链路里 ...

1、22uf做退耦电容?这里要严肃的批评你乱套用了名词。
2、如果那个电流比较大,那你应该用一个三极管做开关管来控制,IO口接三极管的B极即可。
3、三极管就几分钱的事情。。。

使用特权

评论回复
15
gx_huang| | 2014-8-28 10:28 | 只看该作者
yewuyi 发表于 2014-8-28 08:28
1、22uf做退耦电容?这里要严肃的批评你乱套用了名词。
2、如果那个电流比较大,那你应该用一个三极管做 ...

加三极管,三极管的驱动能力更大,电源电压瞬间下降更多。
不过可以加一个三极管缓启动电路。

使用特权

评论回复
16
yewuyi| | 2014-8-28 10:44 | 只看该作者
gx_huang 发表于 2014-8-28 10:28
加三极管,三极管的驱动能力更大,电源电压瞬间下降更多。
不过可以加一个三极管缓启动电路。 ...

楼主担心瞬间下降不是指电源的输出能力,而是担心MCU的内部VCC被瞬间拉低。

在此用三极管做开关管,只要三极管选型正确,一般不会有啥问题,例如常用的9012/9013这类三极管,放大倍数一般也就30~50,因为MCU的IO到三极管B极的电流是基本确定的,所以C、E极上的电流也是受限的,同时有着大把的寄生电容和寄生电感以及等效电阻等的限制,这些也是会限制瞬态电流的。

他的电源连着也对付不了,电源设计也就太差了。

使用特权

评论回复
17
gx_huang| | 2014-8-28 12:26 | 只看该作者
无论是GPIO还是三极管,只要是瞬间导通的,电容的充电必然会拉低电源的。
除非系统有多个电源,三极管从另外一个电源供电。
任何硬件设计,要靠最后测试数据说话,要测试一下电源的瞬间跌落的幅度。
不能靠简单的看系统是否重启。
解决措施:
1、电源上加大滤波电容
2、开关上加限流措施,比如软启动,串联电阻电感。
加一个PNP三极管,EB上并联一个电容,缓启动,成本增加很少的。

使用特权

评论回复
18
donghailao|  楼主 | 2014-8-28 13:54 | 只看该作者
很喜欢叶版的严谨,求是,感谢对我的严格要求。
是的,用103,   104容量的做退耦合,是常理常见。

但是这个电路特殊,请叶版看看厂家给的PDF图纸,是它的电容量大的和小的位置设计错了,还是我说错了。

大容量电容 + 电阻或者电感   接电源,作为退耦组合器件,在数字电路里虽不多见,但并不是没有,在一些特殊电路(基波频率低)里,还是有例子的。
在过去成本紧张的时代,老的模拟电路用电解+电阻接电源的去耦合电路,就很多了。

使用特权

评论回复
19
donghailao|  楼主 | 2014-8-28 13:55 | 只看该作者

使用特权

评论回复
20
yewuyi| | 2014-8-28 14:25 | 只看该作者
donghailao 发表于 2014-8-28 13:54
很喜欢叶版的严谨,求是,感谢对我的严格要求。
是的,用103,   104容量的做退耦合,是常理常见。

你要分清退耦、滤波、稳压等之间的区别。

退耦这个名词有其特定的指向,对付的是数字信号陡峭沿变造成的骚扰。退的消除的意思,耦是耦合的意思,指的是瞬变信号耦合到正常电路中,退耦电容就是为了消除这种干扰,把耦合通道在进入目标电路之前消除掉。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

133

帖子

2

粉丝