社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 595|回复: 12

[其他] SensorTile正弦波发生器

[复制链接]

4560

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-10-28 13:53:29 | 显示全部楼层 |阅读模式
QQ图片20171028134655.png

QQ图片20171028134634.png


生成sin数据的代码
[C] 纯文本查看 复制代码
//生成sin数据
void SineGenerator(float outFreq,float samplingFreq)
{
//输出数据索引 
uint16_t i;
float tmp;
//采样率除输出频率得到总样本数量
uint16_t sampleLength = (uint16_t)(samplingFreq / outFreq);
//分步角度
float stepDegrees = 360.00 / (float)sampleLength ;
//分步弧度
stepDegrees = PI / 180.00 * stepDegrees;
//游标移到起始处
sinWaveLength = 0;
//得到对应正弦数据
for(i=0;i<sampleLength;i++)
{
//得到当前弧度
tmp = stepDegrees* i;
//得到对应的sin数据
tmp = sin(tmp);
//+0.5四舍五入
sinWave[sinWaveLength++] = (int16_t)((tmp + 1)/2 * 65535 - 32768 + 0.5);
}
}


在BSP_AUDIO_OUT_TransferComplete_CallBack和BSP_AUDIO_OUT_HalfTransfer_CallBack中断函数里循环填充正弦数据到输出缓冲区
[C] 纯文本查看 复制代码
void BSP_AUDIO_OUT_TransferComplete_CallBack(void)
{  
  uint16_t i;
  //将sinWave数据填充到DAC输出缓冲audio_out_buffer中
  //播放完audio_out_buffer时填充后半部分
  for(i=AUDIO_OUT_BUF_LEN/2;i<AUDIO_OUT_BUF_LEN;i+=2)
  {
    audio_out_buffer[i] = sinWave[sinWaveIndex];
    audio_out_buffer[i+1] = sinWave[sinWaveIndex++];
    //如果数据超出sinWave范围则从0开始循环填充
    if(sinWaveIndex >= sinWaveLength) sinWaveIndex = 0;
  }
      __NOP();
}

/**
* [url=home.php?mod=space&uid=159083]@brief[/url]  Manages the DMA Half Transfer complete event.
* @retval None
*/
void BSP_AUDIO_OUT_HalfTransfer_CallBack(void)
{
  uint16_t i;
  //将sinWave数据填充到DAC输出缓冲audio_out_buffer中
  //播放到audio_out_buffer一半的时候填充前半部分
  for(i=0;i<AUDIO_OUT_BUF_LEN/2;i+=2)
  {
    audio_out_buffer[i] = sinWave[sinWaveIndex];
    audio_out_buffer[i+1] = sinWave[sinWaveIndex++];
    //如果数据超出sinWave范围则从0开始循环填充
    if(sinWaveIndex >= sinWaveLength) sinWaveIndex = 0;
  }
      __NOP();
}


在主函数执行SineGenerator生成指定频率的正弦数据
将第一批数据填充到audio_out_buffer,左右声道使用相同数据
执行BSP_AUDIO_OUT_Play函数播放声音
[C] 纯文本查看 复制代码
  //生成300Hz正弦波数据
  SineGenerator(300,AUDIO_SAMPLING_FREQUENCY);
  
  //将sinWave数据填充到DAC输出缓冲audio_out_buffer中
  for(i=0;i<AUDIO_OUT_BUF_LEN;i+=2)
  {
    audio_out_buffer[i] = sinWave[sinWaveIndex];
    audio_out_buffer[i+1] = sinWave[sinWaveIndex++];
    //如果数据超出sinWave范围则从0开始循环填充
    if(sinWaveIndex >= sinWaveLength) sinWaveIndex = 0;
  }
  //音频输出
  BSP_AUDIO_OUT_Play(PCM1774_X_0_handle,(uint16_t*)audio_out_buffer, AUDIO_OUT_BUF_LEN);


main.c代码使用STSW-STLKT01_V1.3.1例程修改
main.c (9.26 KB, 下载次数: 5)
虾扯蛋


回复

使用道具 举报

6690

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2017-10-28 14:05:23 | 显示全部楼层
虾哥 生成sin数据的代码是个处理器通用??

点评

代码还有点问题,高频时的波形会有失真,等改好后再发出来  详情 回复 发表于 2017-10-28 22:48
通用的,输出数据格式是int16  详情 回复 发表于 2017-10-28 14:28


回复

使用道具 举报

4560

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-10-28 14:28:07 | 显示全部楼层
常见泽1 发表于 2017-10-28 14:05
虾哥 生成sin数据的代码是个处理器通用??

通用的,输出数据格式是int16
虾扯蛋


回复

使用道具 举报

219

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-10-28 21:52:19 | 显示全部楼层


回复

使用道具 举报

4560

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-10-28 22:48:41 | 显示全部楼层
常见泽1 发表于 2017-10-28 14:05
虾哥 生成sin数据的代码是个处理器通用??

代码还有点问题,高频时的波形会有失真,等改好后再发出来

点评

正好要用到 还不知道怎么把虾哥的代码添加进来 后来虾哥更新了么  详情 回复 发表于 2017-12-4 18:44
虾扯蛋


回复

使用道具 举报

6690

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 2017-12-4 18:44:27 | 显示全部楼层
littleshrimp 发表于 2017-10-28 22:48
代码还有点问题,高频时的波形会有失真,等改好后再发出来

正好要用到 还不知道怎么把虾哥的代码添加进来 后来虾哥更新了么

点评

http://bbs.eeworld.com.cn/thread-590521-1-1.html  详情 回复 发表于 2017-12-4 19:31


回复

使用道具 举报

4560

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-12-4 19:31:06 | 显示全部楼层
常见泽1 发表于 2017-12-4 18:44
正好要用到 还不知道怎么把虾哥的代码添加进来 后来虾哥更新了么

http://bbs.eeworld.com.cn/thread-590521-1-1.html

点评

虾哥 正弦波产生了 但是我忽略了一个问题 我是要政府半轴的 单片机没有负电压  详情 回复 发表于 7 天前
虾扯蛋


回复

使用道具 举报

6690

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 7 天前 | 显示全部楼层
littleshrimp 发表于 2017-12-4 19:31
http://bbs.eeworld.com.cn/thread-590521-1-1.html

虾哥 正弦波产生了 但是我忽略了一个问题 我是要政府半轴的 单片机没有负电压

点评

你准备用它做什么?  详情 回复 发表于 7 天前


回复

使用道具 举报

4560

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 7 天前 | 显示全部楼层
常见泽1 发表于 2017-12-5 08:08
虾哥 正弦波产生了 但是我忽略了一个问题 我是要政府半轴的 单片机没有负电压

你准备用它做什么?

点评

模拟过零检测  详情 回复 发表于 7 天前
虾扯蛋


回复

使用道具 举报

6690

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 7 天前 | 显示全部楼层
littleshrimp 发表于 2017-12-5 13:25
你准备用它做什么?

模拟过零检测

点评

过零检测也用SensorTile做吗?  详情 回复 发表于 6 天前


回复

使用道具 举报

4560

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 6 天前 | 显示全部楼层

过零检测也用SensorTile做吗?

点评

不哦 只是做个测试源我是这么想的  详情 回复 发表于 6 天前
虾扯蛋


回复

使用道具 举报

6690

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

发表于 6 天前 | 显示全部楼层
littleshrimp 发表于 2017-12-6 10:34
过零检测也用SensorTile做吗?

不哦  只是做个测试源我是这么想的

点评

试试加个双电源放大器,或者在测量端使用虚地呢?  详情 回复 发表于 6 天前


回复

使用道具 举报

4560

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 6 天前 | 显示全部楼层
常见泽1 发表于 2017-12-6 10:41
不哦  只是做个测试源我是这么想的

试试加个双电源放大器,或者在测量端使用虚地呢?
虾扯蛋


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-12-12 12:39 , Processed in 1.464630 second(s), 17 queries , Redis On.

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