资源描述
武汉理工大学《学科基础课群综合训练课程设计》
课程设计任务书
学生姓名: 龚心元 专业班级:信息sy1001班
指导教师: 魏洪涛 工作单位: 信息工程学院
题 目:程控音频OCL功率放大器
初始条件:1. PROTEL、 EWB、MULTISIM、MATLAB等软件;
2.《通信原理》、《微机原理》、《模拟电子技术基础》、《数字电子技术基础》、《电磁场与电磁波》等学科基础知识
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)用仿真软件对电路进行验证,使其满足以下要求:
1) 失真度≤3%时,输出功率P0≥7.5W;
2) 频率响应为(20~22000)Hz;
3) 在信号源的幅度和频率固定为某一值时,可以设置输出功率,并实时测量、显示输出功率,显示的输出功率(Ps)与设定功率(Pg)的相对误差。
时间安排:
序
号
阶段内容
所需时间
1
方案设计
5天
2
硬件设计
35
3
软件设计
35
4
系统仿真
25
系统调试
3天
答辩
1天
合 计
14天
指导教师签名: 年 月 日
系主任(或责任教师)签名: 年 月 日
目录
摘要 I
Abstract II
1 设计方案论证与选择 1
1.1 增益控制方案的比较与选择 1
1.2 A/D 转换方案的比较与选择 2
1.3 有效值检测方案的比较与选择 2
1.4 显示方式的设计方案的比较与选择 2
1.5 电源模块的设计方案的比较与选择 2
1.6 单片机的选择 3
2 系统设计 4
2.1 总体设计 4
2.2 单元电路设计 4
2.2.1 增益调整模块 4
2.2.2 OCL 电路模块 5
2.2.3 过载保护模块 7
2.2.4 真有效值测量模块 8
2.2.5 A/D 转换模块 9
2.2.6 LCD12864显示模块 10
2.2.7 电源模块 11
2.2.8 单片机控制模块 11
3.软件设计 13
3.1软件流程图 13
4 系统测试 14
5 结论 15
6 心得与小结 16
7 参考文献 17
附录: 18
附录1:元件明细表 18
附录2:仪器设备清单 18
附录3:电路图图纸 18
附录4:部分程序 20
附录5:完整的测试结果 28
摘要
本程控音频 OCL 功率放大器用单片机作为主控制器,通过数字电位器 X9313 对信号增益进行调整,准确控制 OCL 输出功率。并且采用 AD637 实现了显示实际输出功率。在交流信号输入端短路接地时,可使得输出端交流信号小于 3mv;频 率响应在(20~22000)Hz 范围内,实现了输出信号无失真。
关键词:OCL 功放,AD637,程控。
Abstract
The programme-controlled Audio OCL power amplifier is based on a MCU controller. It can control output power of OCL nicety by dual digital potentiometer X9313. And realized the display of real output power by AD637. When a short circuit is caused at AC signal input port , the output AC signal is lower than 2 .And output signal is not distortion between 20 to 22000Hz.
Keywords:OCL Power Amplifier,AD637,Programme-controlled.
I
1 设计方案论证与选择
设计要求:
(1)任务
设计一个功率可程控、有输出功率显示的OCL音频功率放大器电路。后级OCL功率放大部分用分立元件制作,供电电源为±15V,输入信号电压幅度为(10~1000)mVrms,负载为为8欧电阻。其结构框图如下图所示。
图1 结构框图
(2)要求
用仿真软件对电路进行验证,使其满足以下要求:
1. 失真度≤3%时,输出功率P0≥7.5W;
2. 频率响应为(20~22000)Hz;
3. 在信号源的幅度和频率固定为某一值时,可以设置输出功率,并实时测量、显示输出功率,显示的输出功率(Ps)与设定功率(Pg)的相对误差。
根据要求,进行如下的方案选择。
1.1 增益控制方案的比较与选择
方案一:根据运放增益 Av=Rf/R1 改变Rf或R1均能改变增益。但由于增益开关电阻的变化,会影响整个系统的精度,切换过程出现反馈回路的瞬间开路,能
使运放进入暂时饱和状态而影响速度。
方案二:使用非易失性数字电位器X9313 控制运放的增益,编程简单,容
易操作控制,成本低廉。
方案三:使用程控增益调整功能芯片AD603,能够在程序中用软件控制放
大器的增益,或者放大器本身能自动将增益调整到适当的范围。常用于自动化程
度要求较高的系统中,但芯片价格昂贵。
0
综合以上方案,我们选择方案二,X9313 控制运放的增益。
1.2 A/D 转换方案的比较与选择
方案一:按照接口类型的不同可以将A/D 转换器分为串行输出和并行输出。
并行转换器的转换速度快,但占用I/O 多。串行转换器输出建立时间相对于并行
转换器稍长,但芯片与CPU 连接时使用引线少、电路简单、功耗低、成本低。
方案二:按照数字量的位数可以分为8 位、10 位、12 位、16 位等精度的转换器,位数越大分辨率越大,但相应的成本也越高。
综合两个方案的优点,本设计采用Maxim 公司的12 位串行输出型A/D 转换
器MAX187。
1.3 有效值检测方案的比较与选择
方案一:根据A/D 转换的获得电压平均值V,正弦波的有效值与平均值的关
系可求出有效值,但它仅适合测量无失真的正弦波,若波形存在失真,或者被测量对象为非正弦波则会产生测量误差,转换方法精度不高。
方案二:,根据真有效值(TRMS)原理,借助TRMS/DC 转换器对输入电压进行“平均→取平均值→开平方”运算,就能获得交流电压的真有效值。真有效值转换芯片AD637 是高准确度的单片真有效值/直流流转换器,测量误差<(0.2%计数+0.5mV),能计算任何复杂的波形的有效值、平均值、均方值和绝对值,
具有分贝输出.
比较两种方案,我们选择方案二,使用AD637 直接获得输出真有效值。
1.4 显示方式的设计方案的比较与选择
方案一:采用LED 数码管显示。如果需要显示的内容较多,过多增加数码管
进行轮流显示则控制复杂,此外,数码管需要较多连线,电路复杂,功耗比较大。
方案二:采用带字库的液晶模块LCD 显示。可以显示字符、图片,利
用单片机直接驱动液晶显示模块,设计简单,且显示界面宽大美观舒适,耗电小。
综上所述,本设计选择方案二,采用LCD 实时显示输出功率等。
1.5 电源模块的设计方案的比较与选择
方案一:用MC34063 芯片将3V 电池电压进行直流斩波调压,得到±5V 和
±15V 的稳压输出。减小系统体积重量,但该电路供电电流小,供电时间短,无
法保证系统长期稳定运作。
方案二:采用环形变压器,漏磁小,振动噪声小,无需另加屏蔽层来屏蔽
电磁干扰,适合用在高灵敏度和易受高频影响的电子设备上。三端固定稳压器获
得±5V 和±15V 电源,电路经过进行扩流,另外输出用大容值电容滤掉高频成分,这样就可以获得一个纹波系数非常小、电流大、电压稳定的电源。
综上所述,由于本设计对电源要求非常严格,所以选择方案二,采用环形变压器三端稳压扩流电路。
1.6 单片机的选择
本设计选用AT89C51芯片作为控制器。AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
2 系统设计
2.1 总体设计
经过以上方案的比较和论证,最终确定的系统组成框图如图2.1 所示。单片
机控制数字电位器改变运放增益后,信号输入到OCL 功率放大电路,OCL 电路采
用运算放大器和大功率对管构成的功率放大电路,负载端经过TRMS/DC 电路可直
接检测出负载的有效值,再经过12 位的A/D 转换输出,可以计算出设定功率和实
际输出功率和相对误差。
图 2 系统组成框图
2.2 单元电路设计
2.2.1 增益调整模块
X9313 是32 抽头,包含有31 个电阻单元的电阻阵列。在每个单元之间和
三个端点都可以被滑动单元访问的抽头点。滑动单元的位置由CS、U/D 和INC
三个输入端控制。滑动端的位置可以被贮存在一个非易失性存储器中在下一次上
电工作时可以重新调用。X9313 的分辨率等于最大电阻值除以31。图中信号经过
跟随器,数字电位器控制运放的增益。
X9313的引脚图如下:
图3 X9313引脚图
图4 增益调整模块电路
2.2.2 OCL 电路模块
(1)关于 OCL功率放大器
OCL:英文Output Capacitorless的缩写,意为没有输出电容。所以OCL功率放大器就是输出端没有输出电容的功率放大器。
OCL 功率放大器的特点是:双电源供电、不需输出电容、频率特性好、可以放大慢变化的信号。
(2)电路模块
分立元件构成的低频功率放大器电路可分为输入级、功率激励级和OCL 输出
级三部分。采用低噪优质运放NE5532 和大功率音频功率对管2SA1943/2SC5200组成的音频功率放大器,NE5532 的作用是电压驱动激励级,功率对管的作用是OCL 功率放大,调整滑动变阻器使2SA1943/2SC5200 的静态电流使其处于正常工作状态,二极管1 和2 的作用是给输出级提供偏置电压,让输出级始终有静态电流通过,防止交越失真。配合负反馈的作用,运放静态输出电压被嵌在0.7V左右,有效减少运放的小信号失真。
根据设计要求,输出端的负载阻抗RL=8Ω.
图5 OCL模块电路
图6 电压输出
仿真结果为:
图7 示波器输出
由可知输出功率p==10.5w满足输出功率P0≥7.5W,符合要求。电路运用multisim进行仿真,输入的正弦信号,通过OCL放大电路之后,得到了放大,不过出现了轻微的是真,为了减少放大电路的失真,设计了过载保护电路,以使音频放大电路能够正常工作。
过载保护电路如下。
2.2.3 过载保护模块
开机时,电源接通,功率放大器加上电,但电压控制开关未吸合,功率放大器无输出。这样可防止功率放大器在上电瞬间因电压建立不平衡而引起开机冲损
坏负载和功放。C37通过电阻充电,电容充电结束Q5截止,Q6导通,开关吸合,功率放大器有输出。若输出过载,即输出电压平均值超过保护设定值时,则D3导通,Q7,Q5导通, Q6截止,开关释放,同时C37放电。当输出降低后,Q7截止,Q5 继续导通;当C37充电结束后,Q5截止,Q6导通,开关吸合,装置重新输出。C38是为了吸收个别尖峰脉冲起滤波作用, R24用于设定保护电压本电路可以有效地保护负载不过载,对功率放大器也有一定的保护作用。
图8 过载保护电路
2.2.4 真有效值测量模块
真有效值检测电路采用集成真有效值变换芯片AD637,直接输出被测复杂信
号的真有效值。AD637 可测量的信号有效值可高达7V,精度优于0.5%,且外围
元件少,频带宽。对于一个有效值为2V 的信号,它的3dB 带宽为8MHz,并且可
对输入信号的电平以dB 形式指示。
AD637的引脚图如下:
图9 AD637引脚图
图10 真值有效测量模块电路
真有效值变换芯片 AD637,直接输出被测复信号的真有效值。AD637 可测量的信号有效值可高达 7V,精度优于 0.5%,且外围元件少,频带宽。对于一个有效值为 2V 的信号,它的 3dB 带宽为 8MHz,并且可对输 入 信 号 的 电 平 以 dB 形式 指 示 。 图 2.4 中 是耦 合 电 容 , 平 均 电 容是AD637的关键外围元件,尽管增加的容量可减少纹波电压产生的交流误差,但稳定时间也相应增加,测量时间延长。电位器是用来调整9脚的输出电压,输入 1V 的标准直流电压,调整,使=1.000V。若选择 2的正弦波则则输出为 0.707 的直流电压,9脚输出电压==(rms),然后送到 MAX187中完成 A/D 转换及显示。
2.2.5 A/D 转换模块
MAX187 使用采样/保持(T/H)和逐次逼近寄存器(SAR)电路来转换模拟
量至12 位数字量输出。T/H 不需要外部保持电容。MAX187 有一个片内基准并有
温度补偿能隙(bandgap)二极管,保持精度为+4.096V±0.5%。其输出接至REF
同时也驱动内部DAC。输出可以用作一个其他器件的基准电压源并能提供0.6mA。
通过接一个4.7uF 的电容来减弱REF 上的振动。4 脚为参考端接一个10μF 的电容,这是使用内部4.096 V 参考电压方式。输入模拟信号的电压范围为0~4.096 V,如模拟输入电压不在这个范围要外加电路进行电压范围的变换。
MAX187引脚图如下:
图11 MAX187引脚图
图12 A/D转换电路
2.2.6 LCD12864显示模块
采用带字库的点阵图形液晶模块LCD12864,可以显示汉字、字符和图形,
功耗很低,显示效果直观。
图13 显示电路
采用带字库的点阵图形液晶模块 LCD12864,可以显示汉字、字符和图形, 功耗很低,显示效果直观。可调电阻 R1 用来调节 LCD 显示屏的亮度。15 脚 PSB接高电平,表示这里采用的是并行数据控制方式。
2.2.7 电源模块
电路经过TIP41/TIP42 进行扩流,另外输出用大容值电容滤掉高频成分,
在四个整流二极管两端各并联一个0.01μF 的瓷片电容,这样就可以获得一个纹
波系数十分微小小、电流大、电压稳定的电源。
图14 电源电路
2.2.8 单片机控制模块
采用AT89C51芯片控制电路,其引脚图如下:
图15 AT89C51的引脚图
控制电路如下图:
图16 控制电路
3.软件设计
3.1软件流程图
图17 软件流程图
4 系统测试
表1 接 8Ω负载时的频率响应特性
频率
Vpp(单位:V)
是否失真
20
11.2
否
200
16.5
否
1K
16.3
否
10K
16.3
否
20K
16.3
否
表2 功率测试结果
5 结论
程控音频 OCL 功率放大器可以实现以下功能:
基本要求部分:
在输入交流短路接地,输出端交流信号<3 mvVpp,远远低于题目要求;频率响应为(30~10000)Hz 范围内无失真;输出功率最大 4.4W;在信号源的幅度和频率固定为某一值时,可以实时测量、显示输出功率。
发挥部分:
1.在信号源的幅度和频率固定为某一值时,显示的输出功率 (PS )与设定 功率 (Pg ) 的相对误差|(Ps-Pg)|/Pg<2.977%;
2.频率相应为(20~22000)Hz 范围内无失真;
3.在电源电路设计时,在四个整流二极管两端各并联一个0.01μF的瓷片电容,这样获得一个纹波系数十分微小的电源。
6 心得与小结
通过本次课设,在实践中对《通信原理》、《微机原理》、《模拟电子技术基础》、《数字电子技术基础》、《电磁场与电磁波》等学科基础课的课堂理论知识做进一步巩固。
设计从查阅资料开始,搜索别人的报告,参考学习,然后仔细研究课程学习的内容,融会贯通,最后确立自己的设计思路。由于涉及内容庞大,电路模块很多,用不同的仿真软件,画出各个电路模块,并加以仿真。这个过程遇到了很大的麻烦,芯片引脚,线路连接,元器件选择,都出现过很多错误,通过翻阅资料和同学交流,大部分得到了解决。接着整理设计报告,用文字将自己的设计思路叙述出来。整个设计经历了一个漫长的过程,收获也不小。
此次课程设计给我带来的一些触动和思考,它使我明白了一件事,在大学里面要想方设法转变自己的思维方式,给自己定一个目标,朝着这个目标奋斗,并全力以赴实现它,个人认为,这就是课程设计所折射出来的内涵。
课程设计,不但让我巩固了书本知识,还锻炼了动手能力,也明白了,不管多么麻烦,都不要害怕,一点一滴一丝一缕,慢慢理解清楚,就会会有头绪。一件事情不管它有多么难,一张电路图,不管它有多少元器件,既然它是一件事,肯定有解决的方案,既然它是一张图,也肯定存在着它内部的结构原理,而我们要做的不过是找到这些方案,摸清它的原理,从而使得我们的思想变得更为开阔,更为活跃!然而,追求科学的过程也应当是这样吧!
7 参考文献
[1]谢自美主编.电子线路设计·实验·测试(第三版).华中科技大学出版社,1998年出版。
[2]Sanjit K. Miltra主编.Digital Signal Processing Laboratory Using Matlab.McGraw-Hill出版社,2000年出版。
[3] 黄智伟.全国大学生电子设计竞赛-电路设计.北京航空航天大学出版社,2008.04.
[4] 赵广林.常用电子元器件识别/检测/选用以读通.电子工业出版社,2007.7
[5] 玲木雅臣.晶体管电路设计(上)-放大电路技术的实验解析.科学出版社,2004.09
附录:
附录1:元件明细表
1. AT89S52
2. DA1987
3. AD637
4. MAX187
5. MAX531
6. NE5532
7. 2SC5200/2SA1943
8. LCD12864
附录2:仪器设备清单
1、 低频信号发生器
2、 数字万用表/指针万用表
3、 数字示波器
附录3:电路图图纸
图18 电源电路图
28
图19 系统控制板
图20 核心电路
图21 增益控制电路
附录4:部分程序
1.数字电位器X9313的C52程序
//=====================================================================
// X9313 数字电位计驱动程序
//硬件连接: INC——P0^0;
// UD ——P0^1;
// CS ——P0^2;
// VDD--逻辑电源(+5V)
// VSS--GND(0V)
//X9313.c
//writer:谷雨 2008年8月2日于EDA实验室
//说明: X9313当设置其划向最大或者最小时,不会循环回复
//=====================================================================
#include <reg52.h> //STC单片机头文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
//**************************修改硬件时要修改的部分********************************
sbit INC=P0^0; //加/减计数脉冲输入端
sbit UD=P0^1; //加/减计数控制端,高电平时加法计数,低电平时减法计数
sbit CS=P0^2; //片选输入端,低电平有效
//=================================================================
// 函数名称 :void X9313_set(uchar res,uchar ud)
// 函数功能 :设置X9313数字电位计的滑动方向以及滑动幅度
// 入口参数 : res 1~31 滑动的幅度 res每增加1,电位器电阻增加或减少10/31K
// ud 0 1 滑动方向 0:向低端滑动 1:向高端滑动
// 出口参数 :无
//=================================================================
void X9313_set(uchar res,uchar ud)
{
uchar i;
switch(ud)
{
case 0:UD=0; break; //U/D=0,向低端滑动
case 1:UD=1; break;//U/D=1,向高端滑动
default:break;
}
CS=0; //片选有效
for(i=0;i<res;i++)
{
INC=1;
_nop_();
INC=0;
_nop_();
}
INC=1;
_nop_();
CS=1; //片选无效
}
//=================================================================
// 函数名称 :int main(void)
// 函数功能 :主函数,无实际意义,仅测试9313用
// 入口参数 :无
// 出口参数 :无
//=================================================================
void main(void)
{
X9313_set(31,0);//覆盖原来数据,使电位器从最低端开始
X9313_set(31,1);
while(1);
}
//经实验表明:X9313内部可滑动31次,大于31时等效31;小于零时等效为零;
/****************************/
//12864 程序
/******************************/
/*检查LCD 忙状态*/
/*lcd_busy 为1 时,忙,等待。lcd-busy 为0 时,闲,可写指令与数据。*/
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
rs = 0;
wr = 1;
lcden = 1;
delay1ms(5);
result = (bit)(P2&0x80);
lcden = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*/
/* */
/*******************************************************************/
void wr_com(uchar cmd)
17
{
while(lcd_busy());
rs = 0;
wr = 0;
lcden = 0;
_nop_();
_nop_();
P2 = cmd;
delay1ms(5);
lcden = 1;
delay1ms(5);
lcden = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。*/
/* */
/*******************************************************************/
void wr_data(uchar dat)
{
while(lcd_busy());
rs = 1;
wr = 0;
lcden = 0;
P2= dat;
delay1ms(5);
lcden = 1;
delay1ms(5);
lcden = 0;
}
void clear()
{
wr_com(0x01); //清屏
wr_com(0x34);
wr_com(0x30);
}
2.LCD控制程序:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Delay4us(){_nop_();_nop_();_nop_();_nop_();}
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_EN=P2^7;
sbit SCL=P2^0; //I2C时钟引脚
sbit SDA=P2^1; //I2C数据输入输出引脚
uchar Recv_Buffer[4]; //数据接收缓冲
uint Voltage[]={'0','0','0','0'}; //数据分解为电压x.xx
bit bdata IIC_ERROR; //I2C错误标志位
uchar LCD_Line_1[]={" . W "};
//延时
void delay(int ms)
{
uchar i;
while(ms--) for(i=0;i<250;i++) Delay4us();
}
//LCD忙检测
bit LCD_Busy_Check()
{
bit Result;
LCD_RS=0;LCD_RW=1;
LCD_EN=1;Delay4us();Result=(bit)(P0&0x80);
LCD_EN=0;
return Result;
}
//写指令
void LCD_Write_Command(uchar cmd)
{
while(LCD_Busy_Check());
LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();
P0=cmd;Delay4us();
LCD_EN=1;Delay4us();LCD_EN=0;
}
// 写数据
void LCD_Write_Data(uchar dat)
{
while(LCD_Busy_Check());
LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;Delay4us();
LCD_EN=1;Delay4us();LCD_EN=0;
}
//初始化
void LCD_Initialise()
{
LCD_Write_Command(0x38);delay(5);
LCD_Write_Command(0x0c);delay(5);
LCD_Write_Command(0x06);delay(5);
LCD_Write_Command(0x01);delay(5);
}
//设置显示位置
void LCD_Set_Position(uchar pos)
{
LCD_Write_Command(pos|0x80);
}
//显示一行
void LCD_Display_A_Line(uchar Line_Addr,uchar s[])
{
uchar i;
LCD_Set_Position(Line_Addr);
for(i=0;i<16;i++)LCD_Write_Data(s[i]);
}
// 将模数转换后得到的值分解存入缓存
void Convert_To_Voltage(uchar val)
{
uchar Tmp; //最大值为255,对应5V,255/5=51
Voltage[2]=val/51+'0'; //整数部分
Tmp=val%51*10; // 第一位小数
Voltage[1]=Tmp/51+'0';
Tmp=Tmp%51*10;
Voltage[0]=Tmp/51+'0';
}
//启动I2C总线
void IIC_Start()
{
SDA=1;SCL=1;Delay4us();SDA=0;Delay4us();SCL=0;
}
//停止I2C总线
void IIC_Stop()
{
SDA=0;SCL=1;Delay4us();SDA=1; Delay4us();SCL=0;
}
// 从机发送应答位
void Slave_ACK()
{
SDA=0;SCL=1;Delay4us();SCL=0;SDA=1;
}
// 从机发送非应答位
void Slave_NOACK()
{
SDA=1;SCL=1;Delay4us();SCL=0;SDA=0;
}
//发送一字节
void IIC_SendByte(uchar wd)
{
uchar i;
for(i=0;i<8;i++) //循环移入8位
{
SDA=(bit)(wd&0x80);_nop_();_nop_();
SCL=1;Delay4us();SCL=0;wd<<=1;
}
Delay4us();
SDA=1; //释放总线并准备读取应答
SCL=1;
Delay4us();
IIC_ERROR=SDA; //IIC_ERROR=1表示无应答
SCL=0;
Delay4us();
}
//接收一字节
uchar IIC_ReceiveByte()
{
uchar i,rd=0x00;
for(i=0;i<8;i++)
{
SCL=1;rd<<=1;rd|=SDA;Delay4us();SCL=0;Delay4us();
}
SCL=0;Delay4us();
return rd;
}
//连续读入4路通道的A/D转换结果并保存到Recv_Buffer
void ADC_PCF8591(uchar CtrlByte)
{
uchar i;
IIC_Start();
IIC_SendByte(0x90); // 发送写地址
if(IIC_ERROR==1)return;
// IIC_SendByte(CtrlByte); //发送控制字节
//if(IIC_ERROR==1)return;
IIC_Start(); //重新发送开始命令
IIC_SendByte(0x91); // 发送读地址
if(IIC_ERROR==1)return;
IIC_ReceiveByte(); //空读一次,调整读顺序
Slave_ACK(); //收到一字节后发送一个应答位
for(i=0;i<4;i++)
{
Recv_Buffer[i++]=IIC_ReceiveByte();
Slave_ACK(); //收到一个字节后发送一个应答位
}
Slave_NOACK();
IIC_Stop(); //收到一个字节后发送一个非应答位
}
// 向 PCF8591发送1字节进行AD转换
//主程序
void main()
{
LCD_Initialise();
while(1)
{
ADC_PCF8591(0x04);
Convert_To_Voltage(Recv_Buffer[0]);
LCD_Line_1[2]=Voltage[2];
LCD_Line_1[4]=Voltage[1];
LCD_Line_1[5]=Voltage[0];
LCD_Display_A_Line(0x00, LCD_Line_1);
}
附录5:完整的测试结果
1.在信号源的幅度和频率固定为某一值时,显示的输出功率 (PS ) 与设
定功率 (Pg ) 的相对误差|(Ps-Pg)|/Pg<2.977%;
2.在输入交流短路
展开阅读全文