OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14306|回复: 56

用AD转换声音信号,DA还原声音,一直实现不了,论坛里有人做过吗?

[复制链接]

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
发表于 2015-1-14 21:14:51 | 显示全部楼层 |阅读模式
5金钱
最近一直在弄用AD转换声音信号,然后用DA还原播放声音,可是一直都实现不了,希望有人指导一下,谢谢!以下是主要的代码(我是采用DMA方式传输的)
AD主要代码(在AD的实验上加了DMA配置和定时器2中断实现AD开始转换):
#define ADC1_DR_Address    0x4001244C
u16 ADC_Value;
//DMA配置


//定时器2配置




DAC1主要代码(利用DMA传输、定时器6定时触发DAC)
#define DAC_DHR12R1_Address      0x40007408
uint16_t DAC_Value;




主函数主要部分
extern u16 ADC_Value;
extern uint16_t DAC_Value;

DMA_Config(ADC1_DR_Address,(u32)&ADC_Value,1);
再初始化其他函数后
while(1)
{
DAC_Value = ADC_Value;
}

最佳答案

查看完整内容[请看2#楼]

回复【24楼】xuande: --------------------------------- 经过几天的努力,现在用8K、16K、40K的采样率都可以实现AD采集,然后DA转换播放声音了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-14 21:14:52 | 显示全部楼层
回复【24楼】xuande:
---------------------------------
经过几天的努力,现在用8K、16K、40K的采样率都可以实现AD采集,然后DA转换播放声音了
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-14 22:11:14 | 显示全部楼层
在别处也看到 LZ 在问。
说实话,贴这么一堆代码,没人仔细去看的。原因很多。

你必须把几件事情分开,然后一步一步保证效果,最后再合并起来。
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-14 22:38:51 | 显示全部楼层
回复【2楼】xuande:
---------------------------------
我已经用上面的代码实现过AD采集转换电压,再DA转换出来。现在就是不知道该怎么采集声音和还原播放声音
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-14 22:45:28 | 显示全部楼层
你AD采集的采样率是多少?采样定理了解吗?
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-14 22:56:47 | 显示全部楼层
回复【4楼】xuande:
---------------------------------
44.1KHz,系统时钟是72M的,而且不分频:TIM_TimeBaseStructure.TIM_Period = 1633;     //44.1KHz       
TIM_TimeBaseStructure.TIM_Prescaler = 0x0;     //不分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-14 23:05:01 | 显示全部楼层
现在是什么情况?
1、AD端输入直流信号,或者简单的阶跃信号,DA可以正确还原吗?至少要保证这一步是成功的。
2、如果上一步成功,就找个1Khz的信号源,幅度调适当(可以调着试试),输入给AD,同时DA输出。用示波器测DA端,看有没有对应的波形。
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-14 23:11:09 | 显示全部楼层
回复【6楼】xuande:
---------------------------------
1、我给AD一个电压值,DA可以还原
2、还没试过。。我想了解一下,如果直接把一个正弦波给AD的话,正弦波是有负值的,对AD没影响吗?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-14 23:18:41 | 显示全部楼层
1、还原一个直流信号,不能说明问题;你至少要给一个交变的信号。
2、有负值的模拟信号必须处理为正,才能送给AD;DA还原出来以后,再处理成正负信号。
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-14 23:25:04 | 显示全部楼层
回复【8楼】xuande:
---------------------------------
2、那怎么将有负值的正弦波(模拟)信号处理为正呢?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-15 10:05:30 | 显示全部楼层
a、偏置。
b、运放,加法器。
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-15 10:56:38 | 显示全部楼层
 回复【10楼】 xuande :
#xuande
---------------------------------
谢谢!按照你说的,我用一个偏置了的正弦波输入给AD,同时DA输出。接着用示波器同时测AD端和DA端,出现以下的情况,蓝色代表AD输入,黄色代表DA输出,请你帮忙分析一下
1、正弦波输入给AD,同时DA输出




2、正弦波输入给AD,同时DA输出,调节示波器上的周期旋钮




3、没有输入正弦波给AD,直接测量DA输出



回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-15 11:14:41 | 显示全部楼层
必须保证二者一模一样,至少波形要首先一样,幅度不对还好办。
说明程序有问题。
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-15 11:29:13 | 显示全部楼层
 回复【12楼】 xuande :
---------------------------------
# xuande

可以帮忙看看程序吗?麻烦你了,谢谢!

语音采集与播放程序.rar

2.49 MB, 下载次数: 787

回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-15 17:43:07 | 显示全部楼层
 回复【12楼】 xuande :
@ xuande
---------------------------------
今天下午又调试了很久,终于有声音出来了,不过喇叭有噪音,不管有没有说话,喇叭都会“沙沙沙”的响,怎么会这样呢?麻烦你指导一下,谢谢!!下面是播放声音的电路图


回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-15 21:25:58 | 显示全部楼层
两部分,

1、AD - DA 通道,输出波形正常吗?必须正常,这是根本,否则永远别想成功。
2、功放部分。用一个全部是正电压的声音信号,送到 1uF 电容的前端,调节音量,必须能够正常播音。

缺一不可。
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-15 21:52:31 | 显示全部楼层
 回复【15楼】 xuande :
#xuande 
---------------------------------
我把声音采集电路直接接到播放电路(下面图中OUT端接DA端),对着咪头说话,可以听到比较清晰的声音,电路如下
声音采集电路



播放电路



回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-16 01:28:35 | 显示全部楼层
那么,输入给AD的信号,仍然带负值?你是怎么解决的?
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-16 09:06:52 | 显示全部楼层
回复【17楼】xuande:
---------------------------------
你不是说加偏置吗?上面那个LM358电路的输出已经偏置了的模拟信号,然后输入给AD
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-16 10:28:27 | 显示全部楼层
14L,第一个问题,怎么样了?
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-16 11:17:49 | 显示全部楼层
 回复【19楼】 xuande :
#xuande
---------------------------------
1、好像波形挺完整的,黄色表示AD端,蓝色表示DA端,只不过感觉DA的波形不够平滑,采样频率是40KHz


回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-16 13:43:42 | 显示全部楼层
1、波形进步多了。但是二者频率变了,应当是DA的触发时钟与AD的时钟在频率上不一致。还是要朝完全一致来努力,才能无失真地还原。

2、到这一步,功放如果正常,应当可以听到声音了。声音可能不完美,比如音量太大会失真,以及有变调。变换几种不同频率试试。

不错,快了。
回复

使用道具 举报

1

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2014-8-18
在线时间
0 小时
发表于 2015-1-16 14:53:17 | 显示全部楼层
看直播,学技术
活到老,学到老!
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-16 15:29:07 | 显示全部楼层
 回复【21楼】 xuande :
#xuande 
---------------------------------
1、程序有问题???AD的转换触发是在定时器2的中断产生后开始的,频率是40KHz,DA的转换是利用定时器6溢出触发的,频率也是40KHz,应该一致了吧!?!程序如下:

AD的转换触发程序
void TIM2_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    TIM_DeInit(TIM2);                              //
        
    /* TIM2 configuration */
    TIM_TimeBaseStructure.TIM_Period = 24;     //40KHz
    TIM_TimeBaseStructure.TIM_Prescaler =71 ;    // 不分频      
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  //  
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
 
    /* Clear TIM2 update pending flag*/
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
 
    /* Enable TIM2 Update interrupt */
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 
 
    /* TIM2 disable counter */
    TIM_Cmd(TIM2, DISABLE);   //定时器2在main.c函数中才使能,此处关闭
}

  *//定时器2中断优先级设置
void TIM2_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Enable the TIM2 global Interrupt */
  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);
}
//定时器2中断
void TIM2_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)//判断更新中断是否发生
{
    TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update); //清除更新中断标志
     ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC软件转换启动功能
}
}


DA触发程序
void DAC_TIM_Config()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);//使能TIM6时钟

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 
TIM_TimeBaseStructure.TIM_Period = 24;     //40KHz       
TIM_TimeBaseStructure.TIM_Prescaler = 71;     //不分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);//更新触发

TIM_Cmd(TIM6, ENABLE);//使能TIM6
}

void DAC_Config()
{
DAC_InitTypeDef DAC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//

DAC_StructInit(&DAC_InitStructure);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;//定时器6触发
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //
DAC_Init(DAC_Channel_1, &DAC_InitStructure);//初始化DAC channel1

DAC_Cmd(DAC_Channel_1, ENABLE );//使能DAC1  channel1

DAC_DMACmd(DAC_Channel_1, ENABLE );//使能DAC1  channel1的DMA

}


2、喇叭在40KHz时有声音出来,发现也没什么断续的现象,同时喇叭伴随着“沙沙沙.....”的声响,但是,如果把频率改为8KHZ或者16KHZ,声音就失真很严重,或者没声音了



回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-16 16:26:47 | 显示全部楼层
回复【23楼】伊轩海:
---------------------------------

1、前面问过你采样定理的事,你可以查查,即:采样速率必须大于信号最高频率的两倍,才能无失真重现原信号。
   对于音频,40K采样率,已经是最低要求了。高保真的设备,可以达到上百K。
2、你的程序。
  我做过类似定时器触发AD的设计,根本不用开溢出中断,溢出信号直接在CPU内部触发AD,开始转换。
  就是说,完全是硬件实现触发,无需软件干预。所以,开中断无用,反而误事。
  有了软件参与,这软件实现的“时钟”可能就不准确了。
  DA,也是同样,完全用内部硬件实现。

  想想,看怎么实现。做到这一点,水平是个大提高。


回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-16 20:00:34 | 显示全部楼层
回复【24楼】xuande:
---------------------------------
好的!再继续调试
回复

使用道具 举报

2

主题

13

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2014-12-16
在线时间
0 小时
发表于 2015-1-23 20:22:07 | 显示全部楼层
牛人太多了,太厉害了,我这个新手表示膜拜。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-23 22:28:46 | 显示全部楼层
回复【26楼】伊轩海:
---------------------------------
8K也可以。。。看来人声的频谱比较窄。

恭喜!
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-24 19:48:11 | 显示全部楼层
回复【28楼】xuande:
---------------------------------
那么问题来了,我用一块miniSTM32V3.0的AD采集声音,接着通过串口传到另一块miniSTM32V3.0,然后用DA转换的时候,又不行了,喇叭又发出“哒哒哒......”的声音了,波特率用的是115200.。。麻烦指点指点,谢谢!
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-24 21:03:31 | 显示全部楼层
回复【29楼】伊轩海:
---------------------------------

115200 bps,按每字节10位来算,就是11520 Bps,每秒11.5K字节。
11.5K < 16K,所以,只能按 8K 的采样速率。——如果以前 8K 采样率能够正常播放,换用串口,应当也没问题。
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-25 00:29:36 | 显示全部楼层
回复【30楼】xuande:
---------------------------------
嗯嗯,明天试试。。
1、那我用AD采集到的12位数据值是分开高4位、低8位分别发送好呢?还是一次性发送12位的数据给串口好?
2、好像串口的数据位是8位,如果12位的数据分开高4位、低8位发送,那还原的声音会不会出现断续的呢?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-25 10:55:11 | 显示全部楼层
回复【31楼】伊轩海:
---------------------------------
原来是12位。。。我一直在按8位算。
前面说的采样率,是指点数,与每个点的位数无关!这个概念要搞清。

首先就是怎么传输12位的问题。只有先确定这个方式,才能核算指标。
a、串口一次只能发8位,所以至少要分两次。(不论给串口送多少位,串口只会把低8位作为有效数据,其他数据自动抛弃了!送4位是这样,24位也是这样。)
b、两次方式之一,是8+4,各占一帧。这显然是效率低的方法。那么要达到8K采样率,必须是 160K 波特率。
c、方式之二,是 8+4+4,前一个点的剩余4位与后一个点的4位拼起来,可以提高效率。
    即便如此,仍然需要120K波特率!而且,拼接、分拆都需要软件来做,实时性够不够?硬件有CPLD就好了。

综合考虑,把有效位数降低吧!一个点按8位进行AD、DA,这是最现实的方法。
音质当然比12位差一些,但做为一个实验项目,应当可以接受。否则,要重新设计硬件。
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-25 13:05:08 | 显示全部楼层
 回复【32楼】 xuande :
---------------------------------
#xuande 

ADC采集的数据不是只能是12位吗?怎么改成8位?
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-25 15:01:30 | 显示全部楼层
回复【33楼】伊轩海:
---------------------------------
貌似可以设置为8位。
如果只能是12位,那么只取高8位就可以。想想道理。

回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-25 16:07:13 | 显示全部楼层
回复【32楼】xuande:
---------------------------------
刚才把DA有效位降低到8位,喇叭有很大很大的噪音呢,看来8位不行,只能是12位了。。而且也不知道怎么把AD的有效位降低到8位
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-25 16:40:55 | 显示全部楼层
回复【34楼】xuande:
---------------------------------
AD还是设置不了8位。。
我试过设置为12位左对齐,接着取它的高8位(ADC_Value/256),后来通过DA转换,发现没有声音出来。。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-25 16:59:13 | 显示全部楼层
8位不行 —— 这结论有点早。

现在又回到最初的方法,
在 AD 和 DA 只取高 8 位的前提下,
给 AD 输入标准正弦信号,串口输出到 DA,
对比两端的波形,频率、波形必须一致!否则就是软硬件有问题。
做好这一步,再说后面。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-25 17:00:54 | 显示全部楼层
看了下手册,AD的位数,F1只能用12位,F2 和 F4 可以随意设置为6、8、10、12位。
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-25 17:15:00 | 显示全部楼层
回复【37楼】xuande:
---------------------------------
我设置AD为12位右对齐,然后取高8位(右移了4位:ADC_Value>>4),再设置DA为8位右对齐,结果有声音出来了,不过声音没12位的那么好,这样是不是表示8位的可以了???
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-25 17:17:15 | 显示全部楼层
8位声音,肯定没有12位好。

这情况,应该正常了。

刚才,可能 DA 端没有右移?
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-25 17:32:13 | 显示全部楼层
回复【40楼】xuande:
---------------------------------
而且我发现,如果只取12位AD的低8位,是不行的,喇叭发出很大的噪音。。貌似只可以取其高8位,想不懂,请解释解释,谢谢啦!
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-25 21:56:03 | 显示全部楼层
取低8位,当然不行。

假设,用尺子量长度,1.0米;
再量精确点,是1.01米;
再精确,1.012米。。。
越精确,新增加的位数是在后面,还是前面?
倒过来,往“不精确”量,是该取后面的数,还是取前面?
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-25 21:56:12 | 显示全部楼层
回复【40楼】xuande:
---------------------------------
嘿嘿,有没有一款简单易学的语音编、解码芯片,想通过编码实现语音的无线传输,然后在接收端解码实现语音播放,我的无线模块用的是nRF24L01,可以介绍一下吗?谢谢了
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-25 21:57:16 | 显示全部楼层
回复【42楼】xuande:
---------------------------------
哈哈,很直观的解释,懂了,又学习到了,谢谢谢谢!
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-25 21:58:34 | 显示全部楼层
通过这次实验,要学会核算指标。

比照串口,无线模块的速率够不够,这是首先要考虑的。具体不了解模块,没法说了。
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-25 22:22:04 | 显示全部楼层
回复【45楼】xuande:
---------------------------------
嗯嗯,谢谢你的忠告,看来我真的没怎么了解无线模块,还是继续尝试用串口调试一下!谢谢!
回复

使用道具 举报

16

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2014-9-22
在线时间
2 小时
 楼主| 发表于 2015-1-28 20:52:29 | 显示全部楼层
 回复【32楼】 xuande :
# xuande
---------------------------------
用串口调试的时候,我还是想传输12位的AD值(希望声音清晰一些),而且试了一下,发现另一块MINIV3.0串口接收到的数据,再经DA转换,喇叭播放的声音带有很大噪音,而且也失真,可以帮我看看程序有什么问题吗?谢谢!!采样率8K,波特率19200和115200都试过
串口1在主函数里一直发送
[mw_shl_code=c,true] while(1) { if(ADC_TimeOutFlag==1)//定时器定时采样率标志位 { txbuff[0]=ADC_Value/256;//高4位 txbuff[1]=ADC_Value%256;//低8位 USART_SendData(USART1,txbuff[i++]); if(i==2) i=0; while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); ADC_TimeOutFlag=0; } }[/mw_shl_code]
串口3中断接收;主函数进行DA转换
[mw_shl_code=c,true]void USART3_IRQHandler(void) { if(USART_GetITStatus(USART3,USART_IT_RXNE)==SET) { while(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==SET) { rxbuff[i++] = USART_ReceiveData(USART3); if(i==2) i=0; } USART_ClearITPendingBit(USART3,USART_IT_RXNE); } }[/mw_shl_code]
[mw_shl_code=c,true] while(1) { if(DAC_TimeOutFlag==1) { DAC_Value = rxbuff[0]*256+rxbuff[1]; DAC_SetChannel1Data(DAC_Align_12b_R, DAC_Value); DAC_TimeOutFlag=0; } }[/mw_shl_code]






回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2015-1-28 21:41:45 | 显示全部楼层
看程序是费脑袋的事,下班回来,钻不进去。。。

还是前面说的,输入特定波形,示波器,两端波形必须同频、同形!不对,再查程序。
感觉是数据量太大,串口忙不过来,导致实时性错了。
回复

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-3-3
在线时间
2 小时
发表于 2015-5-20 15:32:06 | 显示全部楼层
回复【47楼】伊轩海:
---------------------------------
楼主你好,我最近也在做这个项目,我用了ADC、DMA和DAC,程序运行之后,没有错误,但下载后没有任何结果,看到你做出来了,可以把你的程序提供给我参考一下吗?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-5-22
在线时间
0 小时
发表于 2015-5-22 15:53:36 | 显示全部楼层
同求资料,顺便问问,你通信也是用蓝牙么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 08:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表