程控宽带放大器的设计论文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

系主任(或责任教师)签名:年月日
摘要
本设计由直流稳压电源、前置放大电路单元、增益控制部分、功率放大部分、单片机自动增益控制部分几个模块构成。

输入部分采用高速电压反馈型运放OPA690作跟随器提高输入阻抗,并且在不影响性能的条件下给输入部分加了保护电路。

使用了多种抗干扰措施以减少噪声并抑制高频自激。

同时利用可变增益宽带放大器VCA821来提高增益和扩大AGC控制范围,通过软件补偿减小增益调节的步进间隔和提高准确度。

功率输出部分采用分立元件制作,提高了负载阻值以及输出有效值。

控制部分由MSP430系列单片机、A/D和D/A组成。

整个系统通频带为1kHz~20MHz,最小增益0dB,最大增益80dB。

增益步进1dB,60dB以下预置增益与实际增益误差小于0.2dB。

不失真输出电压有效值达9.5V,输出4.5~5.5V 时AGC控制范围为66dB,应用单片机和数字信号处理技术对增益进行预置和控制,AGC稳定性好,可控范围大,完成了设计的所有基本要求并做适当的发挥,使设计更完善。

关键词:程控;宽带;自动增益控制;AD603;AGC
目录
目录
摘要 (2)
目录 (3)
1、方案比较与论证 (5)
1.1 前级放大模块部分 (5)
1.2 可控增益放大器部分 (5)
1.3 功率输出部分 (8)
1.4测量有效值部分 (8)
2、具体系统设计 (9)
2.1总体设计思路 (9)
2.2系统各模块电路的设计与分析 (10)
2.2.1直流稳压电源 (10)
2.2.2前置放大电路单元 (12)
2.2.3 增益控制部分 (12)
2.2.4功率放大部分 (14)
2.2.5自动增益控制(AGC) (14)
3、理论分析与参数计算 (15)
3.1 增益分配的计算 (15)
3.2 AGC介绍 (15)
3.3正弦电压有效值的计算 (15)
4、程序设计部分 (16)
4.1、程序功能描述与设计思路 (16)
4.2、程序流程图 (16)
5、抗干扰措施分析 (17)
6、实验结果 (18)
7、误差分析及性能总结 (19)
7.1 误差分析 (19)
7.2 性能总结 (20)
8、心得与体会 (20)
参考文献 (21)
附录一整体电路图 (22)
附录二整体实物图 (22)
附录三MSP430F5438主程序 (22)
本科生课程设计成绩评定表.................................................................................. 错误!未定义书签。

1、方案比较与论证
1.1 前级放大模块部分
方案一:使用分立元件搭建共基级放大器。

在三极管搭建的三大放大电路中,共基极放大器有电压增益大、电流增益小、输出电阻小、适合于高频工作等特点。

但由于题目中要求的频率范围较大,故对于放大三极管型号的选择以及电路的搭建布线等都要求较大,实行起来比较困难。

方案二:使用THS3092芯片搭建同相放大电路。

THS3092是TI公司生产的一款电流反馈型放大器。

电流反馈型放大器较常见的电压反馈型放大器相比,具有更好的频率特性,没有固定的贷款增益积,在高频电路中对波形的失真较小。

该芯片的噪音小,带宽高,适合于前级的小信号放大。

方案三:使用OPA846或OPA847芯片,这两种芯片性能相近,都是具有超低输入电压电流噪声,超高增益带宽带积的芯片,OPA846在放大10倍的情况下,有400MHz的带宽,而OPA847具有3.9GHz的增益带宽积,且两种芯片的输入电压噪声也极低,能有效压制噪声。

经实践,我们发现OPA846具有0.85nV的噪声电压,同时增益带宽积为3.9GHz,适合高倍数放大,满足题目要求。

为追求更高指标,选用OPA847,所以采用方案3.
1.2 可控增益放大器部分
方案一:简单的放大电路可以由三极管搭接的放大电路实现,图1为分立元件放大器电路图。

为了满足增益40dB的要求,可以采用多级放大电路实现。

对电路输出用二极管检波产生反馈电压调节前级电路实现自动增益的调节。

本方案由于大量采用分立元件,如三极管等,电路比较复杂,工作点难于调整,尤其增益的定量调节非常困难。

此外,由于采用多级放大,电路稳定性差,容易产生自激现象。

图1 分立元件放大器电路图
方案二:原理框图如图2所示,场效应管工作在可变电阻区,输出信号取自电阻与场效应管与对V’的分压。

采用场效应管作AGC控制可以达到很高的频率和很低的噪声,但温度、电源等的漂移将会引起分压比的变化,用这种方案很难实现增益的精确控制和长时间稳定。

图 2 场效应管放大器电路图
方案三:为了易于实现最大40dB增益的调节,可以采用D/A芯片AD7520的电阻权网络改变反馈电压进而控制电路增益。

又考虑到AD7520是一种廉价型的10位D/A转换芯片,其输出Vout=Dn×Vref/210,其中Dn为10位数字量输入的二进制值,可满足210=1024挡增益调节,满足题目的精度要求。

它由CMOS电流开关和梯形电阻网络构成,具有结构简单、精确度高、体积小、控制方便、外围布线简化
等特点,故可以采用AD7520来实现信号的程控衰减。

但由于AD7520对输入参考电压Vref有一定幅度要求,为使输入信号在mV~V每一数量级都有较精确的增益,最好使信号在到达AD7520前经过一个适应性的幅度放大调整,再通过AD7520衰减后进行相应的后级放大,并使前后级增益积为1024,与AD7520的衰减分母抵消,即可实现程控放大。

但AD7520对输入范围有要求,具体实现起来比较复杂,而且转化非线性误差大,带宽只有几kHz,不能满足频带要求。

方案四:使用控制电压与增益成线性关系的可编程增益放大器PGA,用控制电压和增益(dB)成线性关系的可变增益放大器来实现增益控制(如图3)。

根据题目对放大电路的增益可控的要求,考虑直接选取可调增益的运放实现,如AD603、VCA821。

其内部由R-2R梯形电阻网络和固定增益放大器构成,加在其梯型网络输入端的信号经衰减后,由固定增益放大器输出,衰减量是由加在增益控制接口的参考电压决定;而这个参考电压可通过单片机进行运算并控制D/A芯片输出控制电压得来,从而实现较精确的数控。

此外VCA821能提供由直流到30MHz以上的工作带宽,单级实际工作时可提供超过20dB的增益,两级级联后即可得到40dB 以上的增益,通过后级放大器放大输出,在高频时也可提供超过60dB的增益。

这种方法的优点是电路集成度高、条理较清晰、控制方便、易于数字化用单片机处理。

图 3 可变增益的运放放大器电路图
综上所述,选用方案四,采用集成可变增益放大器VCA821作增益控制。

VCA821是一款低噪声、精密控制的可变增益放大器,温度稳定性高,最大增益误差为
0.5dB ,满足题目要求的精度,其增益(dB )与控制电压(V )成线性关系,因此可以很方便地使用D/A 输出电压控制放大器的增益。

1.3 功率输出部分 VCA821构成的放大电路,可对不同大小的输入信号进行前级放大。

由于AD603的最大输出电压较小,不能满足题目要求,所以前级放大信号需经过后级放大达到更高的输出有效值。

方案一:使用集成电路芯片。

使用集成电路芯片电路简单、使用方便、性能稳定、有详细的文档说明。

可是题目要求输出3V 以上有效值,而在电子市场很难买到这样的芯片,而我们买到的如AD811,HA-2539,THS3091等芯片,虽然输出电压幅度能满足要求,但是很容易发生工作不稳定的情况。

方案二:使用分立元件自行搭建后级放大器。

使用分立元件设计困难
,调试繁琐,可是却可以经过计算得到最合适的输入输出阻抗、放大倍数等参数,电阻电容可根据需要更换,在此时看来较集成电路灵活。

因此自行设计后级放大器优势就很明显了。

由于THS3091芯片的带宽大,压摆率高,比较适合于组成最后一级较大信号的放大工作。

因此,我们采用方案一。

1.4测量有效值部分
单的整流滤波电路和单片机就可以完成交流信号有效值的测量。

但此方法对非正弦波的测量会引起较大的误差。

方案三:采用集成真有效值变换芯片,直接输出被测信号的真有效值。

这样可以实现对任意波形的有效值测量。

综上所述,采用方案三,变换芯片选用AD637。

AD637是真有效值变换芯片,它可测量的信号有效值可高达7V,精度优于0.5%,且外围元件少,频带宽,对于一个有效值为1V的信号,它的3dB带宽为8MHz,并且可以对输入信号的电平以dB形式指示,该方案硬件、软件简单,精度也很高,但不适用于高于8MHz的信号。

此方案硬件易实现,并且8MHz以下时候测得的有效值的精度可以保证,在题目要求的通频带10kHz~6MHz内精度较高。

2、具体系统设计
2.1总体设计思路
根据题目的要求,结合考虑过的各种方案,充分利用模拟和数字系统各自的优点,发挥其优势,采用单片机预置和控制放大器增益的方法,大大提高了系统的精度和可控性;后级放大器使用由分立元件设计的推挽互补输出放大器,提高了输出电压有效值,使信号都在单片机的数字算法控制下得到最合理的前级放大,使其放大倍数精确。

下图所示即为本系统原理框图。

输入信号通过前级可控增益放大,放大倍数由单片机通过D/A转换提供的电压控制。

VCA821的Vg控制增益变化,经过前级放大后的信号最后经过后级放大得到需要的输出信号,前级和后级增益的搭配, ,都是经过精确的测量和计算的。

输出电压经有效值检测电路得到,反馈到单片机,经DA输出Vg控制增益的变化。

图 4 系统原理框图
2.2系统各模块电路的设计与分析
2.2.1直流稳压电源
本电源采用桥式全波整流、大电容滤波、三端稳压器件稳压的方法,产生各种直流电压。

正负15V,正负5V等都可以买到相应的固定输出的三端稳压芯片,如LM7815、LM7805。

所以我们采用LM317T可变输出的稳压芯片,典型电路图如图5。

图 5 直流稳压电源
交流输入经过电容滤波后的稳定的直流电送到三端稳压集成电路LM317T的Vin端。

LM317T是这样工作的:由Vin端给它提供工作电压以后,它便可以保持其+Vout端比其ADJ端的电压高1.25V。

因此,我们只需用极小的电流来调整ADJ端的电压,便可在+Vout端得到比较大的电流输出,并且电压比ADJ端高出恒定的1.25V。

在LM317T的ADJ端加一个接地的滤波电容,会使纹波抑制比大幅度地提高,给高频小信号运算放大器提供非常稳定的电源。

二极管的作用是当有意外情况使得LM317T的输入电压比输出电压还低的时候防止从输入端上有电流倒灌入
LM317T引起其损坏。

2.2.2前置放大电路单元
图6 前级放大电路图
图6为前级放大电路,由于VCA821的输入电阻只有100Ω,要满足输入电阻大于1kΩ的要求,必须加入输入缓冲部分用以提高输入阻抗;另外前级电路对整个电路的噪声影响非常大,必须尽量减少噪声。

故采用高速低噪声电压反馈型运放OPA847作前级放大电路,同时在电源端加上二极管进行防短接保护。

输入部分先用电阻分压衰减,再由低噪声高速运放OPA847放大,整体上还是一个跟随器。

其输入阻抗大于1kΩ。

OPA847的增益带宽积为3.9GHz,这里放大5倍。

输入输出端口P1、P2由同轴电缆连接,以防自激。

级间耦合采用电解电容并联高频瓷片电容的方法,兼顾高频和低频信号。

2.2.3 增益控制部分
增益控制部分采用多点接地和就近接地的方法避免自激,部分电容电阻采用贴片封装,使得输入级连线尽可能短。

该部分采用VCA821典型接法中增益为20dB,带宽仍可以达到320MHz,输入控制电压U的范围为0~+2V。

图7为VCA821接成最大增益20dB的典型方法。

图8为增益控制电路。

图7 VCA821增益为20dB的典型接法
图8 增益控制电路图
增益和控制电压的关系如下图,控制电压为2V时,增益为20 dB,增益范围是-10~+20dB,满足题目要求。

由于程控放大电路最大增益只有20dB,所以末级功率放大需要2倍,由于要保证在20kHz~5MHz频带内增益起伏<1dB,所以将VCA821的增益模式设置为20dB,这样保证在6MHz范围内的平坦度很好。

图9 增益和控制电压的关系图
2.2.4功率放大部分
图10 末级功率放大电路图
末级采用一级THS3091作为功率放大,它是电流反馈放大电路,其优点是电路带宽受增益的影响较小,可以在放大的同时,满足带宽要求,带宽主要受反馈电阻的影响,因此我们根据芯片手册上的电路对其外围电路进行设计,虽然其推荐电压是±15V,但考虑到系统的噪声及供电,采用可行的±5V对其供电,使其THS3091的通频带较高。

经过几次尝试,选择增益为10倍,带宽超出100MHz,且带内平坦度好,能够满足题目的带负载能力,图为末级THS3091放大电路图。

2.2.5自动增益控制(AGC)
此模块利用单片机根据输出信号幅度调节增益。

输出信号检波后经过简单2级RC滤波后由单片机采样,截止频率为100Hz。

由于放大器通频带低端在1kHz,当工作频率为1kHz时,为保证在增益变化时输出波形失真较小,将AGC响应时间设定为10ms,用单片机定时器0来产生10ms中断进行输出有效值采样,增益控制电压也经过滤波后加在可变增益放大器上。

AGC控制范围理论上可达0~80dB,
实际上由于输入端加了保护电路,在不同输出电压时AGC范围不一样,输出在4.5~5.5V时AGC范围约为70dB,而当输出为2~2.5V时AGC范围可达80dB。

这一部分由51系列单片机、A/D、D/A和基准源组成。

使用12位串行A/D芯片ADS7816和ADS7841(便于同时测量真有效值和峰值)和12位串行双D/A芯片TLV5618。

3、理论分析与参数计算
3.1 增益分配的计算
题目中要求系统增益在10~40dB可调,3dB通频带10kHz~6MHz,10mV真有效值输入时最大真有效值输出幅度大于1V。

由以上分析,该系统共分为三级。

第一级采用OPA847构建输入缓冲和前级放大电路,考虑到第二级输入大于200mV易失真,因此第一级输出信号幅度不宜过大,所以第一级放大5倍,获得13.9dB左右的增益。

第二级采用增益模式为20dB的放大电路,所以第三级末级功率放大2倍,即6.02dB的增益。

第二级程控可调范围为-10~+20dB,所以系统总增益实现了10 dB~40 dB的要求。

3.2 AGC介绍
AGC是自动增益控制电路的简称,常用在收音机、电视机、录像机的信号接收和电平处理电路中。

它的作用是当信号较强时,使其增益自动降低;当信号较弱时,又使其增益自动增高,从而保证输出信号基本稳定。

3.3正弦电压有效值的计算
AD637的内部结构如图11所示。

根据AD637芯片手册所给出的计算真有效值的经验公式为:
图 11 AD637的内部结构
4、程序设计部分
4.1、程序功能描述与设计思路
根据题目要求,软件部分主要实现键盘的设置和控制D/A输出。

(1)键盘实现功能:增益的步进调节。

(2)D/A:输入数字量,输出模拟电压值,作为压控增益放大器的输入。

4.2、程序流程图
主程序流程图如下:
图12 主程序流程图
5、抗干扰措施分析
系统总的增益为10~40dB,前级输入缓冲和增益控制部分增益最大可达33.9dB,因此抗干扰措施必须要做得很好才能避免自激和减少噪声。

我们采用下述方法减少干扰,避免自激:
(1)将输入部分和增益控制部分装在屏蔽盒中,避免级间干扰和高频自激;
(2)电源隔离,各级供电采用电感隔离,输入级和功率输出级采用隔离供电,各部分电源通过电感隔离,输入级电源靠近屏蔽盒就近接上1000μF电解电容,盒内接高频瓷片电容,通过这种方法可避免低频自激;
(3)所有信号耦合用电解电容两端并接高频瓷片电容以避免高频增益下降;
(4)构建闭路环。

在输入级,将整个运放用较粗的地线包围,可吸收高频信号减少噪声。

在增益控制部分和后级功率放大部分也都采用了此方法。

在功率级,此法可以有效地避免高频辐射;
(5)数模隔离。

数字部分和模拟部分之间除了电源隔离之外,还将各控制信号用电感隔离;
(6)使用同轴电缆,输入级和输出级使用BNC接头,输入级和功率级之间同轴电缆连接。

电路的抗干扰措施比较好,在1kHz~20MHz的通频带范围和0~80dB增益范围内都没有自激。

本系统单片机控制部分采用反馈控制方式,通过输出电压采样来控制电压增益。

由于VCA821的设定增益跟实际增益有误差,故应对软件进行校正。

6、实验结果
带宽测试:在输入峰峰值20mV正弦波的情况下(放大倍数为100)
表1 带宽测试结果
经测试得:3dB通频带5kHz~16MHz,在20kHz~7MHz频带内增益起伏<1dB。

增益测试:用单片机可以实现10~40dB可调.
图13 5MHz20mV 信号输入 图14 500KHz20mV 输入
图15 5MHz 信号输出波形 图16 500KHz 信号输出波形
7、误差分析及性能总结
7.1 误差分析 测量的误差主要来源是电磁干扰,由于试验场地有许多电脑和仪器使用开关电源,电磁噪声很大,而且使用的同轴电缆屏蔽效果并不好,所以测量输入端短路的噪声电压时随输入短接方式不同而有很大的误差。

7.2 性能总结
从指标来看本设计各方面的指标都达到或超过了题目要求。

本设计偏重于模拟电路处理,得到了很高的增益和较小的噪声。

采用多种抗干扰措施来处理前级放大,选用集成芯片作增益控制,利用分立元件作后级功率放大,放弃了较难买到的宽带功率运放,因而设计很灵活也很容易实现。

8、心得与体会
在设计过程中不免遇到各种问题,需要认真分析,排除各种问题。

首先要上网查阅资料,确定设计方案。

在这个过程中,因为只是的匮乏,芯片和电路的确定费了很大的功夫,最终在同学的帮助下,设计出了前几个模块。

接下来自动增西控制部分,由于不清楚原理,只能请老师帮忙,分析了电路并对之进行简化,到此,才最后完成模块的设计。

接下来,为了达到或超过了题目要求,还对芯片的各参数进行深入的了解,精确的计算,过程很复杂。

由于以前实习的时候学习用过Altium Designer 10,但由于长时间没有用,所以很生疏,致使电路图画的很慢,出现的两次返工,在这么紧张的时间里,是很让人郁闷的一件事情。

最后通过阅读参考资料,上网搜索等,才完成了电路图的绘制。

经过两个星期的忙碌和工作,本次课程设计已经接近尾声,作为一名本科生,由于经验和知识的匮乏,难免有许多考虑不周全的地方。

但是通过课程设计,使我掌握了程控宽带放大器基本原理和组成,巩固了通信电子电路与单片机控制知识,掌控了知识在实际中的应用,提高了对电路分析与设计能力。

同时我深深的感觉到自己知识的不足,自己原来所学的东西只是一个表面性的,理论性的,而且是理想化的。

根本不知道在现实中还存在有很多问题。

设计电路,还要考虑到它的前因后果。

什么功能需要什么电路来实现。

另外,还要考虑它的可行性,实用性等等。

这样,也提高了我的分析问题的能力。

通过这次设计,使我的理论知识上升到了一个实践的过程,同时在实践中也加深了我们对理论知识的理解以及软件的应用能力。

参考文献
[1]傅越千.程控放大器的设计与应用[J].宁波高等专科学校学报,2013
[2]房慧龙.程控放大器的实现方法[J].常州信息职业技术学院电子信息工程系.2013
[3]邵雄凯,张文灿,黄文斌.一种程控放大器的分析与实现[J].湖北工学院学报,2014
[4]吴建平,李建强.数字程控放大器设计与应用[J].成都理工学院报,2015
[5]余锡存,曹国华编著.单片机原理及接口技术[M].西安:西安电子科技大学出版社,2013
附录一整体电路图
附录二整体实物图
附录三MSP430F5438主程序#include "msp430x54xA.h"
#include <string.h>
#include <stdio.h>
#include "main.h"
#include <math.h>
#include "keyboard.h"
unsigned char tx_char;
volatile unsigned char p_tx_flag = 1;
#define SCLK_UP P2OUT |= BIT0
#define SCLK_DOWN P2OUT &= ~BIT0
#define SYNC_UP P2OUT |= BIT1
#define SYNC_DOWN P2OUT &= ~BIT1
#define SDIN_UP P2OUT |= BIT2
#define SDIN_DOWN P2OUT &= ~BIT2
char DA_ON[4]={0,0,0,1};
char DA_OFF[4]={0,0,0,0};
char DA_baochi[4]={0,0,1,1};
#define uint unsigned int // 定义数据类型缩写
#define uchar unsigned char
#define DDRD PADIR
#define PORTD PAOUT
#define PIND PAIN
void main(void)
{
volatile int ADC_Result;
float vol_ch1;
char vol[30] = {0};
char key_down = 0;
unsigned char key_end[4] = {0};
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
P2DIR |= (BIT0+BIT1+BIT2);//P2OUT=0XFF;
settime();
tx_inti_main();
ADS1118_GPIO_Init();
ADS1118_SPI_Init();
Keyboard_Init();
key_end[0] = '0';
key_end[1] = '\r';
__bis_SR_register(GIE); // Enter LPM3 w/ interrupts enabled
send_string("realy\r\n");
write_da7811(1725);
write_da7811(1725);
write_da7811(1725);
while(1)
{
ADS1118_ADS_Config(0xC3E3); //Only Select AIN1,860SPS,+-4.096V scan voltage range;
ADC_Result = ADS1118_ADS_Read(); // Read data from ch1,the last time result
vol_ch1 = ADC_Result*0.125;
sprintf(vol,"it %dmV\r\n",(int)vol_ch1);
send_string(vol);
memset(vol,0,30);
KeyScan();
key_down = KeyDriver();
average_120(key_down, vol_ch1);
if(key_down != 0){
send_string("num is ");
key_end[0] = key_down;
key_end[2] = 0;
key_end[3] = 0;
send_string(key_end);
}
__delay_cycles(10000);
}
}
void tx_inti_main(void)
{
P3SEL |= BIT4+BIT5; // P3.4,5 UART option select UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL__SMCLK; // CLK = ACLK UCA0BR0 = 130; // 32k/9600 - 3.41
UCA0BR1 = 0x00; //
UCA0MCTL = UCBRS_0 + UCBRF_3 + UCOS16; // Modln UCBRSx=0, UCBRFx=0,
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCTXIE + UCRXIE; // Enable USCI_A0 TX/RX interrupt
// __delay_cycles(20);
}
void send_string(unsigned char *string){
int count = 0;
do{
UCA0TXBUF = *string;
while ((!(UCA0IFG&UCTXIFG))&& (count < 10000))count++; // USCI_A0 TX buffer ready?
count = 0;
}while(*string++);
}
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(UCA0IV,4))
{
case 0: break; // Vector 0 - no interrupt
case 2: while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character // Vector 2 - RXIFG break;
case 4: // Vector 4 - TXIFG
break;
default: break;
}
}
void SetVcoreUp (unsigned int level)
{
// Open PMM registers for write
PMMCTL0_H = PMMPW_H;
// Set SVS/SVM high side new level
SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level; // Set SVM low side to new level
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
// Wait till SVM is settled
while ((PMMIFG & SVSMLDLYIFG) == 0);
// Clear already set flags
PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
// Set VCore to new level
PMMCTL0_L = PMMCOREV0 * level;
// Wait till new level reached
if ((PMMIFG & SVMLIFG))
while ((PMMIFG & SVMLVLRIFG) == 0);
// Set SVS/SVM low side to new level
SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
// Lock PMM registers for write access
PMMCTL0_H = 0x00;
}
void settime(){
SetVcoreUp(PMMCOREV_1);
SetVcoreUp(PMMCOREV_2); // Set VCore to 1.8MHz for 20MHz
P11DIR = BIT1+BIT2; // P11.1-2 to output direction P11SEL |= BIT1+BIT2; // P11.1-2 to output SMCLK,MCLK
P5SEL |= 0x0C; // Port select XT2
UCSCTL4 |= SELA__XT2CLK;
UCSCTL6 &= ~XT2OFF; // Enable XT2
UCSCTL3 |= SELREF__REFOCLK; // FLLref = REFO
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags
__delay_cycles(100000); // Delay for Osc to stabilize }while (SFRIFG1&OFIFG); // Test oscillator fault flag
UCSCTL4 = SELA_0 + SELS_5 + SELM__XT2CLK; // Select ACLK = LFXT1
}
void write_da7811(long da)
{
char i;
SCLK_UP;
SYNC_UP;
SYNC_DOWN;
for(i=0;i<4;i++)
{
SCLK_UP;
if(DA_ON[i])
SDIN_UP;
else
SDIN_DOWN;
SCLK_DOWN;
}
for (i=0;i<12;i++)
{
SCLK_UP;
if(da&0x800)
SDIN_UP;
else
SDIN_DOWN;
SCLK_DOWN;
da<<=1;
}
SYNC_UP;
SCLK_DOWN;
}
void average_120(char getkey, int vol){ static int key_num = 0;
if(getkey == '1' && (key_num < 9)){ key_num++;
DA_control(key_num);
}
if(getkey == '2' && (key_num > 0)){ key_num--;
DA_control(key_num);
}
if(getkey == '3'){
Da_auto(vol);
}
}
void DA_control(int num){
switch(num){
case 0 ://13
write_da7811(848);break;
case 1://16
write_da7811(924);break;
case 2://19
write_da7811(987);break;
case 3://22
write_da7811(1046);break;
case 4://25
write_da7811(1112);break;
case 5://28
write_da7811(1191);break;
case 6://31
write_da7811(1273);break;
case 7://34
write_da7811(1404);break;
case 8://37
write_da7811(1507);break;
case 9:
write_da7811(1725);break;
}
}
void Da_auto(int vol){
static int auto_num = 1723;
if(vol < 400){
auto_num++;
write_da7811(auto_num);
}else{
auto_num--;
write_da7811(auto_num);
}
}。

相关文档
最新文档