当前位置:   article > 正文

STM32-C语言生成sin正弦信号数据表并DAC输出正弦信号_stm32产生正弦信号的程序

stm32产生正弦信号的程序

1、在VC编写正弦数据生成正弦信号数据:角度从0到2π,即0到6.28,一个周期生成1024个数据点,数据点放大1600倍(正弦值最大值为1、最小值-1,所以要放大,嵌入式系统的DAC为12位(4096),最大可达3.3V,确保信号不失真,此处放大1600*2倍小于4096倍(dac没有负数值,需要转正数))。
 

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(void)
  4. {
  5. int i;
  6. char excle_tab = 0x9;//excle表格table键值
  7. short val;//用于<=16位 dac,24、32位改int
  8. FILE *fd = fopen("E:/sin_table.txt","wb+");
  9. float angle = 0;
  10. int cycle_cnt = 1024;//1个sin周期需要生成多少个数据
  11. float angle_step = (float)6.28 / cycle_cnt;//6.28为2π
  12. if(fd){
  13. for(angle = 0;angle <= 6.28;angle += angle_step){//0到2π
  14. //放大4096/2倍-12it-dac,防止失真可以小一些如1600
  15. //因为正弦从-1到1,间距值为2
  16. val = (float)sin(angle)*1600;
  17. fprintf(fd,"%6f",angle);
  18. fwrite(&excle_tab,1,1,fd);
  19. fprintf(fd,"%d\r\n",val);
  20. }
  21. fclose(fd);
  22. printf("fwrite ok\n");
  23. }
  24. }

得到数据在e盘目录下的sin_table.txt:

把数据复制放到excel表格,生成图表验证

2、把带有负数的正弦值转正数

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(void)
  4. {
  5. int i;
  6. char excle_tab = 0x9;//excle表格table键值
  7. short val;//用于<=16位 dac,24、32位改int
  8. FILE *fd = fopen("E:/sin_table.txt","wb+");
  9. float angle = 0;
  10. int cycle_cnt = 1024;//1个sin周期需要生成多少个数据
  11. float angle_step = (float)6.28 / cycle_cnt;//6.28为2π
  12. if(fd){
  13. for(angle = 0;angle <= 6.28;angle += angle_step){//0到2π
  14. //放大4096/2倍-12it-dac,防止失真可以小一些如1600
  15. //因为正弦从-1到1,间距值为2
  16. val = ((float)sin(angle) + 1)*1600;//把到负数的转正数
  17. fprintf(fd,"%6f",angle);
  18. fwrite(&excle_tab,1,1,fd);
  19. fprintf(fd,"%d\r\n",val);
  20. }
  21. fclose(fd);
  22. printf("fwrite ok\n");
  23. }
  24. }

生成全正数对比验证数据正确性

3、生成C十六进制数据、PCM-s16le的正数格式PCM数据使用在STM32-DAC:文件在E:/sin_table.txt,E:/sin_pcm.pcm。把sin_table.txt数据复制到STM32进行DAC输出正弦信号。

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(void)
  4. {
  5. int i = 0;
  6. char excle_tab = 0x9;//excle表格table键值
  7. short val;//用于<=16位 dac,24、32位改int
  8. FILE *fd = fopen("E:/sin_table.txt","wb+");
  9. FILE *fd1 = fopen("E:/sin_pcm.pcm","wb+");
  10. float angle = 0;
  11. int cycle_cnt = 1024;//1个sin周期需要生成多少个数据
  12. float angle_step = (float)6.28 / cycle_cnt;//6.28为2π
  13. if(fd && fd1){
  14. for(angle = 0;angle <= 6.28;angle += angle_step){//0到2π
  15. //放大4096/2倍-12it-dac,防止失真可以小一些如1600
  16. //因为正弦从-1到1,间距值为2
  17. val = ((float)sin(angle) + 1)*1600;//把到负数的转正数
  18. if(++i % 16 == 0){
  19. fprintf(fd,"\r\n");
  20. }
  21. fprintf(fd,"0x%04X ",val);//生成C数组的十六进制值
  22. fwrite(&val,1,2,fd1);//生成PCM文件二进制文件
  23. }
  24. fclose(fd);
  25. fclose(fd1);
  26. printf("fwrite ok\n");
  27. }
  28. }

5、生成C十六进制数据、PCM-s16le的正负数格式PCM数据使用在STM32-DAC:文件在E:/sin_table.txt,E:/sin_pcm.pcm。把sin_pcm.pcm数据复制到STM32进行IIS-PCM5102输出正弦信号。

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(void)
  4. {
  5. int i = 0;
  6. char excle_tab = 0x9;//excle表格table键值
  7. short val;//用于<=16位 dac,24、32位改int
  8. FILE *fd = fopen("E:/sin_table.txt","wb+");
  9. FILE *fd1 = fopen("E:/sin_pcm.pcm","wb+");
  10. float angle = 0;
  11. int cycle_cnt = 1024;//1个sin周期需要生成多少个数据
  12. short cycle_buf[1024];
  13. short *cycle_val = cycle_buf;
  14. float angle_step = (float)6.28 / cycle_cnt;//6.28为2π
  15. if(fd && fd1){
  16. for(angle = 0;angle <= 6.28;angle += angle_step){//0到2π
  17. //放大4096/2倍-12it-dac,防止失真可以小一些如1600
  18. //因为正弦从-1到1,间距值为2
  19. val = ((float)sin(angle))*10000;//正负数的正弦值
  20. *cycle_val++ = val;
  21. if(++i % 16 == 0){
  22. fprintf(fd,"\r\n");
  23. }
  24. fprintf(fd,"0x%04X ",val);//生成C数组的十六进制值
  25. fwrite(&val,1,2,fd1);//生成PCM文件二进制文件
  26. }
  27. for(i = 0; i < 10*1024*1024; i += 1024*2){//写10M的PCM数据
  28. fwrite(cycle_buf,1,sizeof(cycle_buf),fd1);//生成PCM文件二进制文件
  29. }
  30. fclose(fd);
  31. fclose(fd1);
  32. printf("fwrite ok\n");
  33. }
  34. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/454616
推荐阅读
相关标签
  

闽ICP备14008679号