基于STC 单片机的数控恒压源的设计
【摘要】直流稳压电源的应用非常的广泛,质量优良的直流稳压电源,才能满足各种电子线路的要求。所以直流稳压电源的设计颇为重要,特别是数控制流稳压电源。本文主要介绍数控直流稳压电源的设计,对其中涉及的PWM 输出、AD 采样、单片机等也有详细介绍。将单片机数字控制技术, 有机地融入直流稳压电源的设计中, 就能设计出一款高性价比的多功能数字化通用直流稳压电源。该设计除了对电压的数字控制的功能外还有可监测实际电压输出和数字电压表的功能。因此设计具有高精度,多功能,液晶显示的特点。
第一章 直流稳压电源的基本原理
在电子电路中,通常都需要电压稳压的直流电源供电。日常生活中也需要将交流电转变成直流电,形成直流稳压电源。直流稳压电源的基本原理直流电源电路一般由电源变压器、整流滤波电路及稳压电路所组成。如图
1-1
图1-1直流稳压电源的工作原理
电源变压器的作用是将电网220V 的交流电压变成整流电路所需要的电压U1。
1.1整流滤波电路
整流电路的作用是将交流电压U1,变换成脉动的直流U2,它主要有半波整流、全波整流方式,可以由整流二极管构成整流桥堆来执行,常见的整流二极管有1N4007、1N5148等,桥堆有RS210等。滤波电路作用是将脉动自流U2滤除纹波,变成纹波小的U3,常见的电路有RC 滤波、LC 滤波、等,常用的选RC 滤波电路。其中它们的关系为:Ui=nU1其中,n 为变压器的变化。 U2=(1.1~1.2)U1 每只二极管或桥堆所承受的最大反向电压U RM =2U 1 对于桥式整流电路中,每只二极管的平均电流I D(AV)=1/2IR==0.45U1/R。RC 滤波电路中,C 的
选择应适应下式,即RC 放电时间常数应满足RC=(3~5)T/2式中,T 为输入交流信号周期,R 为整流滤波电路的等效负载电阻。常用的整流滤波电路如图1-2所示,桥式整流滤波电路。
图1-2桥式整流、电容滤波电路
图1-3交流电压U 的波形
1.2 稳压电路
稳压的作用是将滤波电路定的电路输比电压经稳压后,输出较稳定的电压。常见的稳压电路有三端稳压器、串联式稳压电路等。本文采用三端稳压器,三端固定式稳压器的基本应用电路如下图所示,只要把正输入电压Ui 加到MC7805的输入端,MC7805的公共端接地,其输出端便能输出芯片标称正电压U0,在实际应用电路中,芯片输入端和输出端与地之间除分别接大容量滤波电容外,通常还需在芯片引出脚根部接小容量电容Ci,C0到地。Ci 用于抑制芯片自激振荡,C0用于压窄芯片的高频带宽,减小高频噪声。Ci 和C0的具体取值应随芯片输出电压高低及应用电路的方式不同而异。
图1-4 三端固定式稳压电路
正、负输出稳压电源 正、负输出稳压电源能同时输出两组数值相同、极性相反的恒定电压。 图1-5所示为正、负输出电压固定的稳压电源。它由输出电压极性不同的两片集成稳正器MC7815和MC7915构成,电路十分简单。两芯片输入端分别加上i 20V的输入电压。
图1-5 正、负输出电压固定稳压电源
1.3 电源设计
根据以上原理电源部分则使用三端集成稳压芯片7815和7915输出稳定+15V和-15V ,对运算放大器OP07和LF356进行双电压供电。因此电源的设计:
1. 正负15V 电源电路如下图所示,对于滤波电容的选择,要考虑:1. 整流管的压降;2.7815、7915最小允许压降Ud ;3. 电网波动10%。从而允许波纹的峰峰值Δτt=18×2(1-10%)-0.7-Ud-15=4.9v 接近似电流放电计算,假设θ=0(通角),则C=I *∆t
∆u =0. 7⨯1/100
4. 9=1430μf 选取滤波电容C=2200μf/30V
2. +5V电源 允许的最大纹波峰峰值Δτt (max )=9×2(1-10%)-1.4-2.3-5=2.76V C=I *∆t
∆u =1⨯1/100
2. 76=3600μf 选取滤波电容C=4700μ
f/16V
图1-6 ±15V 电源设计电路原理图
图1-7 5V 电源电路原理图
第二章 数控恒压源的实现方案
传统的直流稳压电源输出是通过粗调波段开关及细调电位器来调节的,并由电位表指示电压值的大小。这种直流稳压电源存在读数不直观、电位器易磨损、稳压精度不高、不易调准、电位构成复杂、体积大等缺点,而基于单片机控制的数控直流电源不但实现了直流稳压的功能,而且没有上述的缺点。
2.1设计要求
> 输出电压范围:0.0—10.0V
> 输出电压的调整方式:步进 步进数值为0.1V
> 显示方式:LCD 液晶显示;
> 监测DA 的输出电压值;
2.2数控电源的方案论证
图2-1设计总体框图
上图所示数控电源的输出电压数值由键盘控制。通过键盘把需要输出的电压值以步进方式输入到单片机。这里电压采用单片机的PWM 模拟电压输出。显示电路既可用来显示输出的电压值,也可用来显示键盘电路的调整过程。PWM 输出模拟电压不一定满足要求,如果不满足输出电压的要求,将需要添加一个电压放大器。经过OP27线形转换后,得到所需电压值,另外对于监测电压的实际输出电压值通过单片机的AD 采样口将采样值送回单片机处理后显示。在该数字控制电源中,使用8051芯片完成系统控制按键输入判断,电压数值显示,以及对外部芯片的各种数字控制。
第三章 数字控制部分
3.1 STC12C5410AD单片机介绍
STC12C5410AD 系列及STC12C2052AD 系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051, 但速度快8-12倍,内部集成MAX810专用复位电路。4路PWM,8路高速10位A/D转换, 针对电机控制,强干扰场合。STC12C2052AD 系列只有2路PWM,8路高速8位A/D转换。
1. 增强型 8051 CPU,1T ,单时钟/机器周期,指令代码完全兼容传统8051
2. 工作电压:
STC12C5410AD 系列工作电压:5.5V - 3.5V(5V 单片机)/ 3.8V - 2.2V(3V 单片机) STC12C2052AD 系列工作电压:5.5V - 3.5V(5V 单片机)/ 3.8V - 2.2V(3V 单片机)
3. 工作频率范围:0 - 35 MHz,相当于普通8051的 0~420MHz
4. 用户应用程序空间1K / 2K / 4K / 6K / 8K / 10K / 12K 字节......
5. 片上集成 512 字节 RAM(STC12C5410AD系列), STC12C2052AD 系列单片机为256字节RAM
6. 通用I/O口(27/23/15个),复位后为: 准双向口/弱上拉(普通8051传统I/O口)可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA ,但整个芯片最大不得超过55mA
7. 时钟源:外部高精度晶体/时钟,内部R/C 振荡器用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常温下内部R/C 振荡器频率为:5.2MHz ~ 6.8MHz 精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,应认为是4MHz ~ 8MHz
8. 共6个16位定时器/计数器,两个专用16位定时器T0和T1再加上PCA 模块可再实现4个16位定时器,STC12C2052AD 系列只有两路PCA
9. 外部中断2路, 下降沿中断或低电平触发中断,Power Down模式可由外部中断唤醒
10. PWM(4路)/PCA(可编程计数器阵列,4路),5410系列是4路,2052系列只有两路 ---也可用来当4路D/A使用
---也可用来再实现4个定时器
---也可用来再实现4个外部中断(上升沿中断/下降沿中断均可分别或同时支持)
11.A/D转换, 10位精度ADC ,共8路。STC12C2052AD 系列只有8位精度
3.1.1 STC12C5410AD系列8051 单片机的基本结构框图
3.1.2 I/O口各种不同的工作模式及配置介绍
I/O口配置
STC12C5410AD 系列单片机其所有I/O口均可由软件配置成4种工作类型之一,如下表所示。4种类型分别为:准双向口(标准8051输出模式)、推挽输出、仅为输入(高阻)或开漏输出功能。每个口由2个控制寄存器中的相应位控制每个引脚工作类型。STC12C5410AD 系列单片机上电复位后为准双向口(传统8051的I/O口)模式。2V 以上时为高电平,0.8V 以下时为低电平。
P3口设定
>
P2口设定
P1口设定
3.1.3 PWM 输出
STC12C5410AD 系列单片机有四路可编程计数器阵列(PCA )/PWM,12C2052AD 系列只有两路。PCA 含有一个特殊的16位定时器,有4个16位的捕获/比较模块与之相连。每个模块可编程工作在4种模式下:上升/下降沿捕获、软件定时器、高速输出或可调制脉冲输出。模块0连接到P3.7(CEX0/PCA0/PWM0),模块1连接到P3.5(CEX1/PCA1/PWM1),模块2连接到P2.0(CEX2/PCA2/PWM2),模块3连接到P2.4(CEX3/PCA3/PWM3)。寄存器CH 和CL 的内容是正在自由递增计数的16位PCA 定时器的值。PCA 定时器是4个模块的公共时间基准,可通过编程工作在:1/12振荡频率、1/2振荡频率、定时器0溢出或ECI 脚的输入(P3.4)。定时器的计数源由CMOD SFR的CPS1和CPS0位来确定。
CMOD SFR 还有2个位与PCA 相关。它们分别是:CIDL ,空闲模式下允许停止PCA ;ECF ,置位时,使能PCA 中断,当PCA 定时器溢出将PCA 计数溢出标志CF (CCON SFR )置位。CCON SFR 包含PCA 的运行控制位(CR )和PCA 定时器标志(CF )以及各个模块的标志
(CCF3/CCF2/CCF1/CCF0)。通过软件置位CR 位(CCON.6)来运行PCA 。CR 位被清零时PCA 关闭。当PCA 计数器溢出时,CF 位(CCON.7)置位, 如果CMOD 寄存器的ECF 位置位, 就产生中断。CF 位只可通过软件清除。CCON 寄存器的位0~3是PCA 各个模块的标志(位0对应模块0,位1对应模块1, 位2对应模块2, 位3对应模块3),当发生匹配或比较时由硬件置位。这些标志也只能通过软件清除。所有模块共用一个中断向量。PCA 的中断系统如图所示。PCA 的每个模块都对应一个特殊功能寄存器。它们分别是:模块0对应CCAPM0,模块1对应CCAPM1, 模块2对应CCAPM2,模块3对应CCAPM3. 特殊功能寄存器包含了相应模块的工作模式控制位。当模块发生匹配或比较时,ECCFn 位(CCAPMn.0,n =0,1,2,3由工作的模块决定)使能CCONSFR 的CCFn 标志来产生中断。PWM (CCAPMn.1)用来使能脉宽调制模式。PCA 计数值与模块的捕获/比较寄存器的值相匹配时,如果TOG 位(CCAPMn.2)置位,模块的CEXn 输出将发生翻转。
当PCA 计数值与模块的捕获/比较寄存器的值相匹配时,如果匹配位MATn (CCAPMn.3)置位,CCON 寄存器的CCFn 位将被置位。CAPNn (CCAPMn.4)和CAPPn (CCAPMn.5)用来设置捕获输入的有效沿。CAPNn 位使能下降沿有效,CAPPn 位使能上升沿有效。如果两位都置位,
则两种跳变沿都被使能,捕获可在两种跳变沿产生。通过置位CCAPMn 寄存器的ECOMn 位(CCAPMn.6)来使能比较器功能。每个PCA 模块还对应另外两个寄存器,CCAPnH 和CCAPnL 。当出现捕获或比较时,它们用来保存16位的计数值。当PCA 模块用在PWM 模式中时,它们用来控制输出的占空比。
脉宽调节模式(PWM)
所有PCA 模块都可用作PWM 输出(下图)。输出频率取决于PCA 定时器的时钟源。
PCA PWM mode / 可调制脉冲宽度输出模式
由于所有模块共用仅有的PCA 定时器,所有它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器{EPCnL ,CCAPnL }有关。当 CL SFR的值小于{EPCnL ,CCAPnL }时,输出为低,当PCA CL SFR的值等于或大于{EPCnL ,CCAPnL }时,输出为高。当CL 的值由FF 变为00溢出时,{EPCnH ,CCAPnH }的内容装载到{EPCnL ,CCAPnL }中。这样就可实现无干扰地更新PWM 。要使能PWM 模式,模块CCAPMn 寄存器的PWMn 和ECOMn 位必须置位。
由于PWM 是8位的,所以PWM 的输出频率=PCA 时钟输入源频率/256,PCA 时钟输入源可以从以下4种中选择一种:Fosc / 12, Fosc / 2,定时器0的溢出, ECI / P3.4输入 举例:要求PWM 输出频率为38KHz ,选Fosc/2为PCA/PWM时钟输入源,求出Fosc 的值 由计算公式38000 = Fosc / 2 / 256 ,得到外部时钟频率Fosc = 38000 x 256 x 2 =19,456,000 如果要实现可调频率的PWM 输出, 可选择定时器0的溢出率或者ECI 脚的输入作为PCA/PWM的时钟输入源当EPCnL = 0及ECCAPnL = 00H时,PWM 固定输出高
当EPCnL = 0及ECCAPnL = 00H时,PWM 固定输出高
当EPCnL = 1及CCAPnL = 0FFH时,PWM 固定输出低
当EPCnL = 1及CCAPnL = 0FFH时,PWM 固定输出低
限流电阻用10K 到
1K
PCA/PWM寄存器列表
CMOD - PCA模式 寄存器的位分配 (地址:D9H )
CMOD - PCA模式 寄存器的位描述 (地址:D9H )
CMOD - PCA计数器阵列的计数脉冲选择 (地址:D9H )
CCON - PCA控制寄存器的位分配 (地址:D8H )
CCON - PCA控制寄存器的位描述 (地址:D8H )
CCAPMn - PCA比较/捕获模块寄存器的位分配(CCAPM0地址:0DAH ;CCAPM1地址:0DBH )
CCAPMn - PCA比较/捕获模块寄存器的位描述 ( n:0,1,2,3 )
PCA 模块工作模式(CCAPMn 寄存器,n :0,1,2,3)
3.1.4 AD转换器
STC12C5410AD 系列带A/D转换的单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,STC12C2052AD 系列是8位精度的A/D, 速度均可达到100KHz(10万次/秒) 。8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的口可继续作为I/O口使用。
需作为A/D使用的口需先将其设置为开漏模式或高阻输入, 在P1M0、P1M1寄存器中对相应的位进行设置。
ADC_CONTR 特殊功能寄存器: A/D转换控制特殊功能寄存器
CHS2 / CHS1 / CHS0:模拟输入通道选择,CHS2 / CHS1 / CHS0
ADC_START: 模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换, 转换结束后为0。 ADC_FLAG: 模数转换器转换结束标志位, 当A/D转换完成后,ADC_FLAG = 1,要由软件清0。 不管是A/D转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转换是否结束, 当A/D转换完成后,ADC_FLAG = 1,一定要软件清0。 SPEED1,SPEED0:模数转换器转换速度控制位
ADC_POWER: ADC电源控制位。 0:关闭ADC 电源;1:打开A/D转换器电源. 建议进入空闲模式前,将ADC 电源关闭,ADC_POWER =0.启动AD 转换前一定要确认AD 电源已打开,AD 转换结束后关闭AD 电源可降低功耗,也可不关闭。初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换,议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于高精度A/D转换
ADC_DATA / ADC_LOW2 特殊功能寄存器: A/D转换结果特殊功能寄存器
模拟/数字转换结果计算公式如下:结果 ( ADC_DATA[7:0],ADC_LOW2[1:0] ) = 1024 x Vin / Vcc Vin为模拟输入通道输入电压,Vcc 为单片机实际工作电压,用单片机工作电压作为模拟参考电压。取ADC_DATA的8位为ADC 转换的高8位, 取ADC_LOW2的低2位为ADC 转换的低2位, 则为10位精度。如果舍弃ADC_LOW2的低2位, 只用ADC_DATA寄存器的8位, 则A/D转换结果为8位精度。结果 ADC_DATA[7:0] = 256 x Vin / Vcc STC12C2052AD 系列单片机A/D转换精度只有8位,固无ADC_LOW2寄存器。
3.1.5 A/D转换模块的参考电压源
STC12C5410AD 和STC12C2052AD 系列单片机的参考电压源是输入工作电压Vcc ,所以一般不用外接参考电压源。如7805的输出电压是5V ,但实际电压可能是4.88V 到4.96V ,用户需要精度比较高的话,可在出厂时将实际测出的工作电压值记录在单片机内部的EEPROM 里面,以供计算。如果有些用户的Vcc 不固定,如电池供电,电池电压在5.3V-4.2V 之间漂移,则Vcc 不固定,就需要在8路A/D转换的一个通道外接一个稳定的参考电压源,来计算出此时的工作电压Vcc ,再计算出其他几路A/D转换通道的电压。
如可在ADC 转换通道的第七通道外接一个1.25V (或1V ,或...)的基准参考电压源,由此求出此时的工作电压Vcc ,再计算出其它几路A/D转换通道的电压。
3.2单元电路设计
3.2.1利用PWM 实现D/A功能的应用电路图
PWM 输出相当于DAC0832八位集成D/A转换器。D/A转换部分的输出电压作为稳压输出电路的参考电压。稳压输出电路的输出与参考电压成比例。8位字长的D/A转换器具有256种状态。当电压控制字从0,1,2,„„到256时,电源输出电压为0.0,0.1,„„10.0。 每路电压输出值的计算:V 0=R E F ⨯
data 256
⨯2
REF 为参考电压,data 为输入8位的比特数据;我们这里用的REF=5v。
3.2.2 A/D转换应用线路,按键扫描
如上图所示键盘电路通过分压电路,第一个按键所得电压为1/2Vcc,第二个按键分压2/3Vcc,第三个按键分压3/4 Vcc ,第四个按键分压4/5 Vcc ,那么利用单片机的P1.7口对按键电压进行采样,再对键盘电压对键盘的按下与否进行判断处理。
3.2.3 AD采样电路和数字电压表
考虑到单片机的内部处理功能,可通过STC 芯片的AD 转换器增加数字电压表功能。即由
单片机的P1.3口对电压进行采样,通过设置ADC_CONTR 特殊功能寄存器,启动以及停止AD 转换。然后读取寄存器ADC_DATA / ADC_LOW2 (A/D转换结果特殊功能寄存器)的值最后通过单片机将十六进制数转换为ASCII 码利用液晶显示模块显示。因此将输出电压直接送回单片机进行AD 采样,显示即实现了监测输出电压值的功能。另外由于可以采样得到输出电压,那么可以校准输出电压和预置电压,使输出电压值更为精确。
AD 采样电路
3.2.4电压放大电路
运算放大器通常都是工作在闭环状态.将运算放大器的放大电路接上一定的反馈电路和外接元件,就可以实现各种数学运算.运算放大器反馈电路有各种形式,不同的反馈电路和不同的输入方式可以组成各种不同用咖运算放大电路.
图5.14是输入信号加在反相输入端的比例运算电路.其中R1为输入端电阻,Rf 为反馈电阻,它以并联负反馈的方式将输出电压反馈到反相输入端,为了在输入信号Ui =0时, 输出U0=o ,电阻的选择应满足R2=R1// Rf.这样可保证运算放大器的反相输入端与同相
输入端的外接电阻相等,使其处于对称平衡状态,以消除运算放大器的偏置电流对输出电压的影响,因此,称R2为平衡电阻.
由理想运放的两条重要结论可知,I i ≈0,U +≈U -。通过R1的电流I 1,即:I f =I1又由于运放的通向输入端接地,U+=0,所以可得U +≈U -,也就是说,当同相端接地,U+=0时反相输入端电位U-≈0,它是一个不接地的“地”,称为“虚地”。“虚地”的存在是运算电路在闭环工作状态下的一个重要特征。 由图5.14可得
因为I1≈If, 所以可得
闭环电压放大倍数则为上式表明,该电路的输出电压与输
入电压之比仅由电阻RF 与R1的比值决定,而与集成运放本身的参数无关.式中的负号表示输出电压与输入电压反相,因而称为反相比例运算放大电路。 当
R1=RF 时,U0
=-Ui ,反相输入比例运算电路就成了反相器.
那么此电路利用PWM 模拟电压输出,后通过二次滤波,经过OP27放大电压后,电压为原来的两倍,即由原来的0~5v放大为0~10v变化。 接法如下:
3.2.5显示电路设计:
数控电源的数据显示采用LCD 液晶显示:
即用单片机的P2口输出,利用液晶显示模块,电路如下图所示:
第四章 软件部分
4.1软件设计说明:
控制程序使用C51编写,在KEIL C 平台下编译通过,运用STC 软件将程序下载到芯片。当按键按下,可进行电压调整,可调节电压1v ,调节电压以步进0.1v 。在按键加减的过程中,LCD 模块显示的电压随着上下变化,当按键不动作后,将单片机的PWM 模拟输出电压经二次滤波电路输出,经线性,放大得到与显示电压值相同的电压。同时将输出电压接至单片机的P1.2口可监测输出电压值,可进行预置值与测量值的比较。另外将AD 采样口独立出来可以实现数字电压表的测量功能。
4.2程序设计流程图
设计流程图分为三大部分,即主程序流程图,键盘扫描流程图,键盘控制流程图。 主程序流程图:
键盘扫描流程图:
键盘控制流程图:
4.3设计源程序 见附页
第五章 硬件调试
5.1制版
电路原理图见附录1,元件清单见附录2。
PCB 图如下图所示
按照PCB 图将元件焊接至铜板上,焊接时注意是否虚焊。
5.2调试
准备就绪后,将变压器通电,开始进行测试,检测它们是否达到设计要求。检查的项目包括输出电压范围,在整个输出电压范围内的步进调整值,输出电压与预置电压是否匹配和数字电压表功能的精准度。数控电源系统的供电由直流稳压电源提供,由硬件电路的正负15V 电源,5V 电源提供。
排除故障:在测试调试的过程中要排除障碍,刚开始液显不能正常工作,检查是否上电,调节电位器,看背光灯是否变化,没有变化则应检查单片机的输出口是否与液显正确连接,用万用表排查虚焊。当检查硬件没有问题之后,再进行测试,当还是无法达到要求工作时,那么就是程序问题。根据流程图修改程序,在KEIL 软件中编译无错后再下载至再次进行调试检测。
5.2.1电压测试:
5.2电压表测试:
以上为电压测试结果,由于PWM 的分辨率为0.2,所以其误差范围可以限制在0~0.2V左右,在这个范围内产生误差是允许的。因此监测电压与输出电压基本一致。因为PWM 输出为八位,分辨率=PWM占空比/250,那么当站空比值变化1时,其电压变化为0.02V ,后运放将电压放大变化0.04v 。所以可达到电压变化精度为0.04V 。
用单片机控制电源时,输出直流0-10V ,液晶显示器显示清晰正确,误差极小,完美的实现了数控恒压源这一课题。
5.3 设计心得:
(1)、设计程序之前, 务必要对所用单片机的内部结构有一个系统的了解, 知道该单片机
片内有哪些资源。 (2)、设计程序采用什么编程语言并不是非常重要, 关键要有一个清晰的思路和一个完整的软件流程图。
(3)、在设计程序时, 不能妄想一次就将整个程序设计好," 反复修改, 不断改进" 是程序设计的必经之路。
(4)、要养成注释程序的好习惯, 一个程序的完美与否不仅仅是实现功能, 而应该让人一看就能明白你的思路, 这样也为资料的保存和交流提供了方便。
(5)、在设计程序过程中遇到问题是很正常的, 但我们应该将每次遇到的问题记录下来, 并分析清楚, 以免下次再碰到同样的问题。
结束语
本文主要运用STC12C5410AD 单片机的内部资源,利用PWM 输出模拟DA 输出,AD 采样通道对电压进行采样。由于电压输出只能是0~5v,所以电压输出端加运放给予放大得到所需幅值的电压。在软件设计方面,在按键发生动作时,对输出电压进行调整,当按键不发生动作时,作为数字电压表进行使用。功能上还不够完善, 如没有电流过流时的报警指示功能等等,还可以运用INA126和74LS14构成电流保护电路,进一步得到提高。
附录
I
附录II
#include #define uchar unsigned char #define uint unsigned int
uchar a,b,c,d,key ,keyvalue,sel_flag,push_val,zt_flag; unsigned int temp,temp1; unsigned int j;
unsigned char m,mss_cnt;
unsigned char ADC_Channel_3_Result_bak,ychi;
unsigned char ADC_Power_On_Speed_Channel_2 =0xe2 ;//P1.2作为A/D输入 unsigned char ADC_Power_On_Speed_Channel_3 =0xe3 ;//P1.3作为A/D输入 unsigned char ADC_Channel_2_Result; unsigned char ADC_Channel_3_Result;
uchar code table0[]=" The V is:";
uchar code table2[]="0123456789MV .A";
//****************lcd显示****************************************************** sbit rs=P3^0; sbit rw=P3^1; sbit e =P3^2;
void delay(unsigned char x) {
unsigned char a,b; for(a=x;a!=0;a--) for(b=20;b!=0;b--); }
void writecomm(uchar comm) {
P2=comm; rs=0; rw=0; e=0; delay(500); e=1; delay(500); e=0; }
void writedat(uchar dat) { P2=dat; rs=1; rw=0; e=0;
delay(500);
e=1;
delay(500);
e=0;
}
void writesmh(uchar add,uchar date)
{
uchar count;
count=date;
writecomm(0x80+add);
delay(500);
writedat(table2[count]);
delay(500);
}
void init()
{
uchar i;
delay(100);
writecomm(0x38);
delay(100);
writecomm(0x0c);
delay(100);
writecomm(0x06);
delay(100);
writecomm(0x01);
delay(100);
writecomm(0x80);
delay(5);
for(i=0;i
{
writedat(table0[i]);
delay(5);
}
}
void ADC_init()
{
uchar iotemp;
iotemp=0x1c;
ADC_CONTR=ADC_CONTR|0x80;//;开A/D转换电源
delay(10);//;开A/D转换电源后要加延时,1mS 以内就足够了
P1M0=P1M0|iotemp;
P1M1=P1M1|iotemp;
AUXR=AUXR|0x10;
EADC_SPI=1;
} //;设置P1.5键盘,P1.3,1.4,1.6AD 设置A/D通道所在的I/O为开漏模式
//***************显示********************************************************** void display()
{
a=temp/1000;
b=temp/100%10;
c=temp/10%10;
d=temp%10;
writesmh(0x46,b);
delay(500);
writesmh(0x47,13);
delay(500);
writesmh(0x48,c);
delay(500);
writesmh(0x49,d);
delay(500);
for(j=0;j
delay(500);
}
void display1()
{
a=temp1/1000;
b=temp1/100%10;
c=temp1/10%10;
d=temp1%10;
writesmh(0x46,b);
delay(500);
writesmh(0x47,13);
delay(500);
writesmh(0x48,c);
delay(500);
writesmh(0x49,d);
delay(500);
for(j=0;j
delay(500);
}
//****************菜单程序***************************************************** void fuc_key()
{
//uint16 temp;
// uchar i,tz;
if(keyvalue==1)
{
zt_flag++;
if(zt_flag>2)
zt_flag=0;
}
if(keyvalue==4)
{
sel_flag++;
if(sel_flag>2)
sel_flag=0;
}
switch(zt_flag)
{
case 1:writesmh(0x00,1);
switch(sel_flag)
{ case 1: if((keyvalue==2)&(temp10)) {temp1-=100;} display1(); break; {temp1+=10;} if((keyvalue==3)&(temp1>0)) {temp1-=10;} display1(); break; case 2: if((keyvalue==2)&(temp1
case 0: if((temp0))
{ push_val--; } if((temp>temp1)&(push_val
default:
break;
}
break;
case 2:writesmh(0x00,2);
if((keyvalue==2)&(temp10)) {
temp1+=10;
push_val-=5;
}
if((keyvalue==3)&(temp1>0)&(push_val
{
temp1-=10;
push_val+=5; } if((temp0)) { push_val--; } if((temp>temp1)&(push_val
case 0:
display();
break;
default:
break;
}
}
//*****************PWM******************************************************** void pwm()
{
CMOD = 0x02;
CL = 0x00;
CH = 0x00;
CCAP0L = push_val;
CCAP0H = push_val;
CCAPM0 = 0x42;
CR = 1;
if(push_val>250) push_val=0;
if(push_val
}
//**********************main*************************************************** void main()
{
init();
ADC_init();
ET0 = 1;
TMOD = 0x01; //定时器0中断打开 //设定时器0为模式1,16位模式
TH0=(65536-2500)/256;
TL0=(65536-2500)%256;
TR0=1;
EA=1;
push_val=0xc0;
while(1)
{pwm();}
}
//******************adc******************************************************** void ADC_INT(void) interrupt 5 using 3
{
uchar ychi,ychi1;
if((ADC_CONTR&0x07)==0x03)
{
ADC_Channel_3_Result=ADC_DATA;
ADC_Channel_3_Result=(ADC_Channel_3_Result*1.0/256)*50;
if((ADC_Channel_3_Result
//键盘处理 { key=0x01;
}
{ else if((ADC_Channel_3_Result >29) & (ADC_Channel_3_Result 34) & (ADC_Channel_3_Result 38)& (ADC_Channel_3_Result 40)) { key=0xff; } } if ( ychi!=key ) { if (ychi1==0) {
ychi=key;
} else {
keyvalue= key ;
ychi1=0;
}
} else { ychi1=1;
}
if((ADC_CONTR&0x07)==0x02) //AD1
{
ADC_CONTR=ADC_CONTR&0xe7; //清0 ADC_FLAG, ADC_START 位, 停止A/D转换 ADC_Channel_2_Result=ADC_DATA;
temp=(ADC_Channel_2_Result*1.0/256)*500;
}
}
//***********************2.5MS定时********************************************* void Time0(void) interrupt 1 using 2
{
TH0=(65536-2500)/256;
TL0=(65536-2500)%256; mss_cnt++;
if(mss_cnt%4==0)//0.01S
{
ADC_DATA=0x00;
ADC_CONTR=ADC_Power_On_Speed_Channel_3;//选择P1.5作为A/D转换通道
delay(2); //20~200us ADC_CONTR=ADC_CONTR|0x08; //;启动 AD 转换 while((ADC_CONTR&0x10)==0x00);
fuc_key();
}
if(mss_cnt%40==0) //0.1秒处理一次 {
ADC_DATA=0x00;
ADC_CONTR=ADC_Power_On_Speed_Channel_2;//选择P1.3作为A/D转换通道
delay(2); //20~200us ADC_CONTR=ADC_CONTR|0x08;//;启动 AD 转换 while((ADC_CONTR&0x10)==0x00);
}
}
基于STC 单片机的数控恒压源的设计
【摘要】直流稳压电源的应用非常的广泛,质量优良的直流稳压电源,才能满足各种电子线路的要求。所以直流稳压电源的设计颇为重要,特别是数控制流稳压电源。本文主要介绍数控直流稳压电源的设计,对其中涉及的PWM 输出、AD 采样、单片机等也有详细介绍。将单片机数字控制技术, 有机地融入直流稳压电源的设计中, 就能设计出一款高性价比的多功能数字化通用直流稳压电源。该设计除了对电压的数字控制的功能外还有可监测实际电压输出和数字电压表的功能。因此设计具有高精度,多功能,液晶显示的特点。
第一章 直流稳压电源的基本原理
在电子电路中,通常都需要电压稳压的直流电源供电。日常生活中也需要将交流电转变成直流电,形成直流稳压电源。直流稳压电源的基本原理直流电源电路一般由电源变压器、整流滤波电路及稳压电路所组成。如图
1-1
图1-1直流稳压电源的工作原理
电源变压器的作用是将电网220V 的交流电压变成整流电路所需要的电压U1。
1.1整流滤波电路
整流电路的作用是将交流电压U1,变换成脉动的直流U2,它主要有半波整流、全波整流方式,可以由整流二极管构成整流桥堆来执行,常见的整流二极管有1N4007、1N5148等,桥堆有RS210等。滤波电路作用是将脉动自流U2滤除纹波,变成纹波小的U3,常见的电路有RC 滤波、LC 滤波、等,常用的选RC 滤波电路。其中它们的关系为:Ui=nU1其中,n 为变压器的变化。 U2=(1.1~1.2)U1 每只二极管或桥堆所承受的最大反向电压U RM =2U 1 对于桥式整流电路中,每只二极管的平均电流I D(AV)=1/2IR==0.45U1/R。RC 滤波电路中,C 的
选择应适应下式,即RC 放电时间常数应满足RC=(3~5)T/2式中,T 为输入交流信号周期,R 为整流滤波电路的等效负载电阻。常用的整流滤波电路如图1-2所示,桥式整流滤波电路。
图1-2桥式整流、电容滤波电路
图1-3交流电压U 的波形
1.2 稳压电路
稳压的作用是将滤波电路定的电路输比电压经稳压后,输出较稳定的电压。常见的稳压电路有三端稳压器、串联式稳压电路等。本文采用三端稳压器,三端固定式稳压器的基本应用电路如下图所示,只要把正输入电压Ui 加到MC7805的输入端,MC7805的公共端接地,其输出端便能输出芯片标称正电压U0,在实际应用电路中,芯片输入端和输出端与地之间除分别接大容量滤波电容外,通常还需在芯片引出脚根部接小容量电容Ci,C0到地。Ci 用于抑制芯片自激振荡,C0用于压窄芯片的高频带宽,减小高频噪声。Ci 和C0的具体取值应随芯片输出电压高低及应用电路的方式不同而异。
图1-4 三端固定式稳压电路
正、负输出稳压电源 正、负输出稳压电源能同时输出两组数值相同、极性相反的恒定电压。 图1-5所示为正、负输出电压固定的稳压电源。它由输出电压极性不同的两片集成稳正器MC7815和MC7915构成,电路十分简单。两芯片输入端分别加上i 20V的输入电压。
图1-5 正、负输出电压固定稳压电源
1.3 电源设计
根据以上原理电源部分则使用三端集成稳压芯片7815和7915输出稳定+15V和-15V ,对运算放大器OP07和LF356进行双电压供电。因此电源的设计:
1. 正负15V 电源电路如下图所示,对于滤波电容的选择,要考虑:1. 整流管的压降;2.7815、7915最小允许压降Ud ;3. 电网波动10%。从而允许波纹的峰峰值Δτt=18×2(1-10%)-0.7-Ud-15=4.9v 接近似电流放电计算,假设θ=0(通角),则C=I *∆t
∆u =0. 7⨯1/100
4. 9=1430μf 选取滤波电容C=2200μf/30V
2. +5V电源 允许的最大纹波峰峰值Δτt (max )=9×2(1-10%)-1.4-2.3-5=2.76V C=I *∆t
∆u =1⨯1/100
2. 76=3600μf 选取滤波电容C=4700μ
f/16V
图1-6 ±15V 电源设计电路原理图
图1-7 5V 电源电路原理图
第二章 数控恒压源的实现方案
传统的直流稳压电源输出是通过粗调波段开关及细调电位器来调节的,并由电位表指示电压值的大小。这种直流稳压电源存在读数不直观、电位器易磨损、稳压精度不高、不易调准、电位构成复杂、体积大等缺点,而基于单片机控制的数控直流电源不但实现了直流稳压的功能,而且没有上述的缺点。
2.1设计要求
> 输出电压范围:0.0—10.0V
> 输出电压的调整方式:步进 步进数值为0.1V
> 显示方式:LCD 液晶显示;
> 监测DA 的输出电压值;
2.2数控电源的方案论证
图2-1设计总体框图
上图所示数控电源的输出电压数值由键盘控制。通过键盘把需要输出的电压值以步进方式输入到单片机。这里电压采用单片机的PWM 模拟电压输出。显示电路既可用来显示输出的电压值,也可用来显示键盘电路的调整过程。PWM 输出模拟电压不一定满足要求,如果不满足输出电压的要求,将需要添加一个电压放大器。经过OP27线形转换后,得到所需电压值,另外对于监测电压的实际输出电压值通过单片机的AD 采样口将采样值送回单片机处理后显示。在该数字控制电源中,使用8051芯片完成系统控制按键输入判断,电压数值显示,以及对外部芯片的各种数字控制。
第三章 数字控制部分
3.1 STC12C5410AD单片机介绍
STC12C5410AD 系列及STC12C2052AD 系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051, 但速度快8-12倍,内部集成MAX810专用复位电路。4路PWM,8路高速10位A/D转换, 针对电机控制,强干扰场合。STC12C2052AD 系列只有2路PWM,8路高速8位A/D转换。
1. 增强型 8051 CPU,1T ,单时钟/机器周期,指令代码完全兼容传统8051
2. 工作电压:
STC12C5410AD 系列工作电压:5.5V - 3.5V(5V 单片机)/ 3.8V - 2.2V(3V 单片机) STC12C2052AD 系列工作电压:5.5V - 3.5V(5V 单片机)/ 3.8V - 2.2V(3V 单片机)
3. 工作频率范围:0 - 35 MHz,相当于普通8051的 0~420MHz
4. 用户应用程序空间1K / 2K / 4K / 6K / 8K / 10K / 12K 字节......
5. 片上集成 512 字节 RAM(STC12C5410AD系列), STC12C2052AD 系列单片机为256字节RAM
6. 通用I/O口(27/23/15个),复位后为: 准双向口/弱上拉(普通8051传统I/O口)可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O口驱动能力均可达到20mA ,但整个芯片最大不得超过55mA
7. 时钟源:外部高精度晶体/时钟,内部R/C 振荡器用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟常温下内部R/C 振荡器频率为:5.2MHz ~ 6.8MHz 精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,应认为是4MHz ~ 8MHz
8. 共6个16位定时器/计数器,两个专用16位定时器T0和T1再加上PCA 模块可再实现4个16位定时器,STC12C2052AD 系列只有两路PCA
9. 外部中断2路, 下降沿中断或低电平触发中断,Power Down模式可由外部中断唤醒
10. PWM(4路)/PCA(可编程计数器阵列,4路),5410系列是4路,2052系列只有两路 ---也可用来当4路D/A使用
---也可用来再实现4个定时器
---也可用来再实现4个外部中断(上升沿中断/下降沿中断均可分别或同时支持)
11.A/D转换, 10位精度ADC ,共8路。STC12C2052AD 系列只有8位精度
3.1.1 STC12C5410AD系列8051 单片机的基本结构框图
3.1.2 I/O口各种不同的工作模式及配置介绍
I/O口配置
STC12C5410AD 系列单片机其所有I/O口均可由软件配置成4种工作类型之一,如下表所示。4种类型分别为:准双向口(标准8051输出模式)、推挽输出、仅为输入(高阻)或开漏输出功能。每个口由2个控制寄存器中的相应位控制每个引脚工作类型。STC12C5410AD 系列单片机上电复位后为准双向口(传统8051的I/O口)模式。2V 以上时为高电平,0.8V 以下时为低电平。
P3口设定
>
P2口设定
P1口设定
3.1.3 PWM 输出
STC12C5410AD 系列单片机有四路可编程计数器阵列(PCA )/PWM,12C2052AD 系列只有两路。PCA 含有一个特殊的16位定时器,有4个16位的捕获/比较模块与之相连。每个模块可编程工作在4种模式下:上升/下降沿捕获、软件定时器、高速输出或可调制脉冲输出。模块0连接到P3.7(CEX0/PCA0/PWM0),模块1连接到P3.5(CEX1/PCA1/PWM1),模块2连接到P2.0(CEX2/PCA2/PWM2),模块3连接到P2.4(CEX3/PCA3/PWM3)。寄存器CH 和CL 的内容是正在自由递增计数的16位PCA 定时器的值。PCA 定时器是4个模块的公共时间基准,可通过编程工作在:1/12振荡频率、1/2振荡频率、定时器0溢出或ECI 脚的输入(P3.4)。定时器的计数源由CMOD SFR的CPS1和CPS0位来确定。
CMOD SFR 还有2个位与PCA 相关。它们分别是:CIDL ,空闲模式下允许停止PCA ;ECF ,置位时,使能PCA 中断,当PCA 定时器溢出将PCA 计数溢出标志CF (CCON SFR )置位。CCON SFR 包含PCA 的运行控制位(CR )和PCA 定时器标志(CF )以及各个模块的标志
(CCF3/CCF2/CCF1/CCF0)。通过软件置位CR 位(CCON.6)来运行PCA 。CR 位被清零时PCA 关闭。当PCA 计数器溢出时,CF 位(CCON.7)置位, 如果CMOD 寄存器的ECF 位置位, 就产生中断。CF 位只可通过软件清除。CCON 寄存器的位0~3是PCA 各个模块的标志(位0对应模块0,位1对应模块1, 位2对应模块2, 位3对应模块3),当发生匹配或比较时由硬件置位。这些标志也只能通过软件清除。所有模块共用一个中断向量。PCA 的中断系统如图所示。PCA 的每个模块都对应一个特殊功能寄存器。它们分别是:模块0对应CCAPM0,模块1对应CCAPM1, 模块2对应CCAPM2,模块3对应CCAPM3. 特殊功能寄存器包含了相应模块的工作模式控制位。当模块发生匹配或比较时,ECCFn 位(CCAPMn.0,n =0,1,2,3由工作的模块决定)使能CCONSFR 的CCFn 标志来产生中断。PWM (CCAPMn.1)用来使能脉宽调制模式。PCA 计数值与模块的捕获/比较寄存器的值相匹配时,如果TOG 位(CCAPMn.2)置位,模块的CEXn 输出将发生翻转。
当PCA 计数值与模块的捕获/比较寄存器的值相匹配时,如果匹配位MATn (CCAPMn.3)置位,CCON 寄存器的CCFn 位将被置位。CAPNn (CCAPMn.4)和CAPPn (CCAPMn.5)用来设置捕获输入的有效沿。CAPNn 位使能下降沿有效,CAPPn 位使能上升沿有效。如果两位都置位,
则两种跳变沿都被使能,捕获可在两种跳变沿产生。通过置位CCAPMn 寄存器的ECOMn 位(CCAPMn.6)来使能比较器功能。每个PCA 模块还对应另外两个寄存器,CCAPnH 和CCAPnL 。当出现捕获或比较时,它们用来保存16位的计数值。当PCA 模块用在PWM 模式中时,它们用来控制输出的占空比。
脉宽调节模式(PWM)
所有PCA 模块都可用作PWM 输出(下图)。输出频率取决于PCA 定时器的时钟源。
PCA PWM mode / 可调制脉冲宽度输出模式
由于所有模块共用仅有的PCA 定时器,所有它们的输出频率相同。各个模块的输出占空比是独立变化的,与使用的捕获寄存器{EPCnL ,CCAPnL }有关。当 CL SFR的值小于{EPCnL ,CCAPnL }时,输出为低,当PCA CL SFR的值等于或大于{EPCnL ,CCAPnL }时,输出为高。当CL 的值由FF 变为00溢出时,{EPCnH ,CCAPnH }的内容装载到{EPCnL ,CCAPnL }中。这样就可实现无干扰地更新PWM 。要使能PWM 模式,模块CCAPMn 寄存器的PWMn 和ECOMn 位必须置位。
由于PWM 是8位的,所以PWM 的输出频率=PCA 时钟输入源频率/256,PCA 时钟输入源可以从以下4种中选择一种:Fosc / 12, Fosc / 2,定时器0的溢出, ECI / P3.4输入 举例:要求PWM 输出频率为38KHz ,选Fosc/2为PCA/PWM时钟输入源,求出Fosc 的值 由计算公式38000 = Fosc / 2 / 256 ,得到外部时钟频率Fosc = 38000 x 256 x 2 =19,456,000 如果要实现可调频率的PWM 输出, 可选择定时器0的溢出率或者ECI 脚的输入作为PCA/PWM的时钟输入源当EPCnL = 0及ECCAPnL = 00H时,PWM 固定输出高
当EPCnL = 0及ECCAPnL = 00H时,PWM 固定输出高
当EPCnL = 1及CCAPnL = 0FFH时,PWM 固定输出低
当EPCnL = 1及CCAPnL = 0FFH时,PWM 固定输出低
限流电阻用10K 到
1K
PCA/PWM寄存器列表
CMOD - PCA模式 寄存器的位分配 (地址:D9H )
CMOD - PCA模式 寄存器的位描述 (地址:D9H )
CMOD - PCA计数器阵列的计数脉冲选择 (地址:D9H )
CCON - PCA控制寄存器的位分配 (地址:D8H )
CCON - PCA控制寄存器的位描述 (地址:D8H )
CCAPMn - PCA比较/捕获模块寄存器的位分配(CCAPM0地址:0DAH ;CCAPM1地址:0DBH )
CCAPMn - PCA比较/捕获模块寄存器的位描述 ( n:0,1,2,3 )
PCA 模块工作模式(CCAPMn 寄存器,n :0,1,2,3)
3.1.4 AD转换器
STC12C5410AD 系列带A/D转换的单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位高速A/D转换器,STC12C2052AD 系列是8位精度的A/D, 速度均可达到100KHz(10万次/秒) 。8路电压输入型A/D,可做温度检测、电池电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的口可继续作为I/O口使用。
需作为A/D使用的口需先将其设置为开漏模式或高阻输入, 在P1M0、P1M1寄存器中对相应的位进行设置。
ADC_CONTR 特殊功能寄存器: A/D转换控制特殊功能寄存器
CHS2 / CHS1 / CHS0:模拟输入通道选择,CHS2 / CHS1 / CHS0
ADC_START: 模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换, 转换结束后为0。 ADC_FLAG: 模数转换器转换结束标志位, 当A/D转换完成后,ADC_FLAG = 1,要由软件清0。 不管是A/D转换完成后由该位申请产生中断,还是由软件查询该标志位A/D转换是否结束, 当A/D转换完成后,ADC_FLAG = 1,一定要软件清0。 SPEED1,SPEED0:模数转换器转换速度控制位
ADC_POWER: ADC电源控制位。 0:关闭ADC 电源;1:打开A/D转换器电源. 建议进入空闲模式前,将ADC 电源关闭,ADC_POWER =0.启动AD 转换前一定要确认AD 电源已打开,AD 转换结束后关闭AD 电源可降低功耗,也可不关闭。初次打开内部A/D转换模拟电源,需适当延时,等内部模拟电源稳定后,再启动A/D转换,议启动A/D转换后,在A/D转换结束之前,不改变任何I/O口的状态,有利于高精度A/D转换
ADC_DATA / ADC_LOW2 特殊功能寄存器: A/D转换结果特殊功能寄存器
模拟/数字转换结果计算公式如下:结果 ( ADC_DATA[7:0],ADC_LOW2[1:0] ) = 1024 x Vin / Vcc Vin为模拟输入通道输入电压,Vcc 为单片机实际工作电压,用单片机工作电压作为模拟参考电压。取ADC_DATA的8位为ADC 转换的高8位, 取ADC_LOW2的低2位为ADC 转换的低2位, 则为10位精度。如果舍弃ADC_LOW2的低2位, 只用ADC_DATA寄存器的8位, 则A/D转换结果为8位精度。结果 ADC_DATA[7:0] = 256 x Vin / Vcc STC12C2052AD 系列单片机A/D转换精度只有8位,固无ADC_LOW2寄存器。
3.1.5 A/D转换模块的参考电压源
STC12C5410AD 和STC12C2052AD 系列单片机的参考电压源是输入工作电压Vcc ,所以一般不用外接参考电压源。如7805的输出电压是5V ,但实际电压可能是4.88V 到4.96V ,用户需要精度比较高的话,可在出厂时将实际测出的工作电压值记录在单片机内部的EEPROM 里面,以供计算。如果有些用户的Vcc 不固定,如电池供电,电池电压在5.3V-4.2V 之间漂移,则Vcc 不固定,就需要在8路A/D转换的一个通道外接一个稳定的参考电压源,来计算出此时的工作电压Vcc ,再计算出其他几路A/D转换通道的电压。
如可在ADC 转换通道的第七通道外接一个1.25V (或1V ,或...)的基准参考电压源,由此求出此时的工作电压Vcc ,再计算出其它几路A/D转换通道的电压。
3.2单元电路设计
3.2.1利用PWM 实现D/A功能的应用电路图
PWM 输出相当于DAC0832八位集成D/A转换器。D/A转换部分的输出电压作为稳压输出电路的参考电压。稳压输出电路的输出与参考电压成比例。8位字长的D/A转换器具有256种状态。当电压控制字从0,1,2,„„到256时,电源输出电压为0.0,0.1,„„10.0。 每路电压输出值的计算:V 0=R E F ⨯
data 256
⨯2
REF 为参考电压,data 为输入8位的比特数据;我们这里用的REF=5v。
3.2.2 A/D转换应用线路,按键扫描
如上图所示键盘电路通过分压电路,第一个按键所得电压为1/2Vcc,第二个按键分压2/3Vcc,第三个按键分压3/4 Vcc ,第四个按键分压4/5 Vcc ,那么利用单片机的P1.7口对按键电压进行采样,再对键盘电压对键盘的按下与否进行判断处理。
3.2.3 AD采样电路和数字电压表
考虑到单片机的内部处理功能,可通过STC 芯片的AD 转换器增加数字电压表功能。即由
单片机的P1.3口对电压进行采样,通过设置ADC_CONTR 特殊功能寄存器,启动以及停止AD 转换。然后读取寄存器ADC_DATA / ADC_LOW2 (A/D转换结果特殊功能寄存器)的值最后通过单片机将十六进制数转换为ASCII 码利用液晶显示模块显示。因此将输出电压直接送回单片机进行AD 采样,显示即实现了监测输出电压值的功能。另外由于可以采样得到输出电压,那么可以校准输出电压和预置电压,使输出电压值更为精确。
AD 采样电路
3.2.4电压放大电路
运算放大器通常都是工作在闭环状态.将运算放大器的放大电路接上一定的反馈电路和外接元件,就可以实现各种数学运算.运算放大器反馈电路有各种形式,不同的反馈电路和不同的输入方式可以组成各种不同用咖运算放大电路.
图5.14是输入信号加在反相输入端的比例运算电路.其中R1为输入端电阻,Rf 为反馈电阻,它以并联负反馈的方式将输出电压反馈到反相输入端,为了在输入信号Ui =0时, 输出U0=o ,电阻的选择应满足R2=R1// Rf.这样可保证运算放大器的反相输入端与同相
输入端的外接电阻相等,使其处于对称平衡状态,以消除运算放大器的偏置电流对输出电压的影响,因此,称R2为平衡电阻.
由理想运放的两条重要结论可知,I i ≈0,U +≈U -。通过R1的电流I 1,即:I f =I1又由于运放的通向输入端接地,U+=0,所以可得U +≈U -,也就是说,当同相端接地,U+=0时反相输入端电位U-≈0,它是一个不接地的“地”,称为“虚地”。“虚地”的存在是运算电路在闭环工作状态下的一个重要特征。 由图5.14可得
因为I1≈If, 所以可得
闭环电压放大倍数则为上式表明,该电路的输出电压与输
入电压之比仅由电阻RF 与R1的比值决定,而与集成运放本身的参数无关.式中的负号表示输出电压与输入电压反相,因而称为反相比例运算放大电路。 当
R1=RF 时,U0
=-Ui ,反相输入比例运算电路就成了反相器.
那么此电路利用PWM 模拟电压输出,后通过二次滤波,经过OP27放大电压后,电压为原来的两倍,即由原来的0~5v放大为0~10v变化。 接法如下:
3.2.5显示电路设计:
数控电源的数据显示采用LCD 液晶显示:
即用单片机的P2口输出,利用液晶显示模块,电路如下图所示:
第四章 软件部分
4.1软件设计说明:
控制程序使用C51编写,在KEIL C 平台下编译通过,运用STC 软件将程序下载到芯片。当按键按下,可进行电压调整,可调节电压1v ,调节电压以步进0.1v 。在按键加减的过程中,LCD 模块显示的电压随着上下变化,当按键不动作后,将单片机的PWM 模拟输出电压经二次滤波电路输出,经线性,放大得到与显示电压值相同的电压。同时将输出电压接至单片机的P1.2口可监测输出电压值,可进行预置值与测量值的比较。另外将AD 采样口独立出来可以实现数字电压表的测量功能。
4.2程序设计流程图
设计流程图分为三大部分,即主程序流程图,键盘扫描流程图,键盘控制流程图。 主程序流程图:
键盘扫描流程图:
键盘控制流程图:
4.3设计源程序 见附页
第五章 硬件调试
5.1制版
电路原理图见附录1,元件清单见附录2。
PCB 图如下图所示
按照PCB 图将元件焊接至铜板上,焊接时注意是否虚焊。
5.2调试
准备就绪后,将变压器通电,开始进行测试,检测它们是否达到设计要求。检查的项目包括输出电压范围,在整个输出电压范围内的步进调整值,输出电压与预置电压是否匹配和数字电压表功能的精准度。数控电源系统的供电由直流稳压电源提供,由硬件电路的正负15V 电源,5V 电源提供。
排除故障:在测试调试的过程中要排除障碍,刚开始液显不能正常工作,检查是否上电,调节电位器,看背光灯是否变化,没有变化则应检查单片机的输出口是否与液显正确连接,用万用表排查虚焊。当检查硬件没有问题之后,再进行测试,当还是无法达到要求工作时,那么就是程序问题。根据流程图修改程序,在KEIL 软件中编译无错后再下载至再次进行调试检测。
5.2.1电压测试:
5.2电压表测试:
以上为电压测试结果,由于PWM 的分辨率为0.2,所以其误差范围可以限制在0~0.2V左右,在这个范围内产生误差是允许的。因此监测电压与输出电压基本一致。因为PWM 输出为八位,分辨率=PWM占空比/250,那么当站空比值变化1时,其电压变化为0.02V ,后运放将电压放大变化0.04v 。所以可达到电压变化精度为0.04V 。
用单片机控制电源时,输出直流0-10V ,液晶显示器显示清晰正确,误差极小,完美的实现了数控恒压源这一课题。
5.3 设计心得:
(1)、设计程序之前, 务必要对所用单片机的内部结构有一个系统的了解, 知道该单片机
片内有哪些资源。 (2)、设计程序采用什么编程语言并不是非常重要, 关键要有一个清晰的思路和一个完整的软件流程图。
(3)、在设计程序时, 不能妄想一次就将整个程序设计好," 反复修改, 不断改进" 是程序设计的必经之路。
(4)、要养成注释程序的好习惯, 一个程序的完美与否不仅仅是实现功能, 而应该让人一看就能明白你的思路, 这样也为资料的保存和交流提供了方便。
(5)、在设计程序过程中遇到问题是很正常的, 但我们应该将每次遇到的问题记录下来, 并分析清楚, 以免下次再碰到同样的问题。
结束语
本文主要运用STC12C5410AD 单片机的内部资源,利用PWM 输出模拟DA 输出,AD 采样通道对电压进行采样。由于电压输出只能是0~5v,所以电压输出端加运放给予放大得到所需幅值的电压。在软件设计方面,在按键发生动作时,对输出电压进行调整,当按键不发生动作时,作为数字电压表进行使用。功能上还不够完善, 如没有电流过流时的报警指示功能等等,还可以运用INA126和74LS14构成电流保护电路,进一步得到提高。
附录
I
附录II
#include #define uchar unsigned char #define uint unsigned int
uchar a,b,c,d,key ,keyvalue,sel_flag,push_val,zt_flag; unsigned int temp,temp1; unsigned int j;
unsigned char m,mss_cnt;
unsigned char ADC_Channel_3_Result_bak,ychi;
unsigned char ADC_Power_On_Speed_Channel_2 =0xe2 ;//P1.2作为A/D输入 unsigned char ADC_Power_On_Speed_Channel_3 =0xe3 ;//P1.3作为A/D输入 unsigned char ADC_Channel_2_Result; unsigned char ADC_Channel_3_Result;
uchar code table0[]=" The V is:";
uchar code table2[]="0123456789MV .A";
//****************lcd显示****************************************************** sbit rs=P3^0; sbit rw=P3^1; sbit e =P3^2;
void delay(unsigned char x) {
unsigned char a,b; for(a=x;a!=0;a--) for(b=20;b!=0;b--); }
void writecomm(uchar comm) {
P2=comm; rs=0; rw=0; e=0; delay(500); e=1; delay(500); e=0; }
void writedat(uchar dat) { P2=dat; rs=1; rw=0; e=0;
delay(500);
e=1;
delay(500);
e=0;
}
void writesmh(uchar add,uchar date)
{
uchar count;
count=date;
writecomm(0x80+add);
delay(500);
writedat(table2[count]);
delay(500);
}
void init()
{
uchar i;
delay(100);
writecomm(0x38);
delay(100);
writecomm(0x0c);
delay(100);
writecomm(0x06);
delay(100);
writecomm(0x01);
delay(100);
writecomm(0x80);
delay(5);
for(i=0;i
{
writedat(table0[i]);
delay(5);
}
}
void ADC_init()
{
uchar iotemp;
iotemp=0x1c;
ADC_CONTR=ADC_CONTR|0x80;//;开A/D转换电源
delay(10);//;开A/D转换电源后要加延时,1mS 以内就足够了
P1M0=P1M0|iotemp;
P1M1=P1M1|iotemp;
AUXR=AUXR|0x10;
EADC_SPI=1;
} //;设置P1.5键盘,P1.3,1.4,1.6AD 设置A/D通道所在的I/O为开漏模式
//***************显示********************************************************** void display()
{
a=temp/1000;
b=temp/100%10;
c=temp/10%10;
d=temp%10;
writesmh(0x46,b);
delay(500);
writesmh(0x47,13);
delay(500);
writesmh(0x48,c);
delay(500);
writesmh(0x49,d);
delay(500);
for(j=0;j
delay(500);
}
void display1()
{
a=temp1/1000;
b=temp1/100%10;
c=temp1/10%10;
d=temp1%10;
writesmh(0x46,b);
delay(500);
writesmh(0x47,13);
delay(500);
writesmh(0x48,c);
delay(500);
writesmh(0x49,d);
delay(500);
for(j=0;j
delay(500);
}
//****************菜单程序***************************************************** void fuc_key()
{
//uint16 temp;
// uchar i,tz;
if(keyvalue==1)
{
zt_flag++;
if(zt_flag>2)
zt_flag=0;
}
if(keyvalue==4)
{
sel_flag++;
if(sel_flag>2)
sel_flag=0;
}
switch(zt_flag)
{
case 1:writesmh(0x00,1);
switch(sel_flag)
{ case 1: if((keyvalue==2)&(temp10)) {temp1-=100;} display1(); break; {temp1+=10;} if((keyvalue==3)&(temp1>0)) {temp1-=10;} display1(); break; case 2: if((keyvalue==2)&(temp1
case 0: if((temp0))
{ push_val--; } if((temp>temp1)&(push_val
default:
break;
}
break;
case 2:writesmh(0x00,2);
if((keyvalue==2)&(temp10)) {
temp1+=10;
push_val-=5;
}
if((keyvalue==3)&(temp1>0)&(push_val
{
temp1-=10;
push_val+=5; } if((temp0)) { push_val--; } if((temp>temp1)&(push_val
case 0:
display();
break;
default:
break;
}
}
//*****************PWM******************************************************** void pwm()
{
CMOD = 0x02;
CL = 0x00;
CH = 0x00;
CCAP0L = push_val;
CCAP0H = push_val;
CCAPM0 = 0x42;
CR = 1;
if(push_val>250) push_val=0;
if(push_val
}
//**********************main*************************************************** void main()
{
init();
ADC_init();
ET0 = 1;
TMOD = 0x01; //定时器0中断打开 //设定时器0为模式1,16位模式
TH0=(65536-2500)/256;
TL0=(65536-2500)%256;
TR0=1;
EA=1;
push_val=0xc0;
while(1)
{pwm();}
}
//******************adc******************************************************** void ADC_INT(void) interrupt 5 using 3
{
uchar ychi,ychi1;
if((ADC_CONTR&0x07)==0x03)
{
ADC_Channel_3_Result=ADC_DATA;
ADC_Channel_3_Result=(ADC_Channel_3_Result*1.0/256)*50;
if((ADC_Channel_3_Result
//键盘处理 { key=0x01;
}
{ else if((ADC_Channel_3_Result >29) & (ADC_Channel_3_Result 34) & (ADC_Channel_3_Result 38)& (ADC_Channel_3_Result 40)) { key=0xff; } } if ( ychi!=key ) { if (ychi1==0) {
ychi=key;
} else {
keyvalue= key ;
ychi1=0;
}
} else { ychi1=1;
}
if((ADC_CONTR&0x07)==0x02) //AD1
{
ADC_CONTR=ADC_CONTR&0xe7; //清0 ADC_FLAG, ADC_START 位, 停止A/D转换 ADC_Channel_2_Result=ADC_DATA;
temp=(ADC_Channel_2_Result*1.0/256)*500;
}
}
//***********************2.5MS定时********************************************* void Time0(void) interrupt 1 using 2
{
TH0=(65536-2500)/256;
TL0=(65536-2500)%256; mss_cnt++;
if(mss_cnt%4==0)//0.01S
{
ADC_DATA=0x00;
ADC_CONTR=ADC_Power_On_Speed_Channel_3;//选择P1.5作为A/D转换通道
delay(2); //20~200us ADC_CONTR=ADC_CONTR|0x08; //;启动 AD 转换 while((ADC_CONTR&0x10)==0x00);
fuc_key();
}
if(mss_cnt%40==0) //0.1秒处理一次 {
ADC_DATA=0x00;
ADC_CONTR=ADC_Power_On_Speed_Channel_2;//选择P1.3作为A/D转换通道
delay(2); //20~200us ADC_CONTR=ADC_CONTR|0x08;//;启动 AD 转换 while((ADC_CONTR&0x10)==0x00);
}
}