社区导航

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

[其他] SensorTile正弦波发生器

[复制链接]

5000

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

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

QQ图片20171028134634.png


生成sin数据的代码
  1. //生成sin数据
  2. void SineGenerator(float outFreq,float samplingFreq)
  3. {
  4. //输出数据索引
  5. uint16_t i;
  6. float tmp;
  7. //采样率除输出频率得到总样本数量
  8. uint16_t sampleLength = (uint16_t)(samplingFreq / outFreq);
  9. //分步角度
  10. float stepDegrees = 360.00 / (float)sampleLength ;
  11. //分步弧度
  12. stepDegrees = PI / 180.00 * stepDegrees;
  13. //游标移到起始处
  14. sinWaveLength = 0;
  15. //得到对应正弦数据
  16. for(i=0;i<sampleLength;i++)
  17. {
  18. //得到当前弧度
  19. tmp = stepDegrees* i;
  20. //得到对应的sin数据
  21. tmp = sin(tmp);
  22. //+0.5四舍五入
  23. sinWave[sinWaveLength++] = (int16_t)((tmp + 1)/2 * 65535 - 32768 + 0.5);
  24. }
  25. }
复制代码


在BSP_AUDIO_OUT_TransferComplete_CallBack和BSP_AUDIO_OUT_HalfTransfer_CallBack中断函数里循环填充正弦数据到输出缓冲区
  1. void BSP_AUDIO_OUT_TransferComplete_CallBack(void)
  2. {  
  3.   uint16_t i;
  4.   //将sinWave数据填充到DAC输出缓冲audio_out_buffer中
  5.   //播放完audio_out_buffer时填充后半部分
  6.   for(i=AUDIO_OUT_BUF_LEN/2;i<AUDIO_OUT_BUF_LEN;i+=2)
  7.   {
  8.     audio_out_buffer[i] = sinWave[sinWaveIndex];
  9.     audio_out_buffer[i+1] = sinWave[sinWaveIndex++];
  10.     //如果数据超出sinWave范围则从0开始循环填充
  11.     if(sinWaveIndex >= sinWaveLength) sinWaveIndex = 0;
  12.   }
  13.       __NOP();
  14. }

  15. /**
  16. * [url=home.php?mod=space&uid=159083]@brief[/url]  Manages the DMA Half Transfer complete event.
  17. * @retval None
  18. */
  19. void BSP_AUDIO_OUT_HalfTransfer_CallBack(void)
  20. {
  21.   uint16_t i;
  22.   //将sinWave数据填充到DAC输出缓冲audio_out_buffer中
  23.   //播放到audio_out_buffer一半的时候填充前半部分
  24.   for(i=0;i<AUDIO_OUT_BUF_LEN/2;i+=2)
  25.   {
  26.     audio_out_buffer[i] = sinWave[sinWaveIndex];
  27.     audio_out_buffer[i+1] = sinWave[sinWaveIndex++];
  28.     //如果数据超出sinWave范围则从0开始循环填充
  29.     if(sinWaveIndex >= sinWaveLength) sinWaveIndex = 0;
  30.   }
  31.       __NOP();
  32. }
复制代码


在主函数执行SineGenerator生成指定频率的正弦数据
将第一批数据填充到audio_out_buffer,左右声道使用相同数据
执行BSP_AUDIO_OUT_Play函数播放声音
  1.   //生成300Hz正弦波数据
  2.   SineGenerator(300,AUDIO_SAMPLING_FREQUENCY);
  3.   
  4.   //将sinWave数据填充到DAC输出缓冲audio_out_buffer中
  5.   for(i=0;i<AUDIO_OUT_BUF_LEN;i+=2)
  6.   {
  7.     audio_out_buffer[i] = sinWave[sinWaveIndex];
  8.     audio_out_buffer[i+1] = sinWave[sinWaveIndex++];
  9.     //如果数据超出sinWave范围则从0开始循环填充
  10.     if(sinWaveIndex >= sinWaveLength) sinWaveIndex = 0;
  11.   }
  12.   //音频输出
  13.   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)
虾扯蛋


回复

使用道具 举报

6774

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


回复

使用道具 举报

5000

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

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

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


回复

使用道具 举报

228

TA的帖子

1

TA的资源

一粒金砂(中级)

Rank: 2

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


回复

使用道具 举报

5000

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

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

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

点评

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


回复

使用道具 举报

6774

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


回复

使用道具 举报

5000

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

点评

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


回复

使用道具 举报

6774

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

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

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

点评

你准备用它做什么?  详情 回复 发表于 2017-12-5 13:25


回复

使用道具 举报

5000

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

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

你准备用它做什么?

点评

模拟过零检测  详情 回复 发表于 2017-12-5 15:44
虾扯蛋


回复

使用道具 举报

6774

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

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

模拟过零检测

点评

过零检测也用SensorTile做吗?  详情 回复 发表于 2017-12-6 10:34


回复

使用道具 举报

5000

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-12-6 10:34:55 | 显示全部楼层

过零检测也用SensorTile做吗?

点评

不哦 只是做个测试源我是这么想的  详情 回复 发表于 2017-12-6 10:41
虾扯蛋


回复

使用道具 举报

6774

TA的帖子

176

TA的资源

五彩晶圆(高级)

Rank: 9Rank: 9Rank: 9

测评达人

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

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

点评

试试加个双电源放大器,或者在测量端使用虚地呢?  详情 回复 发表于 2017-12-6 11:23


回复

使用道具 举报

5000

TA的帖子

9

TA的资源

版主

Rank: 6Rank: 6

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

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


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2018-5-26 14:26 , Processed in 0.357894 second(s), 19 queries , Gzip On, Redis On.

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