1、1. 引言 我们在分析题目之后认为难点是利用红外收发装置尽可能完整的传输信号而且信号中要包含音频信息和温度信息。于是我们设计了三种方案:(一)直接传输音频的模拟信号,定时发生中断,在中断中发送温度的数字信号。(二)用VS1503把采到的音频信号转化为压缩比较高的.ogg格式,再通过串口方式发送给接收端,接收端解码为音频信号播出。(三)用STM32对采集到的音频信号转化为数字信号,通过软件降噪后再转化为模拟信号传输。接收端同样将接收到的模拟信号转化为数字信号,用软件处理后转化为模拟信号播放。在硬件方面,考虑到音频信号的采集和播放,需要设计一些滤波电路和一些放大电路等。红外数字传输可以用包络检波在
2、模拟信号中加载出信号。在完成硬件平台后,我们开始从以上方案入手,开始对问题的讨论。2. 方案设计与论证方案(一) 直接传输音频的模拟信号,定时发生中断,在中断中发送温度的数字信号。流程图如下:音频信号输入 温度值9经过仔细分析,用模拟信号传输音频会造成很大的失真,在发送温度时会严重影响音频的播放。方案(二) 用VS1503把采到的音频信号转化为压缩比较高的.ogg格式,再通过串口方式发送给接收端,接收端解码为音频信号播出。此方案从理论上来说造成音频信号的失真非常小,使用串口方式通信的话波特率我们根据红外光发射接收头的波长特性,发射功率等参数计算并测试下来可达到4800bps,如要实时更新音频信
3、号则会有较大延时, 可能会超过5-10秒,如采用数字语音压缩算法,8K采样率下8位数据可压缩至 1K byte/秒, 且必须靠可靠的双向通信协议来保证, 不然信号将失真严重,故此方案被放弃。方案(三)用STM32对采集到的音频信号经过8k或16k采样周期转化为数字信号,采用软件降低噪音, 采用芯片带的 PWM 更新中断协调好8K 载波周期。 采用11位高精度 PWM脉宽调制。 接收端同样将接收到的微弱的模拟信号经过带通滤波器, 电容隔直放大信号后ADC采样转化为数字信号,温度传感器采集的数字信号通过包络载波形式加载与模拟信号之中用软件数字降噪调理处理后转化为模拟信号播放。具体流程如下:此方案的
4、操作性比较强,从理论上分许可以达到预定目标。3. 系统设计本系统分为5个模块,分别用3块STM32来控制。1)语音及温度的采集 语音信号的采集主要是实现声音信号到电信号的转换。使用的方法是用一个驻极体,接受声音信号,然后进行信号放大。一般麦克风输出电平为几十毫伏,经增益约为46 dB 的前置放大器A 1 放大至1V 左右的范围,以便推动后级电路。通过带通滤波器将频带通路设置在人耳比较容易实现的 300HZ - 20KHZ,CPU每秒钟采样8 000 点语音数据,每一点数据以一个12位分辨率采样及传输,因为音频放大芯片已经将处理为 1.65V 为中心的模拟信号,因此我们可以根据此特性进行数字滤波
5、及降噪声处理, 温度采集使用DS18B20数字温度传感器。通过STM32与DS18B20连接,得到实时的温度信息。 红外发送 红外发送电路我们使用了9013三极管处于饱和状态 PWM 脉宽调试方式来驱动红外发射管, 通过 STM32 主CPU 进行和 8K 频率 进行ADC 一致的高级定时器设置, 并且进行了过采样来保证声音的银色, 用 12 位高精度 PWM 脉宽周期来调理红外发射电路,因为高载波, 因此我们无需多个发射管串联就可以将数据传输的很远。对于数字信号的包络波方式加载于模拟信号中, 不过再此次项目中我们并没有使用软件做数字 38k 载波处理, 我们选择了使用硬件电路做数字载波,通过
6、幅度的不同来区分与模拟信号。3)红外接收红外接收电路中我们使用了两套电路, 一套使用电容隔直流并放大音频信号来采集到调制过的模拟信号, 我们并没有使用传统的运放比较器去滤除加载的数字信号, 我们选择了更加灵活的 38k 一体接收芯片做为单独的通道处理数字信号, 模拟信号我们在 ADC 采集后进行数字化降噪和分离出数字信号,进实际测试, 此设计方案非常好的处理好模拟数字通道的发送和接收。对于中继我们还放大了数字信号为了更好的传输语音信号。4)后级功放电路及电源由于此次设计需要比较好的模拟量调理电路, 所以我们没有选择开关电源降低电源质量, 减少纹波。 后级功放电路我们选择了数字功放, 更将简单处
7、理功放的设计, 由于高集成度, 所以更加方便的避免了万能板做电路对于电源信号的处理难问题, 特别是数字模拟功率三部分三点接地的处理上更加容易了。4. 方案测试1) 测试声音是否正常采集放大将采集到的信号经过放大电路输入到示波器上,观察得到的波形。峰值可以达到1V左右,达到预期的要求,说明音频采集放大电路没有问题。2) 测试声音信号经过传输后的还原情况 接收的声音应无明显失真。当发射端输入语音信号改为800Hz单音信号时,在8电阻负载上,接收装置的输出电压有效值为0.7V。不改变电路状态,减小发射端输入信号的幅度至0V,测量此时接收装置输出端噪声电压,读数约为80mV。3) 测试温度检测是否正常
8、 启动系统,发送端通过DS18B20采集到温度后,经系统传输后显示在超大液晶屏上。 用手轻轻捂住温度传感器,显示的温度有所增加,说明温度值在通过系统实时传输。与此同时,音频信号传输正常,播放正常。4)测试中继节点工作是否正常在系统中加入中继节点电流为峰值 5 个毫安左右,提供5V电源。系统开启后依然可以正常工作。此时通过数字毫安表测得中继节点中的电流为。我们做了低功耗待机的电流减少处理,通过模拟信号及数字信号的触发方式来唤醒 CPU 处于恢复工作状态。5. 总结经过不断的测试,我们决定使用方案(三)。在方案实现的过程中,我们遇到了很多困难,但是我们都坚持不到最后一刻绝不放弃的原则,将问题一个一
9、个解决。最终很好的完成了基本要求,基本完成了附加要求。我们的团队意识非常好,每个人都努力把分到的工作认真对待。在队友出现小错误的时候不埋怨不气馁,而是耐心的检查并找出解决问题的方案。在作品完成之后我们都很高兴,也在此次竞赛中吸取了很多宝贵经验,收获了难得的友谊。附录:附1:元器件明细表1、 红外发射管、接收管2、 驻极体、喇叭、耳机、彩色液晶屏3、 LM567、LM358、74HC00、STM32,MCP6002等4、 三极管9012、90135、 电位器、电容、电阻、杜邦线若干。附2:仪器设备清单1、逻辑分析仪 2、数字毫安表 3、失真度测量仪4、数字示波器5、稳压电源附3:电路图图纸音频采
10、集放大电路温度采集电路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
11、 % 8 = (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,
12、 ENABLE); DestUart = 0; SendState = Anlog; case Idle: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 None */in
13、t 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 配置PPMclude PPM.h#include stm32f10x_gpio.hstm32f10x_exti.hstm32f10x_tim.hdefine.h/* addtogroup XFlyer_Driv
14、er * /* 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 NVIC初始化void PPM_NVIC_Configuration(void) NVIC_InitTypeDef NVIC_InitStructure; NVI
15、C_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); * brief PPM初始化void ppm_init(ppm_t *ppm) p_ppm = ppm; PPM_NVIC_Conf
16、iguration(); PPM_GPIO_Configuration(); ppm_timer_init(); * brief ppm_timer的初始化void ppm_timer_init(void) / TIM3 输出初始化 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; /通道输入初始化结构 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_PartialR
17、emap2_TIM2, ENABLE); /这里做部分REMAP CH3,CH4 通道 /复位定时器 TIM_DeInit(TIM2); /开时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /定时器 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 2-1; /APB1总线 用于解8K 16K 因此不分频了 TIM_TimeBaseStructure.TIM_ClockDivision = 0x00; TIM_TimeB
18、aseStructure.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
19、_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /每次检测到捕获输入就触发一次捕获 TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_ICInit(TIM2, &TIM_ICInitStructure); /* TIM enable counter */ TIM_Cmd(TIM2, ENABLE); /* Enable the CC1 Interrupt Request */ TIM_ITConfig(TIM2, TIM_IT_CC4, ENABLE); * brief 将PPM信号值限定在-12512
20、5之间 * param int v :信号值int LimitPpmValue(int v) if(vPPM_MAX) return PPM_MAX; if(vPPM_MIN) return PPM_MIN; return v; * brief GOIO设置void PPM_GPIO_Configuration(void) GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ; G
21、PIO_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; * brief TIMER2 中断事件INT16U Flag1 = 0;INT16U Flag2 = 0;void TIM2_IRQ
22、Handler(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, & /* TIM enable counter */ TIM_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1