文号
t63198
阅读
26821
回复
11
收藏
11
基于AVR单片机的实时正弦表计算
2013/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
高质量发帖
yanli12321作者
12年11个月前IP:未同步
662286
7楼
张静茹 发表于 2014-1-9 18:50
把程序注释一下吧~~~~


偷懒了.................过几天我会试试定点计算,到时候会加上注释........
引用
评论
1
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的