发新帖我要提问
123
返回列表
打印
[STM32F0]

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

[复制链接]
楼主: yjmwxwx
手机看帖
扫描二维码
随时随地手机跟帖
41
qiufengsd| | 2017-2-22 23:02 | 只看该作者 回帖奖励 |倒序浏览
应该是产生的函数有问题。

使用特权

评论回复
42
qiufengsd| | 2017-2-22 23:05 | 只看该作者
看一下楼主你的正弦波的函数怎么写的?

使用特权

评论回复
43
yjmwxwx|  楼主 | 2017-2-23 07:57 | 只看该作者
zjh2009 发表于 2017-2-22 21:29
我觉得是示波器的问题。为了证明这个你的波形在变化时,调整示波器去的范围。让它能包裹几个周期的波形,然 ...

随然我的示波器探头是根音频线串的1M的电阻,但是我还有个设备,是个收音机里面的电源变压器,次级接的耳机初级测量, 听着声音有哒哒声,慢慢改变频率没有哒哒声, 快速扫频就有问题。

使用特权

评论回复
44
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

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

    if (argc != 7) {
        fprintf(stderr,"Generate C source code for sine table\n");
        fprintf(stderr,"Usage:\n");
        fprintf(stderr,"sinus_gen entries entries_per_2PI phase amplitude offset data_per_line >outputfile\n\n");
        fprintf(stderr,"entries         : number of entries in sine table\n");
        fprintf(stderr,"entries_per_2PI : number of samples within full 360 degree\n");
        fprintf(stderr,"phase           : phase offset in samples\n");
        fprintf(stderr,"amplitude       : amplitude of sine wave, integer\n");
        fprintf(stderr,"offset          : offset of sine wave, integer\n");
        fprintf(stderr,"data_per_line   : number of samples per line in source file\n");
        fprintf(stderr,">outputfile     : redirect output form terminal to file\n");
        return 1;
    }

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

    min = abs(offset - amplitude);
    max = abs(offset + amplitude);

    max_digits=2;
    if (min > 99   || max > 99)   max_digits=3;
    if (min > 999  || max > 999)  max_digits=4;
    if (min > 9999 || max > 9999) max_digits=5;

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

    for (i=0, j=0; i<entries; i++) {
        switch(max_digits) {
            case 2: printf("%3d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/*3))); break;
            case 3: printf("%4d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/entries_2PI))); break;
            case 4: printf("%5d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/entries_2PI))); break;
            case 5: printf("%6d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/entries_2PI))); break;
        }
        if (i < (entries-1)) {
            printf(", ");
        }
        j++;
        if (j==data_per_line) {
            if (i < (entries-1)) {
                printf("\n\t");
            } else {
                printf("\n");
            }
            j=0;
        }
    }
    if (j !=0) printf("\n");

    // footer
    printf("};\n");

    return 0;
}


程序2

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

//Print out sin(x) vs fp CORDIC sin(x)
int main(int argc, char **argv)
{
    double p;
    int s,c;
    int i;   
    for(i=0;i<50;i++)
    {
        p = (i/50.0)*M_PI/2;        
        //use 32 iterations
        cordic((p*MUL), &s, &c, 16);
        //these values should be nearly equal
        printf("%f : %f\n", s/MUL, sin(p));
    }      
}


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

void cordic(int theta, int *s, int *c, int n)
{
  int k, d, tx, ty, tz;
  int x=cordic_1K,y=0,z=theta;
  n = (n>CORDIC_NTAB) ? CORDIC_NTAB : n;
  for (k=0; k<n; ++k)
  {
    d = z>>15;
    //get sign. for other architectures, you might want to use the more portable version
    //d = z>=0 ? 0 : -1;
    tx = x - (((y>>k) ^ d) - d);
    ty = y + (((x>>k) ^ d) - d);
    tz = z - ((cordic_ctab[k] ^ d) - d);
    x = tx; y = ty; z = tz;
  }  
*c = x; *s = y;
}







使用特权

评论回复
45
zjglizhen| | 2017-2-23 09:28 | 只看该作者
hao wan

使用特权

评论回复
46
yjmwxwx|  楼主 | 2017-2-23 12:21 | 只看该作者
本帖最后由 yjmwxwx 于 2017-2-23 12:27 编辑

谢谢大家,经过大家的帮助问题解决了, 问题出在DMA上, 一个周期还没完,DMA还没减到0就强行初始化DMA

使用特权

评论回复
47
yjmwxwx|  楼主 | 2017-2-23 13:00 | 只看该作者


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


使用特权

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

恭喜你解决问题了。但是我不太明白你的每个波形写入DMA的数据量是不同的吗?

使用特权

评论回复
49
yjmwxwx|  楼主 | 2017-2-23 21:08 | 只看该作者
本帖最后由 yjmwxwx 于 2017-2-23 21:32 编辑
zjh2009 发表于 2017-2-23 20:41
恭喜你解决问题了。但是我不太明白你的每个波形写入DMA的数据量是不同的吗? ...

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则