打印
[STM32F0]

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

[复制链接]
4851|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yjmwxwx|  楼主 | 2017-2-19 00:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yjmwxwx 于 2017-2-19 00:58 编辑



用的是STM32F030F4P6,在定时器中断里面实时计算正弦, 频率高了分辨率不够了,波形很难看。



沙发
sky.sun.zz| | 2017-2-19 07:40 | 只看该作者
是你的正弦波数据有误引起的。直接套用官方例程就会出现这个问题。

使用特权

评论回复
板凳
yjmwxwx|  楼主 | 2017-2-19 14:34 | 只看该作者
sky.sun.zz 发表于 2017-2-19 07:40
是你的正弦波数据有误引起的。直接套用官方例程就会出现这个问题。

经过你的提醒我才想起来还有电机库,于是下载了个叫STSW-STM32100        4.3.0的文件,安装以后在文件夹里找到一个名叫STO_CORDIC_SpeednPosFdbkClass.o 的文件,凭感觉这里面有正弦波的核心算法, 没学过电机库。。

这个文件有没有C语言的?

使用特权

评论回复
地板
1223657347| | 2017-2-19 16:50 | 只看该作者
直接计算三角函数自然是慢,何不查表?。如果非要计算三角函数,可以用arm提供的dsp库,比编译器自带的math库快些。

使用特权

评论回复
5
icecut| | 2017-2-19 17:04 | 只看该作者
查表就行了.

使用特权

评论回复
6
734774645| | 2017-2-19 17:48 | 只看该作者
用的DAC吗?分辨率是多少?你计算时候保留了多少位?

使用特权

评论回复
7
yjmwxwx|  楼主 | 2017-2-19 18:01 | 只看该作者

最近在学这方面的东西,查表法固定频率的学会了,但是怎么改变频率啊? 比如步长0.1HZ ?

使用特权

评论回复
8
yjmwxwx|  楼主 | 2017-2-19 18:13 | 只看该作者
本帖最后由 yjmwxwx 于 2017-2-19 18:18 编辑
1223657347 发表于 2017-2-19 16:50
直接计算三角函数自然是慢,何不查表?。如果非要计算三角函数,可以用arm提供的dsp库,比编译器自带的math ...

在网上抄了个CORDIC算法, 但是算出来数很大放不到定时器里,非要用乘除法,用移位法计算乘除频率步长太长了。
M0没硬件除法,算一个除法时间比算正弦还慢。 没办法降低精度结果波形很难看。 还有个毛病定时器中断里面计算,如果小于10跟本来不及计算,中断速度太快了

使用特权

评论回复
9
yjmwxwx|  楼主 | 2017-2-19 18:17 | 只看该作者
734774645 发表于 2017-2-19 17:48
用的DAC吗?分辨率是多少?你计算时候保留了多少位?

用的定时器, 一个周期最少50个点

使用特权

评论回复
10
yjmwxwx|  楼主 | 2017-2-19 18:33 | 只看该作者
//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 0x000026DD
#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;
}
网上找的计算正弦的程序,0到90度就25734个点,没办法降低MUL,cordic_ctab里面也跟着减小,精度又不够了。  没硬件除法怎么办? 移位法精度不够

使用特权

评论回复
11
734774645| | 2017-2-19 18:49 | 只看该作者
yjmwxwx 发表于 2017-2-19 18:17
用的定时器, 一个周期最少50个点

50个点应该不够吧,你按照8位的算一个周期也要出来256个点看着才圆滑。

使用特权

评论回复
12
598330983| | 2017-2-19 18:53 | 只看该作者
建议按照楼上说的,你就当8BIT的用,那也要出来256个点作为一个周期。

使用特权

评论回复
13
sky.sun.zz| | 2017-2-19 19:57 | 只看该作者
本帖最后由 sky.sun.zz 于 2017-2-19 19:58 编辑
yjmwxwx 发表于 2017-2-19 14:34
经过你的提醒我才想起来还有电机库,于是下载了个叫STSW-STM32100        4.3.0的文件,安装以后在文件夹里找到 ...

那么多网友都说得好,查表就行了。
这是用查表方式的DAC供参考,官方的附件里的正弦波数据就是有误,修改过才能用。

OPAMP_PGA.rar (18.76 KB)

使用特权

评论回复
14
yjmwxwx|  楼主 | 2017-2-19 20:17 | 只看该作者
sky.sun.zz 发表于 2017-2-19 19:57
那么多网友都说得好,查表就行了。
这是用查表方式的DAC供参考,官方的附件里的正弦波数据就是有误,修改 ...

谢谢资料。
看样子还是查表最好啊

使用特权

评论回复
15
yjmwxwx|  楼主 | 2017-2-19 20:22 | 只看该作者
598330983 发表于 2017-2-19 18:53
建议按照楼上说的,你就当8BIT的用,那也要出来256个点作为一个周期。

好 我照楼上的试试

使用特权

评论回复
16
yjmwxwx|  楼主 | 2017-2-19 20:33 | 只看该作者
ST那个PMSM 4.3手册看不懂啊,不懂英文看机械翻译版更看不懂。。
机械翻译版

https://pan.baidu.com/s/1dE38xDR

ST电机库里哪个函数有这个功能,我想把它拿出来。

使用特权

评论回复
17
shcshc1234| | 2017-2-19 21:36 | 只看该作者
yjmwxwx 发表于 2017-2-19 14:34
经过你的提醒我才想起来还有电机库,于是下载了个叫STSW-STM32100        4.3.0的文件,安装以后在文件夹里找到 ...

spwm 弄一个一个0-1/2pi的表 正这刷然后反着刷 翻转极性正这刷反着刷
用硬件pwm 开互补+死区直接推桥不就得了
调整频率的话 刷得快频率不就高了么

使用特权

评论回复
18
icecut| | 2017-2-19 23:04 | 只看该作者
还是用更快的 mcu 吧

使用特权

评论回复
19
xyz549040622| | 2017-2-19 23:09 | 只看该作者
感觉是你算法的问题。

使用特权

评论回复
20
qjp1988113| | 2017-2-20 08:32 | 只看该作者
我去,这样的波形明显是数据错误

使用特权

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

本版积分规则

117

主题

2719

帖子

47

粉丝