开关稳压电源技术报告 - 图文

更新时间:2024-01-25 22:47:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

开关稳压电源技术报告

目录

1

摘要..........................................................................3 关键字........................................................................3 1. 设计任务与要求............................................................3

1.1 设计任务..............................................................3 1.2 设计要求..............................................................3 1.3 题目评析..............................................................4 2. 方案比较与选择............................................................4 3. 系统硬件设计..............................................................5

3.1 系统的总体设计........................................................5 3.1.1 系统设计思想..................................................5 3.1.2 系统总体框图..................................................5 3.2 单元电路功能以及工作原理的分析........................................5 3.2.1 BUCK变换器...................................................6 3.2.2 主控电路......................................................8 3.3 单元电路的设计,单元的单数计算........................................9 3.3.1 开关变换......................................................9 3.3.2 输出整流滤波..................................................9 3.3.3 采样电路.....................................................10 3.3.4 PMOS驱动电路................................................10 3.4 发挥部分的设计与实现.................................................10 3.4.1 过压保护.....................................................10 3.4.2 过温保护.....................................................11 3.4.3 过流保护.....................................................11 4. 系统软件设计.............................................................11 系统总体流程图.......................................................11 各功能模块流程图.....................................................12 反馈模块.......................................................12 按键模块.......................................................12

5. 系统的调试...............................................................12 系统软件调试.........................................................12 系统硬件调试.........................................................13 系统整机调试.........................................................13 6. 系统的测试...............................................................13 电路的测试方案.......................................................13 测试仪器.............................................................13 测试结果.............................................................14 发挥部分的测试.......................................................19 7. 系统电路的存在不足与改进方向.............................................19 参考文献.....................................................................20 附录.........................................................................21 附录1...................................................................21 附录2...................................................................28 摘要

本系统采用BUCK变换器实现DC-DC变换,以基于ARM的最小系统为控制单元,通过对

2

输出电压不断地采样,反馈输出变化,调整占空比使输出稳定,并且可通过按键、数码显示实现输出电压数控。此外,系统加以输入过压、输入过流、输出过流、开关管过热等保护电路,保证系统稳定可靠地工作。 关键字

LPC2132 PWM脉冲宽度调制 BUCK变换器 反馈

一、 设计任务与要求

1.1 设计任务

设计并制作一个小功率开关稳压电源示意图如下:

EMI 输入滤波 电路 整流 滤波 电路 开关 变换 电路 输出 整流 滤波 输出1) 2) 3) 4) 5) 6)

1) 2) 3) 4)

说明:虚线框内电路不用制作。

1.3 题目评析 根据题目要求,我们要设计一个输入小于25V的直流电压,输出5~12V的直流电压,即DC-DC

1.2 要求

1.2.1 基本要求 输入电压:<=25V

输出电压:5~12V,可调(数控或电位器) 输出电压显示:数字,2位半 纹波:小于50mV

输出电流:大于500mA

效率:大于80%(5V、12V,满载)

1.2.2 发挥部分 过压保护 输入 过流保护 输入 短路保护 输出 过温保护 输出

辅助 电源 电路 控制器 反馈 电路 小功率开关电源原理框图

3

降压变换,因此可采用BUCK型变换器;输出电压2位半数字显示,即0.1V步进可调;反馈电路将输出电压的改变反馈到控制器,控制器作出相应的操作改变输出电压,使稳定在设定值。

二、 方案比较与选择

方案1:采用分立元件,例如自激式开关稳压电源,电路原理图如下:

输入电压为AC220v,50Hz 的交流电,经过滤波,再由整流桥整流后变为直流,通过控制电路中开关管的导通和截止使高频变压器的一次测产生低压高频电压,经由小功率高频变压器藕合到二次测,再经整流滤波,得到直流电压输出。为了使输出电压稳定,用了TL431 取样,将误差经光耦合放大,通过PWM 来控制开关管的导通与截止时间(即占空比),使得输出电压保持稳定。

由上可见,这种方案电路比较复杂,调试难度大,所以不可行。

方案2:采用电源专用芯片如LM3485,其典型电路如下:

这种方案虽然简单、性能可靠,但采用了专用芯片可能有违设计目的。

方案3:

4

开关变换电路 20V输入 按键 输出滤波整流电路 5~12V输出 显示 PMOS驱动电路 ARM PWM A/D 采样电路 外部中断 DC-DC变换采用BUCK型变换器,用ARM片内A/D不断检测电源的输出电压,根据电源输出电压与设定值之差,利用片内PWM模块输出PWM波,直接控制电源的工作。ARM扩展按键、数码显示功能实现数控输出电压。 此方案电路简单,可控性强,通过软件编程利用LPC2132的片内资源即可实现反馈、PWM波输出,又可扩展其他功能(如按键、显示)。

通过对各种方案可行性、复杂程度、系统指标等方面的比较,综合各方案的优缺点,我们采用第三种方案。

三、系统硬件设计

3.1 系统的总体设计

3.1.1 设计思想

以基于ARM的最小系统为控制单元,产生固定频率的PWM波,通过驱动电路使PMOS管工作于开关状态,从而将输入的15V直流电压“斩波”为与PWM波频率相同的脉冲波,脉冲波再通过整流滤波电路输出为5~12V的直流电压。根据整流原理,输出电压大约为脉冲波的平均电压,所以脉冲波的占空比决定平均电压的大小,通过改变PWM的占空比即可改变输出电压。

按键设定输出值并用数码管显示,控制单元根据输出电压与占空比的对应关系,改变PWM的占空比,从而实现输出电压数控可调,2位半显示。

5~12V输出电压经过采样电路比例缩小为适合控制单元A/D采样的电压,控制单元定时采样,比较采样值与设定值,改变占空比,调整输出电压。通过不断地反馈调整,最后使输出电压稳定在一定的值。

3.1.2 系统总体框图

过压、过流、短路、过热 5

开关变换电路 15V输入 按键 输出滤波整流电路 5~12V输出 显示 PMOS驱动电路 ARM PWM A/D 采样电路 外部中断 过压、过流、短路、过热 图1 系统总体框图

3.2 单元电路功能以及工作原理的分析

3.2.1 BUCK变换器 原理框图如下:

图2 BUCK变换器原理图

工作原理:

假定开关晶体管、二极管均是理想元件,电感、电容是理想元件,输出电压中的纹波电压与输出电压的比值小到允许忽略。

PMOS管工作在开关状态,如下:

图3 想情况下的BUCK变化器理

6

导通(开关S位置在A) 电流is流过电感线圈,在电感线圈未饱和前,电流线性增加,在负载R上流过电流Io,两端输出电压Vo,极性上正下负。当is>Io时,电容在充电。这时续流二极管承受反向电压 截止(开关S位置在B) 由导通到截止,线圈L中的磁场改变线圈L两端的电压极性,以保持其电流iL不变。负载R两端电压仍是上正下负。iL

电感电流连续 电感电流不连续 7

L?L?Vo?VsD1 输出电压Vo与PWM波将出现电感电流已下降到0,新的周期却尚未RTs占空比成线性关系电压增益由开关接通时占空比D1决定,即变换器有很好的控制特性。 开始的情况。当新的周期来到时,电感电流从0开始,线性增加。 当电感L较小,负载电阻较大,或Ts较大时, Vo?D1VsD1?D2 D2——PMOS管截止,续流二极管导通占空比 ?L?L 储能电感L与负载电阻R周期时间Ts乘积的比率 RTs 由于电感电流连续工作模式下,变换器有很好的控制特性;电感电流不连续工作模式下,电感放完电,电感与电容容易产生振荡,从而影响输出电压的纹波;又相同的占空比,输出电压在不连续模式工作模式下比大,效率高。综上所述,最理想的情况是BUCK变换器工作于临界状态,所以我们采用两种方法:

①增大电感值,增加电感储能,延长放电时间 ②提高开关工作频率,减小开关断开的时间 使PMOS管工作在电流连续状态。

3.2.2 主控电路

本系统以基于ARM的最小系统作为主控电路,实现按键设定数码显示输出电压、PWM波输出、输出反馈等功能。最小系统是以LPC2132为核心,扩展ZLG7290(通过IIC通信实现按键、数码管显示),电源电路,晶振电路,复位电路等其他模块。其框图如下:

8

按键 显示 电源电路晶振电路复位电路 ZLG7290 LPC2132 其他模块 图4 最小系统框图

其中核心器件LPC2132的片上资源:

1) ARM7TDMI核、最高工作频率66MHz; 2) 16KB 片内SRAM,64KB 片内FLASH; 3) 2个32位定时器;

4) 2通道UART、2个多主I2C总线控制器、2个SPI总线控制器; 5) 6通道PWM定时器及一个内部定时器; 6) 47个通用I/O口; 7) 9个外部中断源;

8) 8通道10位ADC,转换时间低至2.44us ; 9) 10位DAC;

10) 实时时钟、看门狗;

11) 片内Boot装载软件实现在系统/在应用中编程(ISP/IAP); 12) 2个低功耗模式:空闲和掉电

通过片内的PWM、A/D模块实现PWM波输出功能、输出反馈功能,再通过扩展ZLG7290模块实现按键设置数码显示功能。

3.3 单元电路的设计,单元的单数计算

3.3.1 开关变换电路

电子开关只是快速地开通、快速地关断这两种状态,并且快速地进行转换。只有力求快速,使开关快速地渡过线性放大工作区,状态引起的损耗才小。目前使用的电子开关多是双极型晶体管、功率场效应管,逐渐普及的有IGBT管,还有各种特性较好的新式的大功率开关元件,例如SITH(静电感应晶闸管)和MCT(场控制晶体闸流管)。基于我们设计的是小功率开关稳压电源,并且功率场效应管的开关特性较好,所以我们选择MOS管作为开关; 又由于普遍用于高端驱动的NMOS,导通时需要是栅极电压大于源极电压。而高端驱动的MOS管导通时源极电压与漏极电压(VCC)相同,所以这时栅极电压要比VCC大4V或10V。如果在同一个系统里,要得到比VCC大的电压,就要专门的升压电路了,所以我们选择PMOS管。

考虑到开关的工作频率大概几十kHz,我们选择IRF9530高速PMOS场效应管 Vds:100V Id:12A Pd: 75W 符合设计要求所需

3.3.2 输出滤波整流电路

输出滤波整流电路由续流二极管、电感和电容组成。考虑续流二极管在PMOS管截止时导通,消耗能量,又工作于高速状态,所以我们采用了低功耗、大电流、超高速的肖特基二

9

极管IN5817,其特性如下:

最大峰值反向电压:40V 最大反向有效值电压:28V 最大直流阻断电压:40V 最大正向平均整流电流:1A 最大正向压降:0.6V(1A)

由BUCK变换器原理分析可知,为了使电路工作在电感电流连续模式下,又纹波电压

?Vo?VoVD(t2?t1)Ts?o2Ts2 8LC8LC所以电感应该尽可能取得大,我们选择的电感为8mH

电容主要是“吸收”纹波,具有平滑电压波形的作用。电容与电感相当于一个低通滤波滤器,其截止频率定义为

fc?12?LC

考虑到电容上等效串联电阻的损耗,我们选择的电容为1000uF。

fc?12?LC?1?562HzVgs(th)?(?2~?4)V

2?1000uF?8mH此时截止频率约为562Hz,可见对于几十kHz的PWM波有很好的滤波效果

3.3.3 采样电路

由于LPC2132片内的A/D采样范围为0~2.55V,而buck变换器的输出为5~12V远超过采样范围,我们采用电阻分压,使输出电压缩小5倍,随后通过软件将采样值放大5倍恢复为实际输出电压。

'R4?R6采样电压 Vs?Vo

R4?R6?R5R4?3k?,R5?15k?,R6?0~2k?

Vs?(35~)?12V?(1.8~3)V 2020采样电路见图2

3.3.4 PMOS驱动电路

PMOS的特性,Vgs小于阈值电压才导通,IRF9530的阈值电压Vgs(th)?(?2~?4)V,又

源极电压为输入电压15V,所以栅极电压必须达到11V以上才截止,从而工作于开关状态。而LPC2132输出的PWM波,高电平为3.3V,不能使PMOS管截止,所以我们通过一个三极管作为开关来实现,PWM波低电平时三极管截止,集电极电压大约为15V,PMOS管截止;高电平时三极管导通,集电极电压大约为0V,PMOS管导通。考虑到三极管工作于几十kHz的频率,我们选择了9018低噪声高频放大管

3.4 发挥部分的设计与实现

3.4.1 输入过压保护

10

当输入电压在正常范围,输入采样电压小于基准电压,比较器输出低电平;

当输入过压,输入采样电压大于基准电压,比较器输出高电平,ARM产生外部中断,发出警报,封锁PWM信号,使PMOS管截止,从而保护电路损坏

图5 输入过压保护电路

3.4.2 过温保护

RT为负温度系数的热敏电阻,它与R1构成分压器,紧贴于功率开关器件PMOS的表面,温度升高时,RT阻值下降,适当选取R1的阻值,使比较器在设定的温度阈值动作。 过温时,产生类似于过压保护的PWM封锁信号。

图6 过温保护电路

11

3.4.3 过流保护

通常是采用霍尔电流传感器直接检测PMOS的电流Id,然后与设定的阈值比较,用比较器的输出去控制驱动信号的关断;或者采用间接电压法,检测过流时PMOS的电压降Vsd,因为管压降含有短路电流信息,过流时Vsd增大,且基本上为线性关系,检测过流时的Vsd并与设定的阈值进行比较,比较器的输出控制驱动电路的关断。

3.5 系统总体电路原理图

图7 系统总电路原理图

四、 系统软件设计

4.1 程序总体流程图

开始 软、硬件初始化 设置占空比初始值 初始输出电压为8V N 采样完成? Y 占空比调整模块 N 有无按键? Y 基准值设置模块 图8 软件总体流程图

12

考虑到电感电流要工作在连续状态,又为了便于控制占空比,我们选择频率为11.0592MHz/400=27.648kHz,即PWMMR0 = 400,占空比的精度1/400=0.25%。

4.2 各个功能模块流程图

4.2.1 占空比调整模块

12个采样点,去掉最大、最小值,剩下10个取平均值 采样值:基准 <1 PWMMR2+1 =1 >1 PWMMR2-1 调整占空比 图9 占空比调整模块流程图

其中通过定时进行A/D采样,部分程序如下: 定时中断 void __irq IRQ_Time1(void) { AD_Read(); T1IR = 0x02; // 清除中断标志 VICVectAddr = 0x00; // 通知VIC中断处理结束 } 采样函数 void AD_Read (void) { ADCR|=(1<<24); while((ADDR & 0x80000000)==0); ADC_Data = ADDR; ADC_Data = (ADC_Data>>8)&0xFF; sdata[i]=ADC_Data; i++; if(i==12) { i=0; AD_flag = 1; } }

4.2.2 基准值设置模块

13

键值? 1 移位 3 设置完成 2 加1 设置基准 图10 基准值设置模块流程图

4.3 程序清单

见附录1

五、 系统的调试

5.1 软件调试

编写程序控制片内PWM模块输出PWM波,通过对寄存器PWMMR2写值控制PWMBO波的占空比,对PWMMR0写值设定PWM波的频率,通过数字示波器观察,输出的PWM波达到系统所需。

通过对采样值的观察,发现因为输出电压有较大的纹波,A/D采样值与实际值有较大的偏差,所以我们通过采样12点,去掉最大值、最小值,再取平均值,来减小误差。最后处理过的采样值与实际值很接近,在误差允许的范围内。

5.2 硬件调试

用信号发生器产生占空比可控、幅值为3.3V的矩形波代替PWM波来控制PMOS管工作, 用数字示波器观察三极管集电极、PMOS栅极、PMOS源极、最后输出各点的波形,通过调整三极管设计电阻来改善PMOS管栅极波形的上升沿;通过输入电压并联电容改善PMOS栅源电容的过充现象。通过这些初步调试,使各点波形趋于正常,占空比能初步控制输出电压变化。

5.3 整机调试

将ARM的PWM波输出到BUCK变换器,A/D对输出电压采样。通过对如下调试过程遇到问题的解决,最后输出基本达到设计要求。

1) MOS管源极接高,在栅极加PWM波,漏极输出始终为高。

原因:电感太小,储能小,放电时间快,电源工作在不连续状态。 2) ARM输出PWM波,MOS管漏极波形与栅极不匹配。

原因:PWM波频率不够高,电源工作在不连续状态。

3) 10K以上频率的PWM波输给OC门(9013)基极,集电极输出波形占空比减小。

原因:9013速度不够快,换上9018可以。 4) MOS管栅极PWM波上升时间过长。

原因:栅极电流较小,对栅极电容充电较慢,降低拉高电阻后明显改善。 5) 输出纹波较大。

改善过程:原则:从燥声源入手,然后再滤波。

①输入电源加滤波,效果有所改善。

②在续流二极管加100-1000P电容,效果不明显。

③在输出加1000P,0.01UF,0.1UF电容,效果不明显。

14

④在输出加LC滤波(L=40uH,C1=10uF,C2=0.1uF),效果明显,但仍然有高频脉冲,再加小电容,没改善。 6) 地上纹波很大,约有70mV。

原因:接地面积小,干扰影响大。在地上接电感,效果不明显;加大接地面积,纹波减小30mV左右。

六、 系统的测试

6.1 电路的测试方案

数字示波器 万用表 直流 电源 开关 电源 图11 测试方案框图

可调 负载 6.2 测试仪器

三位半数字万用表(MASTECH my61) 直流电源(MOTECH LPS-305)

数字示波器(Tektronix TDS 1002)

6.3 测试结果

1) 在输入电压为15V,负载分别为200ohm,150ohm,100ohm时,输出电压的精度测试 负 电 载 5.01 5.02 5.03 8.5V 8.49 8.51 8.50 5.53 5.61 5.52 9V 8.94 8.93 8.94 5.98 5.95 6.00 9.5V 9.59 9.56 9.60 6.50 6.52 6.52 10V 9.99 9.94 9.99 7.03 6.97 7.00 10.5V 10.51 10.51 10.50 7.51 7.46 7.47 11V 11.01 11.00 11.02 8.04 8.02 8.00 12V 12.01 12.02 11.99 压 5V 5.5V 6V 6.5V 7V 7.5V 8V 200ohm 150ohm 100ohm 负 电 载 压 200ohm 150ohm 100ohm 表一

由表一可以看出,输出电压在5V~12V可调,误差满足两位半要求。

2) 在输入电压为15V,负载电阻为额定电阻时(即电流为500mA),输出纹波电压和效率

测试 标定电压 负载电阻

5V 10ohm 6V 12ohm 7V 14ohm 8V 16ohm 15

9V 18ohm 10V 20ohm 11V 22ohm 12V 24ohm

实测电压 输出电流 纹波电压 输入电流 效率 5.01V 501mA 116mV 5.96V 497mA 124mV 6.94V 496mA 128mV 8.01V 501mA 130mV 8.96V 498mA 136mV 9.99V 500mA 128mV 11.01V 11.81V 500mA 116mV 500mA 104mV 0.220A 0.251A 0.282A 0.311A 0.343A 0.356A 0.371A 0.398A 76.1% 78.7% 81.4% 86.0% 86.7% 93.4% 98.9% 97.3% 表二

由表二可以看出,输出电压纹波较大,效率不完全满足要求。

3) 在输入电压变化情况下,输出电压精度,纹波和效率测试 标定电压5V 负载电阻10ohm 标定电压8V 负载电阻16ohm 标定电压12V负载电阻24ohm 输出电压 纹波电压 输入电流 效率 输出电压 纹波电压 输入电流 效率 输出电压 纹波电压 输入电流 效率 15V 5.01V 116mV 0.220A 78.8% 8.01V 128mV 0.332A 80.5% 11.81V 104mV 0.398A 97.3% 18V 4.97V 134mV 0.195A 70.4% 8.03V 148mV 0.296A 75.6% 12.09V 138mV 0.383A 88.3% 21V 5.01V 146mV 0.175A 68.2% 8.02V 164mV 0.270A 70.9% 12.11V 164mV 0.346A 84.1% 25V 4.98V 158mV 0.156A 63.6% 8.01V 186mV 0.232A 69.0% 12.15V 194mV 0.305A 80.7% 表三

由表三可以看出,标定电压不变,输入电压越高,则纹波电压越大,输入电流越小,效率越低。

4)一些节点的波形 PMOS栅极波形

16

PMOS漏极波形

可见,PMOS管工作于电流连续状态。

二级LC滤波前的波形

17

二级LC滤波后的波形

可见,LC滤波电路对限制纹波有一定的效果。

6.4 发挥部分的测试

七. 系统电路的存在不足与改进方向

18

通过对各项指标的测试,部分指标达到要求,按键设定输出值能实现0.1V步进,实际输出值与设定值之差小于0.1V;若负载或输入电压波动,系统通过反馈很好地稳定输出电压。不足在于,纹波大约在130mV左右,没有达到要求(小于50mV);在500mA输出电流下,系统工作效率不完全满足。在这两方面有待继续改进。

对于纹波比较大,分析产生纹波的原因: 1) 开关在其导通和截止的时候,都会有一个上升时间与下降时间,这时候在电路中就会出

现一个与开关上升下降时间同频率或者奇数倍频的噪声;

2) 续流二极管在反向恢复的瞬间,其等效电路为电阻、电容和电感的串联,会引起谐振,

产生噪声;

3) 输入电源引入的纹波;

4) 系统各元件、地线、电源线布局不合理产生干扰,引入噪声;

我们也采用了一些措施来抑制纹波,但效果不十分明显: 1) 在输入电压处并联电容来滤波和防止PMOS栅源电容过充; 2) 在输出处加LC滤波电路,有一定的效果;

3) 在续流二极管处并联C或RC来破坏二极管等效电感和等效电阻形成的高频振荡

对于开关效率没有完全达到要求,分析系统的功率损耗,主要有如下几种:PMOS管的开关损耗,驱动电路电阻的损耗,续流二极管导通损耗。可通过相应措施:适当减小开关频率,减小电阻,二极管上并联一个MOS管同步整流来改进。

19

参考文献

[1] 周立功等.深入浅出ARM7-LPC212X/214X.北京:北京航空航天大学出版社,2005.6 [2]童诗白、华成英.模拟电子技术基础.北京:高教出版社,1995

[3]张占松、蔡宣三.开关电源的原理与设计.北京:电子工业出版社,2001 [4]阎石.数字电子技术基础.北京:高等教育出版社,1995

[5]开关电源纹波的产生测量和抑制 .http://www.ednchina.com/blog/Redox/

[6]刘树林. Buck DC/DC 变换器的输出纹波电压分析及其应用. 电 工 技 术 学 报. 2007 年2 月 第22 卷第2 期

20

附录

附录1 程序清单 #include \#include \#include \

#define G_LED (1<<14) //低电平有效 #define TEST (1<<29)

uint8 sdata[12] = {0}; uint8 data[3] ={0,8,0}; uint8 senddata[3]={0};

volatile uint32 k=0,flash_flag=0; volatile uint32 i=0; volatile uint32 z=0; volatile uint16 j=0;

volatile uint8 key=0,key_flag,AD_flag = 0,DA_flag,keyflag,a=0,b=0; volatile uint32 ADC_Data=0;

volatile uint16 vref=8000,setpoint;

void Delay(uint32 M_dly) {

while(M_dly--); }

/****************************************************************************** ** 函数名称 :AD_READ()

** 函数功能 :查询并读取AD。

******************************************************************************/ void AD_Read (void) {

ADCR|=(1<<24);

while((ADDR & 0x80000000)==0); ADC_Data = ADDR;

ADC_Data = (ADC_Data>>8)&0xFF;

sdata[i]=ADC_Data; i++;

if(i==12) {

i=0;

AD_flag = 1; } }

21

/****************************************************************************** ** 函数名称 :AD_int()

** 函数功能 :AD转换完成中断 ** 入口参数 :无 ** 出口参数 :无

****************************************************************************/ void AD_int (void) {

PINSEL1 |= 0x04000000; //0x01<<22;// P0.27连接到AD0.0

//进行ADC模块设置

//AD0INTEN |= 4;// AD0.2转换完成产生中断 ADCR = (1<<2 ) | // SEL=1,选择通道0

((Fpclk / 500000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,转换时钟为0.5MHz

(0 << 16) | // BURST=0,软件控制转换操作 (0 << 17) | // CLKS=0, 使用11clock转换 (1 << 21) | // PDN=1,正常工作模式

(0 << 22) | // TEST1:0=00,正常工作模式 (0 << 24) | // START=1,直接启动ADC转换 (0 << 27); // 直接启动ADC转换时,此位无效

ADC_Data = ADDR; // 清除DONE标志位 }

/**************************************************************************** * 名称:IRQ_Time1()

* 功能:时钟节拍,用于延迟函数,500ms中断,可用于其他用途。 * 入口参数:无 * 出口参数:无 * 说明:

****************************************************************************/ void __irq IRQ_Time1(void) {

AD_Read();

T1IR = 0x02; // 清除中断标志

VICVectAddr = 0x00; // 通知VIC中断处理结束 }

/**************************************************************************** * 名称:Time1Init()

22

* 功能:初始化定时器1,定时时间为125us,并使能中断。 * 入口参数:无 * 出口参数:无

****************************************************************************/ void Time1Init(void)

{ /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz */

T1PR = 0; // 设置定时器1分频为0分频,得11059200Hz T1MCR = 0x18; // 匹配通道1匹配中断并复位T1TC T1MR1 = Fpclk/1000; // 50ms定时 T1TCR = 0x03; // 启动并复位T1TC T1TCR = 0x01;

T1IR = 0x02; //清中断标志

/* 设置定时器1中断IRQ */ VICVectAddr = 0x00;

VICIntSelect = 0x00000000;

VICVectCntl2 = 0x25; // 定时器1中断通道分配2优先级(向量控制器2) VICVectAddr2 = (uint32)IRQ_Time1; // 设置中断服务程序地址向量 //VICIntEnable |= 0x00000020; // 使能Time1中断 }

/****************************************************************************** ** 函数名称 :GetKey_flag() ** 函数功能 :外部中断3初始化 ** 入口参数 :无 ** 出口参数 :无

*****************************************************************************/ void __irq GetKey_flag(void) {

key_flag=1;

//key=ZLG7290_GetKey(); EXTINT=0x08;

VICVectAddr=0x00; }

/****************************************************************************** ** 函数名称 :IRQ_int()

** 函数功能 :外部中断3初始化 ** 入口参数 :无 ** 出口参数 :无

***************************************************************************/ void IRQ_int(void)

23

{

PINSEL0 |=0x00000000; PINSEL1 |=((0x02)<<28);

EXTMODE |=0x08; //外部中断3采用下降沿触发方式

VICIntSelect=0x00000000; VICVectCntl3=0x20|17;

VICVectAddr3=(uint32)GetKey_flag; VICIntEnable=1<<17; }

/****************************************************************************** ** 函数名称 :PWM_int()

** 函数功能 :PWM初始化,P0.1 输出 ** 入口参数 :无 ** 出口参数 :无

****************************************************************************/ void PWM_int() {

PINSEL0 |=0x08;

PWMPR=0; PWMMCR=0x02; PWMPCR=0x0800;

PWMMR0=Fpclk/27648; //速率设为27648Hz PWMMR3=212; //216 PWMLER=0x09; PWMTCR=0x02; PWMTCR=0x09; }

/****************************************************************************** ** 函数名称 :abs() ** 函数功能 : ** 入口参数 :

** 出口参数 :无

******************************************************************************/ void compare() { uint8 m; a=sdata[0]; b=sdata[0];

for(m=1;m<12;m++)

24

{

if(sdata[m]>a)a=sdata[m]; if(sdata[m]

/****************************************************************************** ** 函数名称 :PWM_Feedback()

** 函数功能 :反馈、比较、调节占空比 ** 入口参数 :sdata、vref ** 出口参数 :无

***************************************************************************/ void PWM_Feedback() {

uint16 sample = 0; uint8 n;

compare(); //去掉最大值和最小值 for(n=0;n<12;n++)

sample += sdata[n]; sample=sample-a-b;

sample=sample*484/100; //[(sample*5*1000)/10]*2.45/256

if(vref>=(sample+150)) PWMMR3 += 1;

if(sample>=(vref+150)) PWMMR3 -= 1; j=PWMMR3; if(j>315)

PWMMR3=315;

PWMLER=0x09; PWMTCR=0x02; PWMTCR=0x09; }

/**************************************************************************** * 名称:main() * 功能:主程序

* 入口参数:无 * 出口参数:无

****************************************************************************/ int main(void) {

25

PINSEL0 = 0x00; PINSEL1 = 0x00; I2C_Init(10000); PWM_int(); IRQ_int(); Time0Init(); Time1Init(); AD_int();

senddata[0]=data[0];

senddata[1]=data[1]|0x80; senddata[2]=data[2];

ZLG7290_SendBuf(senddata,3);

VICIntEnable|=0x00000020;

while(1) {

if(AD_flag) {

AD_flag = 0;

VICIntEnClr|= 0x00000020;//关定时器1中断 PWM_Feedback(); Delay(100000);

VICIntEnable|=0x00000020; }

if(key_flag) {

VICIntEnClr=(1<<10)|(1<<17); key_flag=0;

key=ZLG7290_GetKey();

VICIntEnable=(1<<10)|(1<<17); //开启spi中断,外部中断 }

switch(key) {

case 1: //移位键 {

key=0;

VICIntEnClr|= 0x00000020;//关定时器1中断 if(flash_flag<3) flash_flag++;

26

else

flash_flag=1;

ZLG7290_flash(1<<(flash_flag-1)); j=0; break; }

case 2: //加键 {

key=0;

VICIntEnClr|= 0x00000020;//关定时器1中断 switch(flash_flag) {

case 1:

data[0]++;

if(data[0]>1) data[0]=0; break; case 2:

data[1]++;

if(data[1]>9) data[1]=0; break; case 3:

data[2]++;

if(data[2]>9) data[2]=0; break; }

senddata[0]=data[0];

senddata[1]=data[1]|0x80; senddata[2]=data[2];

ZLG7290_SendBuf(senddata,3);

ZLG7290_flash(1<<(flash_flag-1)); j=0; break; }

case 3: {

key = 0;

ZLG7290_flash(0);

vref = (data[0]*10000+data[1]*1000+data[2]*100) ;

if(vref>12000) vref = 12000;

27

Delay(100000);

VICIntEnable|=0x00000020; j = 0; break; }

}//end of switch }//end of while(1) }//end of main

附录2 元器件清单

PMOS管IRF9530、肖特基二极管1N5817、8mH线圈、高频放大管9018、 若干电阻、电容

28

本文来源:https://www.bwwdw.com/article/9p9w.html

Top