红外通信装置通信工程课程设计报告.docx
《红外通信装置通信工程课程设计报告.docx》由会员分享,可在线阅读,更多相关《红外通信装置通信工程课程设计报告.docx(16页珍藏版)》请在冰点文库上搜索。
![红外通信装置通信工程课程设计报告.docx](https://file1.bingdoc.com/fileroot1/2023-7/6/f6de519f-ffb2-47d1-b5c7-9731d9fc163d/f6de519f-ffb2-47d1-b5c7-9731d9fc163d1.gif)
红外通信装置通信工程课程设计报告
专业技能实训报告
题目制作简易红外通信装置
学院信息科学与工程学院
专业通信工程
班级
学生
学号
指导教师
二〇一四年一月六日
1前言
1.1系统设计简要说明
随着社会的发展、科技的进步以及人们生活水平的逐步提高,各种方便于生活的遥控系统开始进入了人们的生活。
传统的遥控器采用专用的遥控编码及解码集成电路,这种方法虽然制作简单、容易,但由于功能键数及功能受到特定的限制,只实用于某一专用电器产品的应用,应用范围受到限制。
而采用单片机进行遥控系统的应用设计,具有编程灵活多样、操作码个数可随便设定等优点。
本系统设计红外光通信装置,主要由前置电路模块、脉宽调制模块、红外发送接收模块、中级转发模块和语音输出模块五部分组成。
采用STM32作为主控制器进行A/D采集,脉宽调制,并控制数据传送,LM358主要作为前置电路放大器,18B20芯片感应环境温度,LM386模块进行功率放大。
系统设计基本上实现了红外光通信,完成了语音信号传输的功能。
STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M3内核。
按性能分成两个不同的系列:
STM32F103“增强型”系列和STM32F101“基本型”系列。
增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是16位产品用户的最佳选择。
两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。
时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
DS18B20,常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。
2系统方案
2.1方案比较与选择
2.1.1语音采集模块
方案一:
采用驻极体麦克风,由于驻极体麦克风体积小、频率范围宽和价格优势的特点而广泛应用于各种声控电路中。
并且输入和输出阻抗很高,所以要在这种话筒外壳内设置一个场效应管作为阻抗转换器,为此驻极体电容式话筒在工作时需要直流工作电压。
方案二:
采用硅微麦克风,硅微麦克风基于CMOSMEMS技术,体积更小。
其一致性优于驻极体麦克风,所以MEMS麦克风特别适合高性价比的麦克风阵列应用。
但硅微麦克风是一个新兴的朝阳产业,尚在发展,价格比较高。
综合比较,选择方案一。
2.1.2运算放大模块
方案一:
LM358是内部有两个独立的、频率补偿的双运算放大器,能在很宽的电源电压范围内实现高增益,同时适用于单、双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。
方案二:
OP07芯片是一种双极性运算放大器,具有输入偏置电流低和开环增益高的特点,因为具有非常低的输入失调电压,不需要额外的调零措施,但OP07用单电源供电放大倍数太小,不方便使用。
综合比较,基于单电源供电和经济考虑,选择方案一。
2.1.3脉宽调制模块
方案一:
采用KA7500B芯片。
KA7500内含两个PWM控制器,其输出端可以接成共发射极和射极跟随器两种形式,可以选择双端推挽输出或者单端推挽输出,但控制复杂,存在死角问题,且价格较高。
方案二:
采用STM32来编程实现脉宽调制,利用定时器将模拟信号抽样转化成数字信号。
STM32有实时响应中断及中断优先级系统,具有低电压和低功耗两大优点,适合对红外收发的控制。
综合比较,选择方案二。
2.1.4语音输出模块
方案一:
使用LM1875进行功率放大,LM1875使用20~60V供电,驱动4欧或8欧的负载,具有低失真度和高品质性能,主要用于单声道40W高保真放大电路,内部具有欠压、过压、短路、热失控、瞬时音响峰值保护电路等诸多优点,因此在使用过程中不易损坏。
但由于供电需求太高,电路设计达不到要求,不方便使用。
方案二:
使用LM386对音频信号进行功率放大,LM386是专为低损耗电源所设计的功率放大器集成电路,其增益最高可达200,且失真低,适合应用于本音频功放模块。
综合比较,选择方案二。
2.1.5温度传感模块
方案一:
采用AD590模拟数字传感器,特别适合远程检测应用,其输出电流与绝对温度成比例,适用于150度以下温度的测量,由于模拟信号传入微处理器中还需进行模拟数字转换再处理,实现起来较为麻烦。
方案二:
采用18B20数字温度传感器来测量温度,18B20有独特的单线接口方式,与微处理器连接时仅需一条口线即可实现双向通讯,其测量范围-55℃~+125℃,符合本电路测温要求,并且单线接口方式能为微处理器节省接口。
综合比较,选择方案二。
2.2方案描述
通过驻极体麦克风将语音信号采集并转变成模拟信号输入到电路中,通过LM358运算放大器把信号放大到1~10倍之内,将信号进行偏置。
同时利用18B20测试环境温度。
利用STM32采集数据,并进行脉宽调制后通过红外发送管来传输信号,接收管收到信号后,进行放大、滤波、隔直处理,最后通过功放电路,实现语音输出。
2.3理论分析与计算
2.3.1通信原理分析
在发送电路中将语音信号通过脉宽调制模块调制成PWM波并发送,PWM波是占空比可调的脉冲波形,即将正弦波用一系列幅值相等而宽度不相等的脉冲来代替。
脉冲宽度调制内有比较器和周期锯齿波发生器,语音信号如果大于锯齿波信号,比较器输出恒定正电压值,否则输出0V。
2.3.2提高转发器效率方法
用多个二极发光管一起发送,增强了发送功率,可以利用发送功率来维持中继转发器工作,提高转发器效率。
因为话音信号大部分是小信号,将电路设计成没有话音信号时呈低电平,即消耗功率为零,也提高了转发器的效率。
3电路与程序设计
3.1总体电路图
图3.1总体电路图
3.2电路设计
3.2.1运算放大模块
拾音器将话音信号采集并输入到电路中,由于拾音器的电压信号较为微弱,需要将信号进行放大,经过LM358运算放大器的放大后,接入STM32,用一个LM358芯片作为跟随器减小后级的输出阻抗。
图3.2前置模块电路图
3.2.2红外发送接收模块
图3.3红外发送接收模块
3.2.3语音输出模块
当红外接收模块将接收到的信号进行处理后,在后级再加入一路增益为200的功率放大模块来增强语音信号,根据LM386的200增益对应的标准电路(如下图)我们最终实现了合适语音输出。
图3.4语音输出模块电路图
3.3程序设计
程序源代码见附录
图3.5程序流程图
4测试方案与测试结果
4.1测试方案
在接收装置没有静噪功能的情况下,将语音信号改为800Hz单音信号,在8Ω电阻负载上,测量接收装置的输出电压有效值;减少发射端输入信号的幅值至0V,测量此时接收装置输出端噪声电压。
4.2测试数据
在800Hz单音信号、8Ω电阻负载的条件下,测量的接收装置输出电压为0.64V。
将输入信号幅值减少至0V,测量的接收装置输出端噪声电压为0.07V。
4.3测试结果记录
在800Hz单音信号、8Ω电阻负载的条件下,测量的接收装置输出电压为0.79V,符合输出电压有效值不小于0.4V的要求;将输入信号幅值减少至0V,测量的接收装置输出端噪声电压为0.08V,符合读书不大于0.1V的要求。
因此接收的语音信号无明显失真。
5实训结语
经过这段时间不间断的努力,我终于完成了红外光通信设置的各项要求,利用红外发光管和红外光接收模式作为收发器件,进行定向的传输,接收到的声音没有明显的失真。
通过这次实训,不仅丰富了我的理论知识,而且使我的动手实践能力得到了提高,更激发了我的创新精神。
在这今后的人生道路上无疑是一笔宝贵的财富,受益匪浅。
为今后的发展打下了良好的基础。
由于自身水平有限,设计中一定存在很多不足之处,敬请各位老师批评指正。
最后感谢邦杰公司和学校老师给我锻炼的机会,这次难忘的经历必将使我受益终生。
参考文献
[1]丁元杰.单片微机原理及应用[M].北京:
机械工业出版社,2006:
15-88.
[2]蒋智勇,戴立权.单片微型计算机应用技术[M].沈阳:
辽宁科学技术出版社,1992:
36-78.
[3]张迎新等.单片微型计算机原理、应用及接口技术[M].北京:
国防工业出版社,2004:
26-86.
[4]先锋工作室.单片机程序设计实例[M].北京:
清华大学出版社,2003:
32-82.
[5]周航慈.单片机应用程序设计技术[M].北京:
北京航空航天大学出版社,1992:
45-89.
[6]陈爱文.基于89C51单片机控制的红外通信设计[J].机电工程技术,2007,36(12):
84-85.
[7]张利娜,洪显昌.红外通信的设计与实现[J].现代电子技术,2008,4(23):
87-89.
[8]王建校.51系列单片机及C51程序设计[M].北京:
科学出版社,2002:
67-83.
[9]张爱全.红外线遥控的基本原理和应用范围[M].山西电子技术.20036(12).40-41
[10]苏凯,刘国庆,陈国平.MCS-51系列单片机原理与设计[M].冶金工业出版社.2003.23~26
[11]于明鑫,冯文涛.MCS-51系列单片机存储容量扩展的软硬件设计[J].辽宁师专学报,2004.10,24:
23~35
[12]CraigTombling,MTillin.InnovationsinLCDtechnology[J].SyntheticMetals,2001,6:
209-214.
[13]Chorng-KuangWang.ADual-LoopAutomaticGainControlforInfraredCommunicationSystem[J].GraduateInstituteofElectronicsEngineering,2010,7:
126-128.
[14]NewmanWM,SbroullRF.PrinciplesofInteractiveComputerGraphics[M].NewYork:
McGrawHill,1979.10:
10-25
附录
部分源代码
Main.c
#include"stm32f10x.h"
#include"usart1.h"
#include"adc.h"
#include"Time_test.h"
u32flag;
u32f=0;
volatileu32time=0;
volatileu32time1=0;
/*ADC1转换的电压值通过MDA方式传到SRAM*/
extern__IOuint16_tADC_ConvertedValue;
/*局部变量,用于保存转换计算后的电压值*/
floatADC_ConvertedValueLocal;
/*软件延时*/
voidDelay(__IOuint32_tnCount)
{
for(;nCount!
=0;nCount--);
}
intmain(void)
{
SystemInit();
/*USART1config*/
USART1_Config();
/*enableadc1andconfigadc1todmamode*/
ADC1_Init();
/*TIM2定时配置*/
TIM2_NVIC_Configuration();
TIM2_Configuration();
TIM3_NVIC_Configuration();
/*TIM2开始计时*/
START_TIME;
STOP_TIME3;
while
(1)
{}
}
Time_test.c
#include"Time_test.h"
voidTIM2_NVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=4;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
voidTIM3_NVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*TIM_Period--1000TIM_Prescaler--71-->中断周期为125us*/
voidTIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Period=125;/*自动重装载寄存器周期的值(计数值),中断间隔125us*/
/*累计TIM_Period个频率后产生一个更新或者中断*/
TIM_TimeBaseStructure.TIM_Prescaler=(56-1);/*时钟预分频数72M/72*/
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;/*采样分频*/
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/*向上计数模式*/
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2,TIM_FLAG_Update);/*清除溢出中断标志*/
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,DISABLE);/*开启时钟*/
}
voidTIM3_Configuration(u32top)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Period=top;/*自动重装载寄存器周期的值(计数值),中断间隔125us*/
/*累计TIM_Period个频率后产生一个更新或者中断*/
TIM_TimeBaseStructure.TIM_Prescaler=26;/*时钟预分频数56M/56*/
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;/*采样分频*/
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/*向上计数模式*/
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_ClearFlag(TIM3,TIM_FLAG_Update);/*清除溢出中断标志*/
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,DISABLE);/*开启时钟*/
}
usart1.c
#include"usart1.h"
#include"misc.h"
voidUSART1_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
USART_InitTypeDefUSART_InitStructure;
/*configUSART1clock*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
/*USART1GPIOconfig*/
/*ConfigureUSART1Tx(PA.09)asalternatefunctionpush-pull*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*ConfigureUSART1Rx(PA.10)asinputfloating*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*USART1modeconfig*/
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
/*ConfiguretheNVICPreemptionPriorityBits*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/*EnabletheUSARTyInterrupt*/
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*重定向c库函数printf到USART1*/
intfputc(intch,FILE*f)
{
/*将Printf内容发往串口*/
USART_SendData(USART1,(unsignedchar)ch);
while(!
(USART1->SR&USART_FLAG_TXE));
return(ch);
}
Adc.c
voidADC1_Init(void)
{
ADC1_GPIO_Config();
ADC1_Mode_Config();
}
SysTick.c
#include"SysTick.h"
static__IOu32TimingDelay;
/*启动系统滴答定时器SysTick*/
voidSysTick_Init(void)
{
/*SystemFrequency/1000=560001ms中断一次,表示5600个时钟周期中断一次,其中时钟周期为1/56000000hz
*SystemFrequency/10000010us中断一次
*SystemFrequency/10000001us中断一次
*/
if(SysTick_Config(SystemCoreClock/5000000))
{
/*Captureerror*/
while
(1);
}
}
voidDelay_us(__IOu32nTime)
{
TimingDelay=nTime;
while(TimingDelay!
=0);
}
voidTimingDelay_Decrement(void)
{
if(TimingDelay!
=0x00)
{
TimingDelay--;
}
}