电赛初探(二)——语音采集回放系统

一、系统结构

1.基本要求
  (1)话音/功率放大器增益均可调;
  (2)带通滤波器:通带为300Hz~3.4kHz ;
  (3)ADC:采样频率f s=8kHz,字长不小于8位;
  (4)语音存储时间≥10秒;
  (5)DAC:变换频率f c=8kHz,字长不小于8位;
  (6)回放语音质量良好。

2.发挥部分

在保证语音质量的前提下:
  (1)减少系统噪声电平,增加自动音量控制功能;
  (2)语音存储时间增加至20秒以上;
  (3)提高存储器的利用率(在原有存储容量不变的前提下,提高语音存储时间);
  (4)把采集的语音信号在显示屏上显示。

二、咪头放大电路设计

1、电路仿真

2、要点:

(1) 系统的增益主要通过R5这个滑动变阻器来控制,咪头采集的信号的幅值,必须控制好,否则在进入AD转换后会导致失真。

(2) 必要时可不需要第二级运放电路,第二级电路只是起一个转接下一级的作用。

(3) 由于咪头采集的信号不仅仅是音频信号,所以之后必须加入一个带通滤波过滤掉无用信号。

三、带通滤波器的设计

1、设计软件

2、电路仿真

3、设计要点

(1)选取高Q值,且斜率比较陡的电路较好。

(2)一般需要强制阶数,要不电路太庞大

(3)明白调节增益的关键电阻。

四、AD0809设计

1、程序如下:

#ifndef _ADC0809_H
#define _ADC0809_H

#include "stm32f10x.h"
#include "init.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"

//ADC0809μ???????-GPIOA
#define CLK GPIO_Pin_0
//μ??·ê??ˉéè??
//#define A     GPIO_Pin_1
//#define B        GPIO_Pin_11
//#define C   GPIO_Pin_3
#define ALE GPIO_Pin_4 //μ??·??′??êDíD?o?ê?è???£?ALE=1£?μ??·??′?
#define ST    GPIO_Pin_5 //×a?????ˉD?o?
#define OE    GPIO_Pin_6 //ê?3??êDí??????£?OE=1,ê?3?×a??êy?Y

//ADC0809μ?êy×?ê?3?-GPIOB
#define D0     GPIO_Pin_0
#define D1     GPIO_Pin_1
#define D2     GPIO_Pin_2
#define D3     GPIO_Pin_3
#define D4    GPIO_Pin_4
#define D5     GPIO_Pin_5
#define D6     GPIO_Pin_6
#define D7     GPIO_Pin_7
#define EOC GPIO_Pin_8 //×a???áê?D?o?£?EOC=1ê±£?×a???áê?

void adc0809_init(void);

u8 adc0809_input(void); //AD2é?ù

void ADC0809_Clock(void); //ADC0809Clock2¨

#endif
#include "adc0809.h"
#include "gpio.h"
#include "timer.h"
#include "pbdata.h"

void adc0809_init(void)
{
    //ê?3?1ü??
    set_out(GPIOA, CLK|ALE|ST|OE);

    //ê?è?1ü??
    set_FIN(GPIOB, D0|D1|D2|D3|D4|D5|D6|D7|EOC);
    timer2_pwm(600*1000, 0.5); //A01ü??

    set_outL(GPIOA, ALE);
//μ??·ê??ˉéè??
//    set_outL(GPIOA, A);
//    set_outL(GPIOA, B);
//    set_outL(GPIOA, C);
    delay_us(5);
    set_outH(GPIOA, ALE); //μ??·??′?
}

u8 adc0809_input() //AD2é?ù
{
    u8 val;
    //ST2úéúé?éy??oí???μ??£oé?éy??£???′??÷??á?£????μ??£o?aê?AD×a??
    set_outH(GPIOA,ST);
    delay_us(5);
    set_outL(GPIOA, ST);
    delay_us(5);
    while(read_in(GPIOB, EOC) == 0); //×a??1y3ì

//    EXTI_GenerateSWInterrupt(EXTI_Line14);

    set_outH(GPIOA,OE); //ê?3??êDí??????£?OE=1,ê?3?×a??êy?Y
    val = read_in(GPIOB, D0)*0x0001 + read_in(GPIOB, D1)*0x0002 +
          read_in(GPIOB, D2)*0x0004 + read_in(GPIOB, D3)*0x0008 +
          read_in(GPIOB, D4)*0x0010 + read_in(GPIOB, D5)*0x0020 +
        read_in(GPIOB, D6)*0x0040 + read_in(GPIOB, D7)*0x0080;

    set_outL(GPIOA,OE);

    return val;
}

华丽的分割!!!!!!!!!!!!!!!

这里是程序中的调用:

adc0809_init();
val = adc0809_input();
DtoB(valB,val);
set_outL(GPIOC,ILE);
delay_us(5);

2、要点

(1) AD需要单片机提供500KHz的方波作为时钟信号,当你提供500KHz的时钟信号时,AD0809便会以8KHz的频率进行采样。

(2) 程序中需要巧妙使用EOC提供的转换停止信号,进行采集,以及接下来的储存和DA转化所应该采取的频率基础来源。

(3) AD0809的参考电压只能是正,且不能大于10V。

五、DA0832使用

1、程序如下

#include "stm32f10x.h"

//DAC0832μ?êy×?ê?è?-GPIOC
#define DI0 GPIO_Pin_0
#define DI1 GPIO_Pin_1
#define DI2 GPIO_Pin_2
#define DI3 GPIO_Pin_3
#define DI4 GPIO_Pin_4
#define DI5 GPIO_Pin_5
#define DI6 GPIO_Pin_6
#define DI7 GPIO_Pin_7
#define ILE GPIO_Pin_8

void da0832_init(void);

void DtoB(int valB[],int val);
#include "adc0809.h"
#include "gpio.h"
#include "timer.h"
#include "pbdata.h"

void adc0809_init(void)
{
    //ê?3?1ü??
    set_out(GPIOA, CLK|ALE|ST|OE);

    //ê?è?1ü??
    set_FIN(GPIOB, D0|D1|D2|D3|D4|D5|D6|D7|EOC);
    timer2_pwm(600*1000, 0.5); //A01ü??

    set_outL(GPIOA, ALE);
//μ??·ê??ˉéè??
//    set_outL(GPIOA, A);
//    set_outL(GPIOA, B);
//    set_outL(GPIOA, C);
    delay_us(5);
    set_outH(GPIOA, ALE); //μ??·??′?
}

u8 adc0809_input() //AD2é?ù
{
    u8 val;
    //ST2úéúé?éy??oí???μ??£oé?éy??£???′??÷??á?£????μ??£o?aê?AD×a??
    set_outH(GPIOA,ST);
    delay_us(5);
    set_outL(GPIOA, ST);
    delay_us(5);
    while(read_in(GPIOB, EOC) == 0); //×a??1y3ì

//    EXTI_GenerateSWInterrupt(EXTI_Line14);

    set_outH(GPIOA,OE); //ê?3??êDí??????£?OE=1,ê?3?×a??êy?Y
    val = read_in(GPIOB, D0)*0x0001 + read_in(GPIOB, D1)*0x0002 +
          read_in(GPIOB, D2)*0x0004 + read_in(GPIOB, D3)*0x0008 +
          read_in(GPIOB, D4)*0x0010 + read_in(GPIOB, D5)*0x0020 +
        read_in(GPIOB, D6)*0x0040 + read_in(GPIOB, D7)*0x0080;

    set_outL(GPIOA,OE);

    return val;
}

2、要点

(1) DA0832芯片输出的是电流信号,也就是说DA出来的是电流量,我们需要外接一个运放来转换成电压信号。

(2) DA0832芯片输出时候的频率应该由EOC来控制。

(3) DA0832芯片输出会产生反相的作用

(4) DA0832与AD0809在直通时,会产生低频干扰,但由于是采集回放系统,所以很好的避免这个问题。否则需要采取软件去抖动的方法。

六、SD储存

1、程序如下

#ifndef _SD_H
#define _SD_H

#include "stm32f10x.h"
#include "pbdata.h"
#include "stm32f10x.h"
#include "usart1.h"
#include "stm32f10x_gpio.h"
#include "SD_driver.h"

#define LED_D1_ON()  (GPIOA->ODR &= ~GPIO_Pin_8)
#define LED_D1_OFF() (GPIOA->ODR |= GPIO_Pin_8)

void ConfigurationLED(void);
void InitSys(void);
void InitBSP(void);

#endif
#include "SD.h"

void ConfigurationLED(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE);
/**
 *    LED -> PB1
 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void InitSys(void)
{
     SystemInit();
}
/***************************************************************************************/
void InitBSP(void)
{
  ConfigurationUsart1();
    ConfigurationLED();
    printf("\r\n this is a SD Test demo \r\n");
    USART1_printf(USART1, "\r\n this is a SD Test demo \r\n");
    USART1_printf(USART1, "\r\n ("__DATE__ " - " __TIME__ ") \r\n"); 

    ConfigurationSDCard();
while(1)
    {
        if(TestSD_ReadWriteFunction())
            {
                printf ( "SD ReadWriteFunction success !\n");
            break;
            }
    LED_D1_ON();  //D1
    printf ( "SD ReadWriteFunction error !\n");
  }

}

华丽的分割!!!!!!!!!!!!!!!!!!!!!!!!!!!

完整版的AD DA SD程序(仅仅main函数)

u16 sound_p = 0;
  InitSys();
  InitBSP();
    set_out(GPIOA,Pin8);
    extern_interrupt_init();
    adc0809_init();
    da0832_init();
    set_outL(GPIOA, ST);
    set_out(GPIOA,Pin11);

    //timer3_init(10000); //?¨ê±?÷?D??????
    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
    while(1)
    {
        if(function == Function_In)
        {
         val = adc0809_input();
             music[i++]=val;
            // printf("\r %d \n",val);
          if(i>=512)
          {
               i=0;
               if(SD_WriteSingleBlock(++Sector_pointer_In, music))
               {
                 //    printf("Write Error!");
               }
          }
        }

        if(function==Function_Out)
        {

        set_outL(GPIOA, ST);
      delay_us(5);
        set_outH(GPIOA,ST);
            delay_us(5);
            set_outL(GPIOA, ST);
            delay_us(5);
            while(read_in(GPIOB, EOC) == 0); //×a??1y3ì
            if((Sector_pointer_Out<=Sector_pointer_In)&&(Sector_pointer_In!=0))
            {
                    if(i==0)
              {
                 if(SD_ReadSingleBlock(++Sector_pointer_Out, music))
               {
                 //    printf("Read Error!");
               }
              }
                DtoB(valB,music[i++]);
                //  printf("\r %d \n",music[i-1]);

              GPIO_SetBits(GPIOC, DI0*valB[0] + DI1*valB[1] + DI2*valB[2] + DI3*valB[3] +
                                        DI4*valB[4] + DI5*valB[5] + DI6*valB[6] + DI7*valB[7]);
              GPIO_ResetBits(GPIOC, DI0*(1-valB[0]) + DI1*(1-valB[1]) + DI2*(1-valB[2]) + DI3*(1-valB[3]) +
                                        DI4*(1-valB[4]) + DI5*(1-valB[5]) + DI6*(1-valB[6]) + DI7*(1-valB[7]));
                if(i>=512)
            {
               i=0;
            }
            }
            else
            {
                function=Function_Stop;
            }
}

七、功率放大电路

1、采用TDA2030A作为功放芯片,电路如下:

2、要点:

(1)需要调节C7的电容,去掉直流分量。。。虽然不知道为什么会有,在测试的时候220nF会产生10V的直流分量。

(2)需要改变R1来控制增益。

八、总PCB设计

要点:

(1)各级电路之间要用短接帽的方式隔开

(2)电源排针需要多接几个,弄成一排。

(3)电源要用大电容小电容进行滤波

(4)半手工PCB版由于工艺。。最好是把铜线布宽点。

九、成品图

时间: 2024-10-29 02:40:33

电赛初探(二)——语音采集回放系统的相关文章

雷达视频信号采集回放系统

该系统除用于单个目标的识别,还应用于判断目标以外的背景信息,实现特定目的的搜索功能,识别的范围更广.信息含量更大,所需要处理的数据也更多,采集所需图像的同时,还要精确记录方位.时间等多维信息,可以实时回放所采集的图像信息,实现难度大,硬件需求高.1.雷达视频信号采集需求1.1 信号特征(1)video AD信号,幅度为±5V;(2)trig 触发信号,±3.3VCMOS电平信号3000Hz;(3)BP 方位信号,±3.3VCMOS电平信号252Hz;(4)HD 0点信号,±3.3VCMOS电平信

电赛初探(一)&mdash;&mdash;正弦波、方波、锯齿波转换

一.题目要求: 1.使用555做出脉冲方波 2.使用TL084运放做出方波和锯齿波 3.使用TLM314稳压做直流偏置 4.方波要求峰峰值为1V,正弦波要求峰值为0~2V,锯齿波要求峰峰值为1V. 二.解题流程 1.使用555做出脉冲方波 (1)参数计算 (2)仿真设计图: (3)仿真波形 (4)实际操作中总结的经验 A.一个滑动变阻器十分的重要,我们需要购入一个,在正式比赛的时候.(如果要参加比赛,我们自己买一个或者做一个试验箱) B.虽然说,搭建成斯密特触发器,可以使得方波对称,但是实际进行

【游戏设计模式】之二 实现撤消重做、回放系统的神器:命令模式

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/52663057 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 这篇文章将与大家一起探索游戏开发中命令模式的用法. 命令模式的成名应用是实现诸如撤消,重做,回放,时间倒流之类的功能.如果你想知道<Dota2>中的观战系统.<魔兽争霸3>中的录像系统.<守望先锋>

从电商秒杀与抢购谈Web系统大规模并发

从电商秒杀与抢购谈Web系统大规模并发 http://www.iamlintao.com/4242.html 一.大规模并发带来的挑战 在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战.如果Web系统不做针对性的优化,会轻而易举地陷入到异常状态.我们现在一起来讨论下,优化的思路和方法哈. 1. 请求接口的合理设计 一个秒杀或者抢购页面,通常分为2个部分,一个是静态的HTML等内容,另一个就是参与秒杀的Web后台请求接口. 通常静态HTML等

2003-2011电赛题目

2011年题目清单 .开关电源模块并联供电系统(A) 基于自由摆的平板控制系统(B) 智能小车(C题) LC谐振放大器(D ) 简易数字信号传输性能分析仪(E题) 帆板控制系统(F题 ) 简易自动电阻测试仪(G题) 波形采集.存储与回放系统(H题) 2009年题目清单: .A题--光伏并网发电模拟装置 B题--声音导引系统 C题--宽带直流放大器 D题--无线环境监测模拟装置 E题--电能收集充电器 F题--数字幅频均衡功率放大器 G题--低频功率放大器 H题--LED点阵书写显示屏 I 题--

EF6.0+APS.NET MVC5.0项目初探二(类库引用关系及说明)

接着上一篇(EF6.0+APS.NET MVC5.0项目初探一(界面展示),说说我搭建项目的一点心得. 第一步:我喜欢先建一个空的解决方案,只是个人喜好,不喜勿喷,呵呵. 如图: 第二步:添加项目所需要的类库: 如图: 第三步:添加类库引用 UI.Manage->BusinessLogic.BLL,Domain.Entity,Domain.ViewModel,Infrastructure.Common,UI.HtmlHelper BusinessLogic.BLL->Domain.Entity

农药二维码追溯系统开发

农药二维码标签制作,农药二维码追溯系统开发,农药追溯体系建设解决方案,咨询陈经理(微电同号 135-3520-3348)农药新规规定老标签只能用到今年年底,这就意味着农药企业需要在2017年下半年实现二维码追溯,让农药拥有自己的"电子身份证".农药实现二维码质量追溯,需要用到哪些技术? 以二维码为载体,基于一物一码技术,赋予每一瓶农药一个特有的"二维码"作为追溯码,扫码要完全显示农业部要求标注的所有信息,比如农药的生产日期.产品批号.质量保证期.成分等.一物一码二维

东北大米二维码追溯系统开发

大米二维码追溯系统定制.农产品追溯体系开发.农作物种子二维码追溯体系.农产品质量追溯系统联系江经理:134-2106-8261. 随着我国人民生活水平不断提高,食品安全问题日益成为焦点.近些年,食品安全的各种追溯体系百花齐放,但这些追溯体系过于分散,缺乏统一的管理和规划,产生了追溯信息内容不规范.编码标识不统一.系统软件不兼容.信息不能交换,形成一个个信息孤岛,造成基础信息重复采集和资源的浪费.对于大米企业的发展来说,为了长远的增强消费者的信任,塑造品牌形象,规范企业管理,提高公司收益,建立一套

模拟赛(二):T118878 阴云密布(代码极度哲学,慎点)

2020.2.6 模拟赛(二) T1 阴云密布(改编) 题目描述 杰哥有三个属性:生命值,魔法值,能量值.杰哥有如下三种基本技能:充能,攻击,魔法.杰哥的初始生命值Ht1,能量值和魔法值为0.阿伟的初始生命值为Ht2. 战斗有n轮,每轮杰哥会发动3个基本技能(杰哥耍赖. 攻击Blast: 对于第i个基本技能,如果它是攻击,设能量值Pw,那么伤害为(Pw+1)?Fst1~i~.然后能量值清0. 充能Charge: 对于第i个基本技能,如果它是充能,那么伤害为Elc~i~.然后能量值增加1. 魔法A