全国大学生电子设计竞赛要点Word文档格式.docx
《全国大学生电子设计竞赛要点Word文档格式.docx》由会员分享,可在线阅读,更多相关《全国大学生电子设计竞赛要点Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
1.引言
我们在分析题目之后认为难点是利用红外收发装置尽可能完整的传输信号而且信号中要包含音频信息和温度信息。
于是我们设计了三种方案:
(一)直接传输音频的模拟信号,定时发生中断,在中断中发送温度的数字信号。
(二)用VS1503把采到的音频信号转化为压缩比较高的.ogg格式,再通过串口方式发送给接收端,接收端解码为音频信号播出。
(三)用STM32对采集到的音频信号转化为数字信号,通过软件降噪后再转化为模拟信号传输。
接收端同样将接收到的模拟信号转化为数字信号,用软件处理后转化为模拟信号播放。
在硬件方面,考虑到音频信号的采集和播放,需要设计一些滤波电路和一些放大电路等。
红外数字传输可以用包络检波在模拟信号中加载出信号。
在完成硬件平台后,我们开始从以上方案入手,开始对问题的讨论。
2.方案设计与论证
方案
(一)
直接传输音频的模拟信号,定时发生中断,在中断中发送温度的数字信号。
流程图如下:
音频信号输入
温度值
9
经过仔细分析,用模拟信号传输音频会造成很大的失真,在发送温度时会严重影响音频的播放。
方案
(二)
用VS1503把采到的音频信号转化为压缩比较高的.ogg格式,再通过串口方式发送给接收端,接收端解码为音频信号播出。
此方案从理论上来说造成音频信号的失真非常小,使用串口方式通信的话波特率我们根据红外光发射接收头的波长特性,发射功率等参数计算并测试下来可达到4800bps,如要实时更新音频信号则会有较大延时,可能会超过5-10秒,如采用数字语音压缩算法,8K采样率下8位数据可压缩至1Kbyte/秒,且必须靠可靠的双向通信协议来保证,不然信号将失真严重,故此方案被放弃。
方案(三)
用STM32对采集到的音频信号经过8k或16k采样周期转化为数字信号,采用软件降低噪音,采用芯片带的PWM更新中断协调好8K载波周期。
采用11位高精度PWM脉宽调制。
接收端同样将接收到的微弱的模拟信号经过带通滤波器,电容隔直放大信号后ADC采样转化为数字信号,温度传感器采集的数字信号通过包络载波形式加载与模拟信号之中用软件数字降噪调理处理后转化为模拟信号播放。
具体流程如下:
此方案的操作性比较强,从理论上分许可以达到预定目标。
3.系统设计
本系统分为5个模块,分别用3块STM32来控制。
1)语音及温度的采集
语音信号的采集主要是实现声音信号到电信号的转换。
使用的方法是用一个驻极体,接受声音信号,然后进行信号放大。
一般麦克风输出电平为几十毫伏,经增益约为46dB的前置放大器A1放大至1V左右的范围,以便推动后级电路。
通过带通滤波器将频带通路设置在人耳比较容易实现的300HZ-20KHZ,CPU每秒钟采样8000点语音数据,每一点数据以一个12位分辨率采样及传输,因为音频放大芯片已经将处理为1.65V为中心的模拟信号,因此我们可以根据此特性进行数字滤波及降噪声处理,
温度采集使用DS18B20数字温度传感器。
通过STM32与DS18B20连接,得到实时的温度信息。
红外发送
红外发送电路我们使用了9013三极管处于饱和状态PWM脉宽调试方式来驱动红外发射管,通过STM32主CPU进行和8K频率进行ADC一致的高级定时器设置,并且进行了过采样来保证声音的银色,用12位高精度PWM脉宽周期来调理红外发射电路,因为高载波,因此我们无需多个发射管串联就可以将数据传输的很远。
对于数字信号的包络波方式加载于模拟信号中,不过再此次项目中我们并没有使用软件做数字38k载波处理,我们选择了使用硬件电路做数字载波,通过幅度的不同来区分与模拟信号。
3)红外接收
红外接收电路中我们使用了两套电路,一套使用电容隔直流并放大音频信号来采集到调制过的模拟信号,我们并没有使用传统的运放比较器去滤除加载的数字信号,我们选择了更加灵活的38k一体接收芯片做为单独的通道处理数字信号,模拟信号我们在ADC采集后进行数字化降噪和分离出数字信号,进实际测试,此设计方案非常好的处理好模拟数字通道的发送和接收。
对于中继我们还放大了数字信号为了更好的传输语音信号。
4)后级功放电路及电源
由于此次设计需要比较好的模拟量调理电路,所以我们没有选择开关电源降低电源质量,减少纹波。
后级功放电路我们选择了数字功放,更将简单处理功放的设计,由于高集成度,所以更加方便的避免了万能板做电路对于电源信号的处理难问题,特别是数字模拟功率三部分三点接地的处理上更加容易了。
4.方案测试
1)测试声音是否正常采集放大
将采集到的信号经过放大电路输入到示波器上,观察得到的波形。
峰值可以达到1V左右,达到预期的要求,说明音频采集放大电路没有问题。
2)测试声音信号经过传输后的还原情况
接收的声音应无明显失真。
当发射端输入语音信号改为800Hz单音信号时,在8Ω电阻负载上,接收装置的输出电压有效值为0.7V。
不改变电路状态,减小发射端输入信号的幅度至0V,测量此时接收装置输出端噪声电压,读数约为80mV。
3)测试温度检测是否正常
启动系统,发送端通过DS18B20采集到温度后,经系统传输后显示在超大液晶屏上。
用手轻轻捂住温度传感器,显示的温度有所增加,说明温度值在通过系统实时传输。
与此同时,音频信号传输正常,播放正常。
4)测试中继节点工作是否正常
在系统中加入中继节点电流为峰值5个毫安左右,提供5V电源。
系统开启后依然可以正常工作。
此时通过数字毫安表测得中继节点中的电流为。
我们做了低功耗待机的电流减少处理,通过模拟信号及数字信号的触发方式来唤醒CPU处于恢复工作状态。
5.总结
经过不断的测试,我们决定使用方案(三)。
在方案实现的过程中,我们遇到了很多困难,但是我们都坚持不到最后一刻绝不放弃的原则,将问题一个一个解决。
最终很好的完成了基本要求,基本完成了附加要求。
我们的团队意识非常好,每个人都努力把分到的工作认真对待。
在队友出现小错误的时候不埋怨不气馁,而是耐心的检查并找出解决问题的方案。
在作品完成之后我们都很高兴,也在此次竞赛中吸取了很多宝贵经验,收获了难得的友谊。
附录:
附1:
元器件明细表
1、红外发射管、接收管
2、驻极体、喇叭、耳机、彩色液晶屏
3、LM567、LM358、74HC00、STM32,MCP6002等
4、三极管9012、9013
5、电位器、电容、电阻、杜邦线若干。
附2:
仪器设备清单
1、逻辑分析仪
2、数字毫安表
3、失真度测量仪
4、数字示波器
5、稳压电源
附3:
电路图图纸
音频采集放大电路
温度采集电路
38K载波发生电路
红外发射电路
红外接收电路
附4:
部分软件程序
Main.c
INT8UP500usReq=0;
INT8USendState;
INT8UDestUart=0;
pwm_tMypwm;
ppm_tMyppm;
voidP500us(void)
{
staticINT16UAnlogTimes=0;
LedTask();
if(Uart2Rb[0])
{
DMA_Cmd(DMA1_Channel6,DISABLE);
DMA1_Channel6->
CNDTR=1;
DMA_Cmd(DMA1_Channel6,ENABLE);
if(Uart2Rb[0]%8==((Uart2Rb[0]>
>
3)%8))
//Send_Hex(Uart2Rb[0]);
DestUart=Uart2Rb[0];
}
Uart2Rb[0]=0;
switch(SendState)
caseAnlog:
if(AnlogTimes++>
=31995)
AnlogTimes=0;
SendState=Digtal;
DacValueSet(1,ADC_CH1_ConvertedValue);
break;
caseDigtal:
if(DestUart)
{
TIM_Cmd(TIM1,DISABLE);
Send_Hex(DestUart);
TIM_Cmd(TIM1,ENABLE);
DestUart=0;
SendState=Anlog;
caseIdle:
}
voidPeriphCompent_init(void)
SystemInit();
SysTick_Config(720000/320);
//初始化滴答定时器
InitUartMonitor();
//初始化串口1,2
pwm_init(&
Mypwm);
ppm_init(&
Myppm);
ADC1_Init();
DAC_Configuration();
LedInit();
INT8UTemp=7;
/**
*@brief
*@paramNone
*@retvalNone
*/
intmain(void)
PeriphCompent_init();
while
(1)
if(P500usReq)//轮询时间信号状态
P500usReq=0;
P500us();
******************************************************************************
*@filePPM.C
*@authorLvhaianR&
DDriverSoftwareTeam
*@versionV1.0.0
*@date07/24/2012
*@brief配置PPM
clude"
PPM.h"
#include"
stm32f10x_gpio.h"
stm32f10x_exti.h"
stm32f10x_tim.h"
define.h"
/**@addtogroupXFlyer_Driver
*@{
/**@addtogroupPPM
*/
/**@defgroupPPM_Private_TypesDefinitions
*@}
/**@defgroupPPM_Private_Defines
/**@defgroupPPM_Private_Macros
/**@defgroupPPM_Private_Variables
#defineMinDig2038
ppm_t*p_ppm=0;
/**<
pointertoPPMarea*/
/**@defgroupPPM_Private_FunctionPrototypes
voidppm_timer_init(void);
voidPPM_GPIO_Configuration(void);
voidTIM_ResetCounter(TIM_TypeDef*TIMx);
voidppm_init(ppm_t*ppm);
voidPPM_NVIC_Configuration(void);
intLimitPpmValue(intv);
/**@defgroupPPM_Private_Functions
*@briefTIMER重新计数
*@paramTIM_TypeDef*TIMx:
选择TIMER
voidTIM_ResetCounter(TIM_TypeDef*TIMx)
/*Checktheparameters*/
assert_param(IS_TIM_LIST3_PERIPH(TIMx));
/*SettheCaptureCompare4Registervalue*/
TIMx->
CNT=0;
*@briefNVIC初始化
voidPPM_NVIC_Configuration(void)
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&
NVIC_InitStructure);
*@briefPPM初始化
voidppm_init(ppm_t*ppm)
p_ppm=ppm;
PPM_NVIC_Configuration();
PPM_GPIO_Configuration();
ppm_timer_init();
*@briefppm_timer的初始化
voidppm_timer_init(void)
//TIM3输出初始化
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_ICInitTypeDefTIM_ICInitStructure;
//通道输入初始化结构
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);
//这里做部分REMAPCH3,CH4通道
//复位定时器
TIM_DeInit(TIM2);
//开时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//定时器
TIM_TimeBaseStructure.TIM_Period=0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler=2-1;
//APB1总线用于解8K16K因此不分频了
TIM_TimeBaseStructure.TIM_ClockDivision=0x00;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&
TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_Channel=TIM_Channel_4;
//选择通道1
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;
//输入上升沿捕获
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
//通道方向选择
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
//每次检测到捕获输入就触发一次捕获
TIM_ICInitStructure.TIM_ICFilter=0x0;
TIM_ICInit(TIM2,&
TIM_ICInitStructure);
/*TIMenablecounter*/
TIM_Cmd(TIM2,ENABLE);
/*EnabletheCC1InterruptRequest*/
TIM_ITConfig(TIM2,TIM_IT_CC4,ENABLE);
*@brief将PPM信号值限定在-125~125之间
*@paramintv:
信号值
intLimitPpmValue(intv)
if(v>
PPM_MAX)returnPPM_MAX;
if(v<
PPM_MIN)returnPPM_MIN;
returnv;
*@briefGOIO设置
voidPPM_GPIO_Configuration(void)
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&
GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
*@briefTIMER2中断事件
INT16UFlag1=0;
INT16UFlag2=0;
voidTIM2_IRQHandler(void)
if(TIM_GetITStatus(TIM2,TIM_IT_CC4)!
=RESET)
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11))//Rising上升沿
TIM_ClearITPendingBit(TIM2,TIM_IT_CC4);
TIM_Cmd(TIM2,DISABLE);
TIM_ResetCounter(TIM2);
//复位定时器
TIM_ICInitStructure.TIM_Channel=TIM_Channel_4;
TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter=0x0;
TIM_ICInit(TIM2,&
/*TIMenablecounter*/
TIM_