[STM32F0] M0生成正弦波,波形很差怎么办?

[复制链接]
6361|48
qiufengsd 发表于 2017-2-22 23:02 | 显示全部楼层
应该是产生的函数有问题。
qiufengsd 发表于 2017-2-22 23:05 | 显示全部楼层
看一下楼主你的正弦波的函数怎么写的?
 楼主| yjmwxwx 发表于 2017-2-23 07:57 | 显示全部楼层
zjh2009 发表于 2017-2-22 21:29
我觉得是示波器的问题。为了证明这个你的波形在变化时,调整示波器去的范围。让它能包裹几个周期的波形,然 ...

随然我的示波器探头是根音频线串的1M的电阻,但是我还有个设备,是个收音机里面的电源变压器,次级接的耳机初级测量, 听着声音有哒哒声,慢慢改变频率没有哒哒声, 快速扫频就有问题。
 楼主| yjmwxwx 发表于 2017-2-23 08:47 | 显示全部楼层
qiufengsd 发表于 2017-2-22 23:05
看一下楼主你的正弦波的函数怎么写的?

在38楼已经贴出来, 虽然在学C语言但是不会写啊,只会写个hello world , 但是能看懂点了。

我是把下面这两个程序结合起来了,放到我的程序里了。 结果能和程序1和这个网页版本对应起来
网页版正弦表计算:
http://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml



程序1
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>

  5. int main(int argc,char *argv[])
  6. {
  7.     int entries, entries_2PI, phase, amplitude, offset, data_per_line;
  8.     int i, j;
  9.     int max, min, max_digits;

  10.     if (argc != 7) {
  11.         fprintf(stderr,"Generate C source code for sine table\n");
  12.         fprintf(stderr,"Usage:\n");
  13.         fprintf(stderr,"sinus_gen entries entries_per_2PI phase amplitude offset data_per_line >outputfile\n\n");
  14.         fprintf(stderr,"entries         : number of entries in sine table\n");
  15.         fprintf(stderr,"entries_per_2PI : number of samples within full 360 degree\n");
  16.         fprintf(stderr,"phase           : phase offset in samples\n");
  17.         fprintf(stderr,"amplitude       : amplitude of sine wave, integer\n");
  18.         fprintf(stderr,"offset          : offset of sine wave, integer\n");
  19.         fprintf(stderr,"data_per_line   : number of samples per line in source file\n");
  20.         fprintf(stderr,">outputfile     : redirect output form terminal to file\n");
  21.         return 1;
  22.     }

  23.     entries = atoi(argv[1]);       //180
  24.     entries_2PI = atoi(argv[2]);   //180
  25.     phase = atoi(argv[3]);        // 0
  26.     amplitude = atoi(argv[4]);     // 20
  27.     offset = atoi(argv[5]);        // 20
  28.     data_per_line = atoi(argv[6]); // 输出多少行

  29.     min = abs(offset - amplitude);
  30.     max = abs(offset + amplitude);

  31.     max_digits=2;
  32.     if (min > 99   || max > 99)   max_digits=3;
  33.     if (min > 999  || max > 999)  max_digits=4;
  34.     if (min > 9999 || max > 9999) max_digits=5;

  35.     // header
  36.     printf("const int sinus[%d] = {\n\t", entries);

  37.     for (i=0, j=0; i<entries; i++) {
  38.         switch(max_digits) {
  39.             case 2: printf("%3d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/*3))); break;
  40.             case 3: printf("%4d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/entries_2PI))); break;
  41.             case 4: printf("%5d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/entries_2PI))); break;
  42.             case 5: printf("%6d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/entries_2PI))); break;
  43.         }
  44.         if (i < (entries-1)) {
  45.             printf(", ");
  46.         }
  47.         j++;
  48.         if (j==data_per_line) {
  49.             if (i < (entries-1)) {
  50.                 printf("\n\t");
  51.             } else {
  52.                 printf("\n");
  53.             }
  54.             j=0;
  55.         }
  56.     }
  57.     if (j !=0) printf("\n");

  58.     // footer
  59.     printf("};\n");

  60.     return 0;
  61. }


程序2

  1. #include "cordic-16bit.h"
  2. #include <math.h> // for testing only!

  3. //Print out sin(x) vs fp CORDIC sin(x)
  4. int main(int argc, char **argv)
  5. {
  6.     double p;
  7.     int s,c;
  8.     int i;   
  9.     for(i=0;i<50;i++)
  10.     {
  11.         p = (i/50.0)*M_PI/2;        
  12.         //use 32 iterations
  13.         cordic((p*MUL), &s, &c, 16);
  14.         //these values should be nearly equal
  15.         printf("%f : %f\n", s/MUL, sin(p));
  16.     }      
  17. }


cordic-16bit.h
  1. //Cordic in 16 bit signed fixed point math
  2. //Function is valid for arguments in range -pi/2 -- pi/2
  3. //for values pi/2--pi: value = half_pi-(theta-half_pi) and similarly for values -pi---pi/2
  4. //
  5. // 1.0 = 16384
  6. // 1/k = 0.6072529350088812561694
  7. // pi = 3.1415926536897932384626
  8. //Constants
  9. #define cordic_1K 10000
  10. #define half_pi 0x00006487
  11. #define MUL 16384.000000
  12. #define CORDIC_NTAB 16
  13. int cordic_ctab [] = {0x00003243, 0x00001DAC, 0x00000FAD, 0x000007F5, 0x000003FE, 0x000001FF, 0x000000FF, 0x0000007F, 0x0000003F, 0x0000001F, 0x0000000F, 0x00000007, 0x00000003, 0x00000001, 0x00000000, 0x00000000, };

  14. void cordic(int theta, int *s, int *c, int n)
  15. {
  16.   int k, d, tx, ty, tz;
  17.   int x=cordic_1K,y=0,z=theta;
  18.   n = (n>CORDIC_NTAB) ? CORDIC_NTAB : n;
  19.   for (k=0; k<n; ++k)
  20.   {
  21.     d = z>>15;
  22.     //get sign. for other architectures, you might want to use the more portable version
  23.     //d = z>=0 ? 0 : -1;
  24.     tx = x - (((y>>k) ^ d) - d);
  25.     ty = y + (((x>>k) ^ d) - d);
  26.     tz = z - ((cordic_ctab[k] ^ d) - d);
  27.     x = tx; y = ty; z = tz;
  28.   }  
  29. *c = x; *s = y;
  30. }







zjglizhen 发表于 2017-2-23 09:28 | 显示全部楼层
 楼主| yjmwxwx 发表于 2017-2-23 12:21 | 显示全部楼层
本帖最后由 yjmwxwx 于 2017-2-23 12:27 编辑

谢谢大家,经过大家的帮助问题解决了, 问题出在DMA上, 一个周期还没完,DMA还没减到0就强行初始化DMA
 楼主| yjmwxwx 发表于 2017-2-23 13:00 | 显示全部楼层


看波形已经没问题了,但是接上我的变压器耳机听,频率高了还是有点杂音,有的地方还是设置的有问题,但是波形已经看不出来了。


zjh2009 发表于 2017-2-23 20:41 | 显示全部楼层
本帖最后由 zjh2009 于 2017-2-23 20:43 编辑
yjmwxwx 发表于 2017-2-23 07:57
随然我的示波器探头是根音频线串的1M的电阻,但是我还有个设备,是个收音机里面的电源变压器,次级接的耳 ...

恭喜你解决问题了。但是我不太明白你的每个波形写入DMA的数据量是不同的吗?
 楼主| yjmwxwx 发表于 2017-2-23 21:08 | 显示全部楼层
本帖最后由 yjmwxwx 于 2017-2-23 21:32 编辑
zjh2009 发表于 2017-2-23 20:41
恭喜你解决问题了。但是我不太明白你的每个波形写入DMA的数据量是不同的吗? ...

问题提的好, 最后这两个视频里程序确实没改点数, 前面的那些视频里面是点数和幅度一块扫。  确实不改点数没必要改DMA, 但是我想点数幅度一块扫,现在知道问题出在哪里就好解决啦。想想确实没什么用,不改点数一般也够用。 兄弟眼睛真尖锐
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部