1、全国大学生电子设计竞赛2013年全国大学生电子设计竞赛 2013 National Undergraduate Electronic Design Contest 设计报告design report参赛题目: 红外光通信装置(F题) 队伍编号: 20130136 日 期:2013年9月7日红外光通信装置(F题)摘要 本装置由32位MCU为主控制器。 采集音频信号及温度信号后,利用红外发光管和红外光接收模块作为收发器件,用来定向传输。另配有一个红外光通信中继转发节点,以改变通信方向90,传输距离为2m。 接收装置在接收到信号后用耳机播放出语音,用液晶屏显示当前温度。当接收装置不能接收发射端发射的
2、信号时,用发光管指示。装置如图所示:关键词: MCU ; 红外通信 ;语音信号 ;定向传输Abstract::This communication device is based on a 32-bit MCU controller . First , the system Acquisition audio signal and temperature . Then , we use infrared receiver and infrared transmitter to transport audio signal . Beside , there is a relay node.we
3、can use relay node to change transmission direction 90, and relay distance no less than 2 meters . Last , the system play audio by earphone and show the temperature by LCD . If infrared receiver cant receive signals , the LED turned on .Keyword: MCU Infrared Communication Audio Transmission 1. 引言 我们
4、在分析题目之后认为难点是利用红外收发装置尽可能完整的传输信号而且信号中要包含音频信息和温度信息。于是我们设计了三种方案:(一)直接传输音频的模拟信号,定时发生中断,在中断中发送温度的数字信号。(二)用VS1503把采到的音频信号转化为压缩比较高的.ogg格式,再通过串口方式发送给接收端,接收端解码为音频信号播出。(三)用STM32对采集到的音频信号转化为数字信号,通过软件降噪后再转化为模拟信号传输。接收端同样将接收到的模拟信号转化为数字信号,用软件处理后转化为模拟信号播放。在硬件方面,考虑到音频信号的采集和播放,需要设计一些滤波电路和一些放大电路等。红外数字传输可以用包络检波在模拟信号中加载出
5、信号。在完成硬件平台后,我们开始从以上方案入手,开始对问题的讨论。2. 方案设计与论证方案(一) 直接传输音频的模拟信号,定时发生中断,在中断中发送温度的数字信号。流程图如下:音频信号输入 温度值9经过仔细分析,用模拟信号传输音频会造成很大的失真,在发送温度时会严重影响音频的播放。方案(二) 用VS1503把采到的音频信号转化为压缩比较高的.ogg格式,再通过串口方式发送给接收端,接收端解码为音频信号播出。此方案从理论上来说造成音频信号的失真非常小,使用串口方式通信的话波特率我们根据红外光发射接收头的波长特性,发射功率等参数计算并测试下来可达到4800bps,如要实时更新音频信号则会有较大延时
6、, 可能会超过5-10秒,如采用数字语音压缩算法,8K采样率下8位数据可压缩至 1K byte/秒, 且必须靠可靠的双向通信协议来保证, 不然信号将失真严重,故此方案被放弃。方案(三)用STM32对采集到的音频信号经过8k或16k采样周期转化为数字信号,采用软件降低噪音, 采用芯片带的 PWM 更新中断协调好8K 载波周期。 采用11位高精度 PWM脉宽调制。 接收端同样将接收到的微弱的模拟信号经过带通滤波器, 电容隔直放大信号后ADC采样转化为数字信号,温度传感器采集的数字信号通过包络载波形式加载与模拟信号之中用软件数字降噪调理处理后转化为模拟信号播放。具体流程如下:此方案的操作性比较强,从
7、理论上分许可以达到预定目标。3. 系统设计本系统分为5个模块,分别用3块STM32来控制。1)语音及温度的采集 语音信号的采集主要是实现声音信号到电信号的转换。使用的方法是用一个驻极体,接受声音信号,然后进行信号放大。一般麦克风输出电平为几十毫伏,经增益约为46 dB 的前置放大器A 1 放大至1V 左右的范围,以便推动后级电路。通过带通滤波器将频带通路设置在人耳比较容易实现的 300HZ - 20KHZ,CPU每秒钟采样8 000 点语音数据,每一点数据以一个12位分辨率采样及传输,因为音频放大芯片已经将处理为 1.65V 为中心的模拟信号,因此我们可以根据此特性进行数字滤波及降噪声处理,
8、温度采集使用DS18B20数字温度传感器。通过STM32与DS18B20连接,得到实时的温度信息。 红外发送 红外发送电路我们使用了9013三极管处于饱和状态 PWM 脉宽调试方式来驱动红外发射管, 通过 STM32 主CPU 进行和 8K 频率 进行ADC 一致的高级定时器设置, 并且进行了过采样来保证声音的银色, 用 12 位高精度 PWM 脉宽周期来调理红外发射电路,因为高载波, 因此我们无需多个发射管串联就可以将数据传输的很远。对于数字信号的包络波方式加载于模拟信号中, 不过再此次项目中我们并没有使用软件做数字 38k 载波处理, 我们选择了使用硬件电路做数字载波,通过幅度的不同来区分
9、与模拟信号。3)红外接收红外接收电路中我们使用了两套电路, 一套使用电容隔直流并放大音频信号来采集到调制过的模拟信号, 我们并没有使用传统的运放比较器去滤除加载的数字信号, 我们选择了更加灵活的 38k 一体接收芯片做为单独的通道处理数字信号, 模拟信号我们在 ADC 采集后进行数字化降噪和分离出数字信号,进实际测试, 此设计方案非常好的处理好模拟数字通道的发送和接收。对于中继我们还放大了数字信号为了更好的传输语音信号。4)后级功放电路及电源由于此次设计需要比较好的模拟量调理电路, 所以我们没有选择开关电源降低电源质量, 减少纹波。 后级功放电路我们选择了数字功放, 更将简单处理功放的设计,
10、由于高集成度, 所以更加方便的避免了万能板做电路对于电源信号的处理难问题, 特别是数字模拟功率三部分三点接地的处理上更加容易了。4. 方案测试1) 测试声音是否正常采集放大将采集到的信号经过放大电路输入到示波器上,观察得到的波形。峰值可以达到1V左右,达到预期的要求,说明音频采集放大电路没有问题。2) 测试声音信号经过传输后的还原情况 接收的声音应无明显失真。当发射端输入语音信号改为800Hz单音信号时,在8电阻负载上,接收装置的输出电压有效值为0.7V。不改变电路状态,减小发射端输入信号的幅度至0V,测量此时接收装置输出端噪声电压,读数约为80mV。3) 测试温度检测是否正常 启动系统,发送
11、端通过DS18B20采集到温度后,经系统传输后显示在超大液晶屏上。 用手轻轻捂住温度传感器,显示的温度有所增加,说明温度值在通过系统实时传输。与此同时,音频信号传输正常,播放正常。4)测试中继节点工作是否正常在系统中加入中继节点电流为峰值 5 个毫安左右,提供5V电源。系统开启后依然可以正常工作。此时通过数字毫安表测得中继节点中的电流为。我们做了低功耗待机的电流减少处理,通过模拟信号及数字信号的触发方式来唤醒 CPU 处于恢复工作状态。 5. 总结经过不断的测试,我们决定使用方案(三)。在方案实现的过程中,我们遇到了很多困难,但是我们都坚持不到最后一刻绝不放弃的原则,将问题一个一个解决。最终很
12、好的完成了基本要求,基本完成了附加要求。我们的团队意识非常好,每个人都努力把分到的工作认真对待。在队友出现小错误的时候不埋怨不气馁,而是耐心的检查并找出解决问题的方案。在作品完成之后我们都很高兴,也在此次竞赛中吸取了很多宝贵经验,收获了难得的友谊。附录:附1:元器件明细表1、 红外发射管、接收管2、 驻极体、喇叭、耳机、彩色液晶屏3、 LM567、LM358、74HC00、STM32,MCP6002等4、 三极管9012、90135、 电位器、电容、电阻、杜邦线若干。附2:仪器设备清单1、逻辑分析仪 2、数字毫安表 3、失真度测量仪4、数字示波器5、稳压电源附3:电路图图纸音频采集放大电路温度
13、采集电路38K载波发生电路红外发射电路 红外接收电路附4:部分软件程序Main.cINT8U P500usReq = 0;INT8U SendState;INT8U DestUart = 0;pwm_t Mypwm;ppm_t Myppm; void P500us(void) static INT16U AnlogTimes = 0; LedTask(); if(Uart2Rb0) DMA_Cmd(DMA1_Channel6, DISABLE); DMA1_Channel6-CNDTR = 1; DMA_Cmd(DMA1_Channel6, ENABLE); if(Uart2Rb0 % 8 =
14、 (Uart2Rb0 3) % 8) /Send_Hex(Uart2Rb0); DestUart = Uart2Rb0; Uart2Rb0 = 0; switch(SendState) case Anlog: if(AnlogTimes+ = 31995) AnlogTimes = 0; SendState = Digtal; DacValueSet(1,ADC_CH1_ConvertedValue); break; case Digtal: if(DestUart) TIM_Cmd(TIM1, DISABLE); Send_Hex(DestUart); TIM_Cmd(TIM1, ENABL
15、E); DestUart = 0; SendState = Anlog; break; case Idle: break; void PeriphCompent_init(void) SystemInit(); SysTick_Config(720000/320); /初始化滴答定时器 InitUartMonitor(); /初始化串口1,2 pwm_init(&Mypwm); ppm_init(&Myppm); ADC1_Init(); DAC_Configuration(); LedInit();INT8U Temp =7;/* * brief * param None * retval
16、None */int main(void) PeriphCompent_init(); while (1) if (P500usReq) /轮询时间信号状态 P500usReq = 0; P500us(); * * file PPM.C * author Lvhaian R&D Driver Software Team * version V1.0.0 * date 07/24/2012 * brief 配置PPM *clude PPM.h#include stm32f10x_gpio.h#include stm32f10x_exti.h#include stm32f10x_tim.h#inc
17、lude define.h/* addtogroup XFlyer_Driver * */* addtogroup PPM * */ /* defgroup PPM_Private_TypesDefinitions * */* * */ /* defgroup PPM_Private_Defines * */* * */ /* defgroup PPM_Private_Macros * */* * */ /* defgroup PPM_Private_Variables * */#define MinDig 2038ppm_t *p_ppm = 0; /*CNT = 0; /* * brief
18、 NVIC初始化 * param None * retval None */void PPM_NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannel
19、Cmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* * brief PPM初始化 * param None * retval None */void ppm_init(ppm_t *ppm) p_ppm = ppm; PPM_NVIC_Configuration(); PPM_GPIO_Configuration(); ppm_timer_init(); /* * brief ppm_timer的初始化 * param None * retval None */void ppm_timer_init(void) / TIM3 输出初始化 TIM_T
20、imeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; /通道输入初始化结构 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE); /这里做部分REMAP CH3,CH4 通道 /复位定时器 TIM_DeInit(TIM2); /开时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENAB
21、LE); /定时器 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 2-1; /APB1总线 用于解8K 16K 因此不分频了 TIM_TimeBaseStructure.TIM_ClockDivision = 0x00; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ICInitStructure.TIM
22、_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(TI
23、M2, &TIM_ICInitStructure); /* TIM enable counter */ TIM_Cmd(TIM2, ENABLE); /* Enable the CC1 Interrupt Request */ /* Enable the CC1 Interrupt Request */ TIM_ITConfig(TIM2, TIM_IT_CC4, ENABLE);/* * brief 将PPM信号值限定在-125125之间 * param int v :信号值 * retval None */int LimitPpmValue(int v) if(vPPM_MAX) retu
24、rn PPM_MAX; if(vPPM_MIN) return PPM_MIN; return v;/* * brief GOIO设置 * param None * retval None */void PPM_GPIO_Configuration(void) GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; GPIO_InitStructure.GPIO_Speed = G
25、PIO_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_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); /* * brie
26、f TIMER2 中断事件 * param None * retval None */INT16U Flag1 = 0;INT16U Flag2 = 0;void TIM2_IRQHandler(void) TIM_ICInitTypeDef TIM_ICInitStructure; /通道输入初始化结构 if ( TIM_GetITStatus(TIM2 , TIM_IT_CC4) != RESET ) if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) / Rising 上升沿 TIM_ClearITPendingBit(TIM2 , TIM_IT_C
27、C4); TIM_Cmd(TIM2, DISABLE); TIM_ResetCounter(TIM2); / 复位定时器 TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; /选择通道1 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, &TIM_ICInitStructure); /* TIM enable counter */ TIM_Cm
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1