电设报告.docx
- 文档编号:18334335
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:13
- 大小:63KB
电设报告.docx
《电设报告.docx》由会员分享,可在线阅读,更多相关《电设报告.docx(13页珍藏版)》请在冰点文库上搜索。
电设报告
北京邮电大学
电子设计综合实验项目报告
小组成员:
阮文龙赵威
学号:
20132111402013210905
目录
项目要求3
题目3
要求3
基本要求3
发挥部分3
实现思路4
放大4
频率4
A/D:
6
显示:
6
代码7
主程序:
7
lcd头文件10
项目要求
题目要求:
制作一个放大电路,进行A/D后,利用给定的MCU:
msp430g2553,
单片机采集数据,显示相关参数
.
基本要求:
一、用给定运放LM324制作两级放大器
a)增益大于:
40dB
b)带宽大于:
20KHz
c)输入阻抗大于:
100KΩ
d)输入电压信号范围(峰峰值)小于:
10mV
e)测量10-1000Hz方波、三角波、正弦波等信号参数:
峰峰值、有效值、频率;测量精度,误差≤±5%
发挥部分:
a)进一步提高精度
b)使用单电源供电
c)使用LCD显示
实现思路
放大:
首先分析题目要求,要实现放大40dB,频率10~100KHz的信号,通过公式20lg(Ad)得出Ad=10,即放大100倍
必须使用运放lm324实现,则需要知道该芯片的器件参数,即增益带宽积。
通过数据手册得知其增益带宽积为6.4MHz,除去放大倍数得知能够实现该信号的放大,通过设计放大电路并焊接即可,放大电路为同向比例放大电路,见Figure1
Figure1
频率:
这次的题目我采用的是用时钟计数的方式,msp430g2553中含有2个时钟,timer0和timer1,每个时钟都有如下功能,选择时钟来源:
1、外部时钟(即外部输入的方波信号)2、ACLK3、smclk等。
其中ACLK为外部所焊晶振,频率为32768Hz。
由上述条件我使用timer0和timer1同时工作来进行频率的测量,首先外部晶振属于手表晶振,极易产生1s中断,我首先用timer1产生1s中断,再用timer0选择使用外部时钟源计数,也就是需要被我们计数的信号输入,这样每一次上升沿,timer0计数器就会加一。
这样每秒中断读取timer0中寄存器的值就可以得出精确度极高的频率,甚至都不需要换算。
此种方案简便易于实现,故选用。
流程图:
Figure2
A/D:
本题发挥部分要求采集正弦信号的峰值,所以涉及A/D转换部分,由于输入信号频率在10Hz~100KHz,由于采样定理,采样频率必须为被采样信号的两倍,虽然实际中最好为十倍,我们最后还是采用了两倍。
Msp430g2553此款芯片A/D采集过程若要稳定起码需要30个时钟,我的A/D模块选用时钟源smclk,其频率为8MHz,则8MHz除去30约为267KHz,其大于100KHz的两倍,基本满足要求,在之前采集频率的过程中我们有产生一个1s中断,A/D平常每采集一次便把采集的值与最大值比较,把最大值留下,1s选取一次最大值显示,并把之前的最大值清除。
显示:
显示我们采用LCD1602,采用四条数据线,三条控制线,在保证MCU引脚够用的前提下进行显示。
代码
主程序:
/*警告:
由于G2LaunchPad上的LED2使用了P1.6(I2C引脚),所以所有涉及到I2C的实验都必须把P1.6跳线拔除,包含本例程!
*main.c
*/
#include
#include"LCD_128.h"
#include"HT1621.h"
#include"TCA6416A.h"
longtemp;
longIntDeg;
longIntDeg1;
longmax=0;
inti;
intj=0;
intflag=0;
longadcdata=0;
longadce=0;
voidADC10_ISR(void);
voidADC10_init(void);
voidmain()
{
WDTCTL=WDTPW+WDTHOLD;
//-----配合机械按键,启用内部上拉电阻-----
P1REN|=BIT3;//启用P1.3内部上下拉电阻
P1OUT|=BIT3;//将电阻设置为上拉
//-----配置P1.3中断参数-----
P1DIR&=~BIT3;//P1.3设为输入(可省略)
P1IES|=BIT3;//P1.3设为下降沿中断
P1IE|=BIT3;//允许P1.3中断
ADC10_init();
while
(1)
{
ADC10CTL0|=ENC+ADC10SC;//Samplingandconversionstart
//_bis_SR_register(CPUOFF+GIE);//LPM0withinterruptsenabled
__delay_cycles
(1);
//-----ADC转换完成中断唤醒CPU后才执行以下代码-----
temp=ADC10MEM;//读取AD采样值
IntDeg1=temp*3000/1023;//转换为摄氏度,并10倍处理
if(max max=IntDeg1; } if(i<1023){ if(IntDeg1<0)IntDeg1=-IntDeg1; adcdata+=IntDeg1; i++; } else{ adce=adcdata/1024; i=0; if(flag==0) { IntDeg=max; } elseIntDeg=adce; max=0;adcdata=0; } //IntDeg=-123;//由于难以获得负温,直接给负值以测试LCD显示 //LCD_Display();//调用LCD显示函数 } } /****************************************************************************************************** *名称: ADC10_init(void) *功能: 初始化ADC10采集内部温度传感器,单次手动采样 *入口参数: 无 *出口参数: 无 *说明: 直接从CCS的Example中移植过来 *范例: 无 ******************************************************************************************************/ voidADC10_init(void) { ADC10CTL0&=~ENC; ADC10CTL0=ADC10IE+ADC10ON+REFON+ADC10SHT_3+SREF_1; ADC10CTL1=CONSEQ_0+ADC10SSEL_0+ADC10DIV_3+SHS_0+INCH_5; __delay_cycles(30000); ADC10CTL0|=ENC; } /****************************************************************************************************** *名称: ADC10_ISR_HOOK *功能: ADC转换完成后唤醒CPU *入口参数: 无 *出口参数: 无 *说明: 直接从CCS的Example中移植过来 *范例: 无 ******************************************************************************************************/ #pragmavector=ADC10_VECTOR __interruptvoidADC10_ISR_HOOK(void) { _bic_SR_register_on_exit(LPM4_bits); } /* voidTimer0A0_Init(void) {//SetupTA0CCR0 TA0CCTL0=CAP+CM_1+CCIS_0+SCS+CCIE;//上升沿捕获,同步模式 TA0CTL=TASSEL_2+MC_2+TAIE+TACLR;//smCLK,连续模式,开中断,clearTAR //TA0CCTL0=~CCIE;//关中断,单步调试时用,不然一直在中断里 j++; } */ #pragmavector=PORT1_VECTOR __interruptvoidPORT1_ISR(void) { //-----启用Port1事件检测函数----- unsignedintPush_Key=0; //-----排除输出IO的干扰后,锁定唯一被触发的中断标志位----- Push_Key=P1IFG&(~P1DIR); //-----延时一段时间,避开机械抖动区域----- __delay_cycles(10000);//消抖延时 //----判断按键状态是否与延时前一致----- if((P1IN&Push_Key)==0)//如果该次按键确实有效 { if(flag! =2){flag++;} elseflag=0; }//检测通过,则会调用事件处理函数 P1IFG=0;//退出中断前必须手动清除IO口中断标志 } voidLCD_Init() { TCA6416A_Init(); HT1621_init(); //-----显示固定不变的LCD段----- LCD_DisplaySeg(_LCD_TI_logo); LCD_DisplaySeg(_LCD_QDU_logo); LCD_DisplaySeg(_LCD_DOT1);//温度小数点 /* //-----减法构造“o”----- LCD_DisplayDigit(9,5); LCD_ClearSeg(_LCD_5D); LCD_ClearSeg(_LCD_5C); //-----减法构造“C”----- LCD_DisplayDigit(0,6); LCD_ClearSeg(_LCD_6B); LCD_ClearSeg(_LCD_6C); */ } /****************************************************************************************************** *名称: LCD_Displaly() *功能: 将温度值显示出来 *入口参数: 无 *出口参数: 无 *说明: 包括对负温度的处理、拆分数字等几部分 *范例: 无 ******************************************************************************************************/ voidLCD_Display() { if(IntDeg>=0)LCD_ClearSeg(_LCD_1G);//正温度,则清除负号 else { IntDeg=-IntDeg;//负温度,则做绝对值处理 LCD_DisplaySeg(_LCD_1G);//负温度,添加负号 } //-----清除3位显示数字----- LCD_DisplayDigit(LCD_DIGIT_CLEAR,1); LCD_DisplayDigit(LCD_DIGIT_CLEAR,2); LCD_DisplayDigit(LCD_DIGIT_CLEAR,3); LCD_DisplayDigit(LCD_DIGIT_CLEAR,4); //-----拆分3位并显示数字----- LCD_DisplayDigit(IntDeg/1000,1); LCD_DisplayDigit((IntDeg%1000)/100,2); LCD_DisplayDigit((IntDeg%100)/10,3); LCD_DisplayDigit(IntDeg%10,4); //-----更新缓存,真正显示----- HT1621_Reflash(LCD_Buffer); } #pragmavector=TIMER0_A0_VECTOR __interruptvoidTIMER0_A0_ISR(void) { if(TA0CCTL0&COV) { TA0CCTL0&=~COV; } if(TA0CCTL0&CM0)//如果是上升沿的捕获中断 { PrevCapVal=TA0CCR0;//保存上升沿时刻捕获值 TA0CCTL0=CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿触发 } elseif(TA0CCTL0&CM1)//如果是下降沿的捕获中断 { Period=TA0CCR0-PrevCapVal;//计算 PrevCapVal=TA0CCR0; TA0CCTL0=CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿触发 } } //************************************************************************* voidTimer0A0_Init(void) {//SetupTA0CCR0 TA0CCTL0=CAP+CM_1+CCIS_0+SCS+CCIE;//上升沿捕获,同步模式 TA0CTL=TASSEL_2+MC_2+TAIE+TACLR;//smCLK,连续模式,开中断,clearTAR //TA0CCTL0=~CCIE;//关中断,单步调试时用,不然一直在中断里 } //Timer1_A0interruptserviceroutine,50mstimer #pragmavector=TIMER1_A0_VECTOR __interruptvoidTIMER1_A0_ISR(void) { LPM0_EXIT; } voidTimer1A0_Init(void) {//SetupTA0 TA1CCTL0=CCIE;//CCR0interruptenabled TA1CCR0=1637;//50mstimer TA1CTL=TASSEL_1+MC_1+TACLR;//ACLK,upmode,clearTAR //TA0CCTL0=~CCIE;//关中断,单步调试时用,不然一直在中断里 }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 报告