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

[复制链接]
6245|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库快些。
icecut 发表于 2017-2-19 17:04 | 显示全部楼层
查表就行了.
734774645 发表于 2017-2-19 17:48 | 显示全部楼层
用的DAC吗?分辨率是多少?你计算时候保留了多少位?
 楼主| yjmwxwx 发表于 2017-2-19 18:01 | 显示全部楼层

最近在学这方面的东西,查表法固定频率的学会了,但是怎么改变频率啊? 比如步长0.1HZ ?
 楼主| yjmwxwx 发表于 2017-2-19 18:13 | 显示全部楼层
本帖最后由 yjmwxwx 于 2017-2-19 18:18 编辑
1223657347 发表于 2017-2-19 16:50
直接计算三角函数自然是慢,何不查表?。如果非要计算三角函数,可以用arm提供的dsp库,比编译器自带的math ...

在网上抄了个CORDIC算法, 但是算出来数很大放不到定时器里,非要用乘除法,用移位法计算乘除频率步长太长了。
M0没硬件除法,算一个除法时间比算正弦还慢。 没办法降低精度结果波形很难看。 还有个毛病定时器中断里面计算,如果小于10跟本来不及计算,中断速度太快了
 楼主| yjmwxwx 发表于 2017-2-19 18:17 | 显示全部楼层
734774645 发表于 2017-2-19 17:48
用的DAC吗?分辨率是多少?你计算时候保留了多少位?

用的定时器, 一个周期最少50个点
 楼主| yjmwxwx 发表于 2017-2-19 18:33 | 显示全部楼层
  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 0x000026DD
  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. }
网上找的计算正弦的程序,0到90度就25734个点,没办法降低MUL,cordic_ctab里面也跟着减小,精度又不够了。  没硬件除法怎么办? 移位法精度不够
734774645 发表于 2017-2-19 18:49 | 显示全部楼层
yjmwxwx 发表于 2017-2-19 18:17
用的定时器, 一个周期最少50个点

50个点应该不够吧,你按照8位的算一个周期也要出来256个点看着才圆滑。
598330983 发表于 2017-2-19 18:53 | 显示全部楼层
建议按照楼上说的,你就当8BIT的用,那也要出来256个点作为一个周期。
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, 下载次数: 9)

 楼主| yjmwxwx 发表于 2017-2-19 20:17 | 显示全部楼层
sky.sun.zz 发表于 2017-2-19 19:57
那么多网友都说得好,查表就行了。
这是用查表方式的DAC供参考,官方的附件里的正弦波数据就是有误,修改 ...

谢谢资料。
看样子还是查表最好啊
 楼主| yjmwxwx 发表于 2017-2-19 20:22 | 显示全部楼层
598330983 发表于 2017-2-19 18:53
建议按照楼上说的,你就当8BIT的用,那也要出来256个点作为一个周期。

好 我照楼上的试试
 楼主| yjmwxwx 发表于 2017-2-19 20:33 | 显示全部楼层
ST那个PMSM 4.3手册看不懂啊,不懂英文看机械翻译版更看不懂。。
机械翻译版

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

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

shcshc1234 发表于 2017-2-19 21:36 | 显示全部楼层
yjmwxwx 发表于 2017-2-19 14:34
经过你的提醒我才想起来还有电机库,于是下载了个叫STSW-STM32100        4.3.0的文件,安装以后在文件夹里找到 ...

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

icecut 发表于 2017-2-19 23:04 | 显示全部楼层
还是用更快的 mcu 吧
xyz549040622 发表于 2017-2-19 23:09 | 显示全部楼层
感觉是你算法的问题。
qjp1988113 发表于 2017-2-20 08:32 | 显示全部楼层
我去,这样的波形明显是数据错误
您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

2958

帖子

54

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