原创 带“锁定输出”的数控稳压电源(二)

2015-10-25 22:37 1699 7 8 分类: MCU/ 嵌入式 文集: 开源培训
3.控制程序编写
       硬件电路设计完成后,就要编写软件了。软件基本上可以分为键盘驱动,PWM生成,功能实现等部分。
3.1 键盘处理程序
       STC单片机的引脚可以设置为推挽输出、强上拉、仅为输入等状态,这个电路就是使用此特性来实现引脚的复用,以便使用仅20个引脚的单片机,降低成本。从图3中可以看到,数码管驱动和按键复用了P1.0~P1.4引脚。在大部分时间内,这些引脚被设置为推挽输出,用于驱动数码管。每隔一段时间,采集一次按键的状态。在将这些引脚作为输入使用之前,先把P3.5 P3.2 P3.1 P3.0 置为高阻状态,这些引脚用于数码管或发光管的公共阳极端,将它们设置为高阻态以后,数码管不再导通,避免对按键的判断产生影响。接着将P1口各引脚设置为高阻输入状态,从图中可以看到,按键的一端接有阻值为10K的排电阻,这个排电阻的公共端接+5V;而按键的另一端全部连接在一起,并通过1K电阻接地。当P1口被置为高阻状态后,如果没有键被按下,则由于排阻PZ1的作用,P1相应的引脚上将读到高电平1。如果有某一个或者多个按键被按下,则这些按键对应的引脚将变为低电平。因此,读入P1口的状态即可判断哪些按键被按下。以下是键盘处理程序。
uchar Key(void)                //键盘处理
{          uchar Key;
       static uchar Mark;          //标志
       uchar temp1,temp2=0; //暂存键值
       if(Mark==0)                 //无键按下
       {     if(iTNum!=0)
                     return 0;        
       }                                
       TR1=0;
       temp2=P3;                    //读取P3值
       temp2|=0xd8;                //除P3.5,P3.2,P3.1,P3.0以外,各位置1
       P3M1&=0xd8;             
       P3M0|=0x27;                //P3.5 P3.2 P3.1 P3.0 置为高阻
 
       temp1=P1;
       P1|=0xff;                      //P1输出为高
       P1M0=0xff;          
       P1M1=0;                     //设置P1口是高阻输入
       uDelay();                      //短暂延时
       Key=P1;                //取P1口的值
       P1M0=0x0;          
       P1M1=0xff;           //设置P1口为推挽输出
       P1=temp1;             //还原P1口的值
 
       P3M0&=0xd8;
       P3M1|=0x27;         //恢复P3相应端口为推挽输出
       TR1=1;
       Key|=0xe0;            //高3位不参与键值判断
       if(0xff==Key)        //无键按下
       {     Mark=0;         //清除该标志
……常规的按键操作程序。
3.2       PWM波形生成
PWM波形的频率可以根据工作特点、单片机内部结构等来确定,这里使用50HZ。程序中,CalcPwmOut函数根据设定的数值,计算PWM波形中高电平和低电平各应持续的时间,然后折算成定时器的定时初值。频率为50Hz即定时时间为20ms,也就是不论输出波形的占空比如何,其周期总是20ms。当所用晶振频率为12M时,周期的计数值必须是20000。周期计数值由高电平输出阶段持续值和低电平输出阶段持续时间两部分组成,这两部分计数值加起来是20000。以占空为20%为例,高电平持续时间为4ms,计数值为4000,而低电平持续时间为16ms,计数值为16000。理论上,输出的控制电压可以在0~5V之间变化,即占空比可以为0%~100%,但实际上,为了保证精度,这里规定占空比不得超过10%~90%,即基准电压在0.5~4.5之间变化,计数值在2000~18000之间变化。为了获得整数计算结果,这个值也可能会有所调整。例如,我们要设计输出电压为3~12V的电源模块,如果计数值从2000~18000变化,即变化量为18000-2000=16000,16000/90=177.77,这样不合理。如果将起点和计数值设为2000~16400,即间隔为16400-2000=14400,14400/90=160。这样,相应的计算公式是:Vv*160+2000,式中Vv用来表示电压值,其值从30变化到120。当设定电压为3.0V时,计算结果是6800,而当设定电压为12V(Vv=120时),计算结果是16400,相当于获得的基准电压为1.7V~4.1V。当禁止输出时,输出占空比为10%的PWM波形,即0.5V的基准电压。
void CalcPwmOut()              //PWM输出计算
{    
       ulong      ltmp;
       ltmp=Vv;                            //取设置值
       ltmp*=160;
       ltmp+=2000;
       if(OutCnt==0||iProtect) //如果禁止输出
              ltmp=2000;            //则输出基准值
       Tmr0H=ltmp;
       Tmr0L=PwmZs-Tmr0H;
……
计算出高电平应该持续的时间以后,用PwmZs(20000)减去这个值,就是低电平持续时间。然后再分别计算出高电平持续时间对应的TH0预置值和TL0预置值,其方法是用65536减去相应的计数值,然后分别取高8位和低8位,相应的程序如下所示。
       Tmr0HH=(65536-Tmr0H)/256;
       Tmr0HL=(65536-Tmr0H)-Tmr0HH*256;
       Tmr0LH=(65536-Tmr0L)/256;
       Tmr0LL=(65536-Tmr0L)-Tmr0LH*256;
3.3       数据的保存
STC12C2052芯片内置了EEPROM,可以用来保存相关参数。在STC芯片的数据手册上提供了相应的参考C语言参考程序。
       其中读数据的函数为:unsigned char ByteRead(unsigned int Addr);
       擦除单元数据的函数为:void EraseSector(unsigned int Addr);
       将数据写入指定单元的函数为void ByteWrite(unsigned int Addr,unsigned char Dat);
       调用这些函数的例子如下:
       1.读出指定单元中的数据
       OutMode=ByteRead(0x1000);
       OpenSt=ByteRead(0x1001);
       LockMode=ByteRead(0x1002);
2.擦除指单元
       EraseSector(0x1000);
3.将数据写入指定单元
       ByteWrite(0x1000,OutMode);
       ByteWrite(0x1001,OpenSt);
       ByteWrite(0x1002,LockMode);
       ByteWrite(0x1003,Vv);
      4.制作与调试
       作者是批量制作,因此使用了印刷线路板。其中图2用了单面板,而图3则使用了双面板。图3所示的控制电路基本不需要调试,只要安装无误,即可正常工作,图2所示主电路需要进行按一定的顺序进行调试。安装图2所示主电路后,与控制电路连接,数码管上应能显示默认值3.0。单击按钮,按1.3节描述测试各功能,对于输出电压不必在意,只管数码管、LED显示正确即可。
       LED、数码管等功能测试完毕后,按下输出切换键,关闭输出,此时输出指示LED熄灭。使用万用表测量图2所示Va,该值应该是5V,这个值的绝对精度要求并不高,因此通常不需要调整。如果该值偏离5V较多,应检查T1及周边元件是否损坏。当Va是5V时,VT1集电极电压约为4.1V。调节RP3,使得IC1的7脚输出为0V,即完成零点调整。将数码管上电压输出值调整为12.0V,按下输出切换键,开启输出,此时输出指标灯LED点亮。测量J4输出端电压,调整RP2,使得输出端的电压为12V,这样就完成了电压调整工作。输出保护可以视需要来进行调整,如果要在输出电流是1A时保护,可以在输出端接上负载,并串入电流,调整负载,当电流为1A时,调节RP1,使得IC1的1脚输出低电平。
       电路制作完成后,还要做一个机壳,作者使用的市场上一种较易购买到的机壳,价格大概在5~6元左右,恰好可以装入一个20W的变压器和主板。控制板就直接安装在面板上了,安装工艺如图4所示。面板上根据印刷线路板安装孔的尺寸,打4个安装孔并锪孔,使用沉头螺钉,以便螺钉头部嵌入面板不致突出。穿过螺钉后用螺母紧固,然后再拧入第2个螺母。将印板上的4个安装孔穿入螺钉,调整螺丝上的第2个螺母,可以调整印板到面板间的距离,使得轻触按钮刚好与面板正面齐平,而数码管也正好与面板正面齐平或略低。加平垫、弹簧垫并用螺母压紧,即完成印刷线路板的安装工作。
图4 安装控制电路
       最后用激光打印机打印一张不干胶贴纸,刻去数码管显示窗口部分的纸,粘贴在面板上。注意按键和数码管的前面放置一小块透明的薄膜,这块放置在不干胶和面板之间。薄膜不能太硬,否则按键手感不好,也不能太软,否则贴纸很快会被顶破。作者用的是教学投影片,效果不错。将盒子盖起来时,在贴纸前面再粘一层保鲜膜,这样,贴纸不易脏,其上打印的字也不易脱落,使用效果较好。当然,有条件时,制作薄膜面板是效果最好的。最终的制作效果如题图所示。

文章评论1条评论)

登录后参与讨论

Orima 2015-8-29 16:13

资料很全,程式以及PBA图纸都有。值得借鉴参考。。。。

craftor 2008-8-1 10:44

真的假的?
相关推荐阅读
teach51_109853927 2014-03-02 12:17
带“锁定输出”的数控稳压电源(一)
本文是探索“开源培训”思想的作品。 所谓“开源培训”是指在某个社区,各志愿者提供有一定实用价值和教学价值的作品,同时详细说明制作过程,并提供制作所需的各类资源,帮助入门者快速找到适合自己的项目...
teach51_109853927 2014-02-22 21:15
《单片机项目教程》、《单片机项目教程C语言版》电子课件
《单片机项目教程》电子课件 http://pan.baidu.com/s/1kT2Yb6f 《单片机项目教程C语言版》电子课件 http://pan.baidu.com/s/1gd5O...
teach51_109853927 2014-02-22 21:05
《单片机应用与接口技术》相关资源
单片机应用与接口技术    机械工业出版社出版,江苏省教育厅推荐教材 《单片机应用与接口技术》课件 http://pan.baidu.com/s/1c0kpzUg 《单片机应用与接...
teach51_109853927 2014-02-22 15:25
便携式无线抢答器
本产品专门为开展活动时需要用到抢答器的场合设计,已制作成品,读者可以参考作为练手之用。 如图1所示左边为信号接收装置(主持人用),右边两个为发射装置(比赛选手用)。都只需要使用干电池供电即可。...
teach51_109853927 2014-02-22 15:22
Modbus通讯协议
Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协...
广告
我要评论
1
7
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /3 下一条