很早我就碰到过这个问题。单片机要控制一个继电器,用IO口加上拉电阻驱动NPN管,NPN管C极接继电器(-)端。一上电继电器总要不受控制地吸合一次,不管你愿不愿意。我知道这是复位所致,却是无计可施。改为低电平控制吸合也不行,上电后单片机工作电压尚未建立、复位还没开始,IO输出为“0”,而此时继电器供电电压已达到吸合所需电压(尽管还没达到额定值)。还需要强调的一点是,为了保证单片机电源的稳定,VCC电源经常并联有一个1000U以上的大电容,这就使单片机的电源建立时间更加落后于系统中其它单元,成为最后一个开工的器件,其它单元早已进入工作状态,而单片机还刚开始复位!
直到PHILIPS的P87LPC76X现身,这个问题才得以解决。P87LPC76X有2个配置字节UCFG1和UCFG2,其中UCFG1.5可在芯片编程时设置成"复位时IO口电平为低"!这样一来,单片机在复位前、复位中、复位后IO电平都为低,彻底解决了上电时继电器吸合的问题。
问题到此并没有结束。P87LPC76X有一个最大的缺憾,就是它的FLASH是一次性的,也就是说它的程序存储器是"OTP"的。相信现在已经没有多少人还在用P87LPC76X,几乎没有人在新开发产品时选用它了,主要原因就在它的"OTP"。
好在新推出的单片机给了我另外的解决方案。例如STC单片机(臭豆腐单片机,闻闻很臭,吃起来还香,我现在就在大量使用)。它与之前的51单片机的一个显著不同就在于它的IO不再是单一的“弱上拉”,而是可以设置成推挽状态和开漏状态,就是说复位前它输出低电平,复位中、复位后输出带弱上拉的高电平,此时拉出电流的能力很弱,仅数百uA,甚至都不能可靠地驱动晶体管的基极,而要借助于上拉电阻才可以放心。复位后可以用程序指令将IO口设置成"推挽",可以提供高达20mA驱动电流,驱动晶体管是毫不费力。在驱动IO口对地接一个1K下拉电阻(还可以更小一些),再在这个IO口接一个10K电阻接晶体管基极,问题就迎刃而解了。复位时IO口虽然是高电平,但拉出电流有限,以500uA计,在1K下拉电阻上的压降也只有0.5V,达不到晶体管发射结的导通电压,因此即便输出高电平也不能使晶体管导通,因为弱上拉提供的电流几乎被下拉电阻所"短路"。复位后对IO写入"0",再把它设置成"推挽",当需要继电器吸合时,向这个IO写入"1",此时的IO由于是在"推挽"状态,输出电流能力很强,1K下拉电阻几乎对它不起作用,晶体管被轻松驱动。
|