基于AVR单片机的实时正弦表计算
yanli123212013/12/30软件综合 IP:天津
本帖最后由 yanli12321 于 2013-12-30 16:10 编辑

这几天刚开始学信号与系统,看到差分方程这块,突然再一次来了灵感:能不能搞出这么一个差分方程,使得他的通解为y(k)=sin(kβ)?
然后就是一下午的计算..............................................
终于搞出这么个东西
推导1.jpg
从数学角度讲呢,就是如果已知一个以β角步进的正弦表的某连续两位的值和cosβ,就可以通过这个很简单的运算得到下一位的值,以此类推,就可以得出整个正弦表。
通俗一点讲呢,这个相当于模拟LC振荡,把实时得到的数据当做正弦表输出。
推出这个东西激动了好久,星期天专门做了一次试验,看看能不能用这个思路给AVR单片机编个SPWM程序。
然后又是一天的编程..........................................
中间出现了无数奇葩波形,比如
波形1.jpg
再比如
波形2.jpg
最后...........终于搞正常了
成功.jpg
这个波形是ATMEGA16在12M晶振下实现的256点正弦表计算,算出的数据送至硬件PWM输出,再示波器数字滤波得到的。
事实证明,我的思路是可行的,但事实同时证明了我这个算法在节约大量ROM的同时占掉了CPU的绝大部分资源,因为程序的核心部分全部是浮点计算..........avr几乎拼了老命才算出这个正弦表,不过速度依然比自带的三角库函数快得多。
最后,附上代码,编译环境为GCCAVR,通过修改n值可以得到采样点数为2n的正弦表,注意n最好不要大于128,否则AVR可能算不过来。
+100  科创币    金坷居士    2013/12/30 高质量发帖
+25  科创币    张静茹    2013/12/30 高质量发帖 加精
+20  科创币    量子隧道    2013/12/30 高质量发帖
来自:计算机科学 / 软件综合
11
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
金坷居士
11年1个月前 IP:未同步
660552
本帖最后由 金坷居士 于 2013-12-30 16:28 编辑

沙发 非常好的算法 不过对于低端单片机不如查表实用 相信这个算法在STM32和DSP上会有更好的表现!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
duweitao
11年1个月前 IP:未同步
660553
赞楼主的创新精神。
正弦信号合成是通信和信号处理领域最基础的话题之一,在诸如,信号源,数字本振,正交变换的基函数生成等方面均有广泛用途。而以上这些又都是通信、仪表、信号处理、雷达电子对抗等领域的基础。
用数字方法来合成正弦信号通常有以下2种方法。
1、波表合成法,即DDS方法,其中包括最基本的全波形查表,对称性波形查表,以及线性插值合成技术,这个方法里面的矛盾是,如果使用插值技术则会用到乘法器,会使得电路的主频下降,但是如果不使用插值技术,ROM表的尺寸会非常巨大,造成可观的功耗。关于DDS的原理和测量、评价方法,比较好的文档是 ADI公司的  A Technical Tutorial on Digital Signal Synthesis 网上有电子版下载。
2、另一种方法是CORDIC的方法,这种方法采用的是坐标旋转技术,这是早年的老式计算器用来计算三角函数和超越函数的办法,以及传统的C语言中math.h的方法,这个方法的优点是不用ROM,不用乘法器,仅使用加法减法和移位,如果计算速度要求不高,可以算的非常精准(代价是算的很慢),我小时候体验过用手持计算器计算正弦函数的漫长等待。这方面的比较经典的文章是,A survey of CORDIC algorithms for FPGA based computers 。是个开信号处理咨询公司的老外写的。

另外,在没有硬件浮点乘法器的CPU上,如果对计算速度有要求,最好还是把算法定点化,如果优化的好一点,甚至可以提升一个数量级的执行速度。

祝好
+40
科创币
yanli12321
2013-12-30
感谢分享
+15
科创币
量子隧道
2013-12-30
感谢分享
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
logic.pn
11年1个月前 IP:未同步
660590
这是一对共轭极点在单位圆上的IIR。给一个激励,就会自己振起来。
用于数字系统中会有截断误差,导致极点不精确的放置在单位圆上面,结果就是随着时间的推移,幅度慢慢的增长或者收缩。。。
不过赞扬楼主的创新精神!
+1
科创币
yanli12321
2013-12-30
谢谢提醒,我考虑到了,每计算一个周期清零重新开始计算,在中断函数里
+15
科创币
量子隧道
2013-12-30
鼓励交流
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
量子隧道
11年1个月前 IP:未同步
660600
撸主的推导和实验都很精彩。
几位讨论得也很精彩。
江山代有才人出[s:1]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
miles
11年1个月前 IP:未同步
660609
cordic的方式很好
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
张静茹
11年1个月前 IP:未同步
662188
把程序注释一下吧~~~~
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yanli12321作者
11年1个月前 IP:未同步
662286
张静茹 发表于 2014-1-9 18:50
把程序注释一下吧~~~~


偷懒了.................过几天我会试试定点计算,到时候会加上注释........
引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
fhx1234
11年0个月前 IP:未同步
667966
赞一个
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
nibafo
9年9个月前 IP:上海
762990
ding  ding  ding
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
skyluocan
8年11个月前 IP:广东
810304
厉害
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
yanli12321
学者 机友 笔友
文章
47
回复
1182
学术分
3
2012/03/04注册,6天8时前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}