矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 3454|回复: 12

不怕笑话问个C语言生成单片机正弦表的问题

[复制链接]
     
发表于 2017-1-19 16:45:21 | 显示全部楼层 |阅读模式
本帖最后由 yjmwxwx 于 2017-1-19 16:48 编辑

以前没玩过生成正弦波,我数学小学5年级水平看不懂公式,更不会使用 Math。自己算不了只能找现成的了,于是放狗搜索找到一个在
线的,是外国一个制作设备的公司提供的,矿坛不准发连接于是每法发,比应搜索 Sine Look Up Table Generator Calculator 就能搜索
到。
后来又找了一个,不过是命令行的没有界面,他这个还有源码。 科班的别笑我,我不会写也不会算只能找别人的。


  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <string.h>

  4. #include <math.h>



  5. int main(int argc,char *argv[])

  6. {

  7.     int entries, entries_2PI, phase, amplitude, offset, data_per_line;

  8.     int i, j;

  9.     int max, min, max_digits;



  10.     if (argc != 7) {

  11.         fprintf(stderr,"Generate C source code for sine table\n");

  12.         fprintf(stderr,"Usage:\n");

  13.         fprintf(stderr,"sinus_gen entries entries_per_2PI phase amplitude offset data_per_line >outputfile\n\n");

  14.         fprintf(stderr,"entries         : number of entries in sine table\n");

  15.         fprintf(stderr,"entries_per_2PI : number of samples within full 360 degree\n");

  16.         fprintf(stderr,"phase           : phase offset in samples\n");

  17.         fprintf(stderr,"amplitude       : amplitude of sine wave, integer\n");

  18.         fprintf(stderr,"offset          : offset of sine wave, integer\n");

  19.         fprintf(stderr,"data_per_line   : number of samples per line in source file\n");

  20.         fprintf(stderr,">outputfile     : redirect output form terminal to file\n");

  21.         return 1;

  22.     }



  23.     entries = atoi(argv[1]);

  24.     entries_2PI = atoi(argv[2]);

  25.     phase = atoi(argv[3]);

  26.     amplitude = atoi(argv[4]);

  27.     offset = atoi(argv[5]);

  28.     data_per_line = atoi(argv[6]);



  29.     min = abs(offset - amplitude);

  30.     max = abs(offset + amplitude);



  31.     max_digits=2;

  32.     if (min > 99   || max > 99)   max_digits=3;

  33.     if (min > 999  || max > 999)  max_digits=4;

  34.     if (min > 9999 || max > 9999) max_digits=5;



  35.     // header

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



  37.     for (i=0, j=0; i<entries; i++) {

  38.         switch(max_digits) {

  39.             case 2: printf("%3d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/entries_2PI))); break;

  40.             case 3: printf("%4d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/entries_2PI))); break;

  41.             case 4: printf("%5d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/entries_2PI))); break;

  42.             case 5: printf("%6d", (int)(offset + amplitude*sin((phase+i)*2*3.1415927/entries_2PI))); break;

  43.         }

  44.         if (i < (entries-1)) {

  45.             printf(", ");

  46.         }

  47.         j++;

  48.         if (j==data_per_line) {

  49.             if (i < (entries-1)) {

  50.                 printf("\n\t");

  51.             } else {

  52.                 printf("\n");

  53.             }

  54.             j=0;

  55.         }

  56.     }

  57.     if (j !=0) printf("\n");



  58.     // footer

  59.     printf("};\n");



  60.     return 0;

  61. }
复制代码



可执行程序后面跟着7个参数不知道是什么,我用在线翻译也不懂是什么意思,求学过C语言的解释。我想问的就是这个问题。



不过经过我摸索比如我想生成 180个点的表。
第1个和第2个参数都填 180、
第3个相偏移是0、
第4个第5个是单片机定时器里放的数除2, 比如定时器里放40这里就填20
第6个是表有多少列

./a.out 180 180 0 20 20 8

截图_2017-01-19_15-57-53.png

WINDOWS版不知道为什么运行不起来,我的是精简XP,自己查下有没有病毒,我没装杀毒
Sinus_gen.zip (45.71 KB, 下载次数: 104)

放到单片机里面实验一下, 我用的是STM32F030F4P6,便宜2元多。 我的这个片子8M晶振,PLL 14 倍频,工作还算稳定

图片 001.jpg

图片 007.jpg

图片 002.jpg

图片 006.jpg

图片 003.jpg

图片 004.jpg

图片 005.jpg

下面这个程序是用了1024个点的, 定时器里放1024,DMA数据1024个。 不会计算频率, 瞎算一个 112000000 / 1024 / 1024 = 106.xxx HZ

RC滤波电路是 100欧和104电容,在线算的15000HZ截止频率,我不懂是什么意思。  

PA10和PB1两路互补输出。

自己写的单片机小程序,不会C语言只能汇编了,网上也找不到参考的代码,只能瞎写了。。

STM32F030F4P6正弦波.zip (8.13 KB, 下载次数: 95)

查表不是办法,还得让单片机自己算。 第二个问题是 CORDIC算法什么原理? 网上讲的一片公式,对于我这小学数学的实在看不懂。
老外网站上找了个可以算正弦的已经可以算出来了,听说这个算法很快?  别笑我哦,只是瞎搞水平很低,现在学什么都学不进去。
我只会到地里打个药锄个草什么的。


CORDIC.zip (5.66 KB, 下载次数: 91)


评分

3

查看全部评分

     
发表于 2017-1-19 16:58:18 | 显示全部楼层
这简陋的环境简直了,居然还有示波器
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-1-19 16:59:55 | 显示全部楼层
sw5188 发表于 2017-1-19 16:58
这简陋的环境简直了,居然还有示波器

去年在本坛150元买的,吃了一年灰
回复 支持 反对

使用道具 举报

     
发表于 2017-1-19 19:14:37 | 显示全部楼层
yjmwxwx 发表于 2017-1-19 16:59
去年在本坛150元买的,吃了一年灰

你这环境跟一乐的社建**有点象,照片像素也象,不知是否同一人
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-1-19 19:18:40 | 显示全部楼层
sw5188 发表于 2017-1-19 19:14
你这环境跟一乐的社建**有点象,照片像素也象,不知是否同一人

不是啦,俺村一个和我环境差不多的着火烧死了,屋顶都塌了
回复 支持 反对

使用道具 举报

     
发表于 2017-1-19 22:25:43 | 显示全部楼层
我有点好奇你弄这是为啥,想弄个产品谋生还是只为了兴趣,这环境和这技术反差有点大我有点晕乎了
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2017-1-19 22:54:32 | 显示全部楼层
sw5188 发表于 2017-1-19 22:25
我有点好奇你弄这是为啥,想弄个产品谋生还是只为了兴趣,这环境和这技术反差有点大我有点晕乎了

就是为了消磨时间,在家闲着没事情,家里蹲也没工作,玩游戏玩够了。 偶尔玩一下单片机,钱花不少啥也做不出来。
回复 支持 反对

使用道具 举报

     
发表于 2017-1-19 23:13:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

发表于 2017-1-21 14:50:47 | 显示全部楼层
本帖最后由 xiaolaba 于 2017-1-21 14:58 编辑

cordic 真要理解的話
小學程度應該有難度
不過連這專門的名詞都搜到
看來再用點力氣就可以了
真有興趣看看這個, DDS 有關的, 玩得過就小學畢業了
http://archive.is/TIF88
http://wp.me/ph3BR-hj

如果只要理解 SINE TABLE 如何建立
看看這圖是否有幫助



回复 支持 反对

使用道具 举报

     
发表于 2017-1-21 22:32:39 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2017-1-22 08:35:23 | 显示全部楼层
这个厉害,我也才开始玩51单片机。
回复 支持 反对

使用道具 举报

     
发表于 2017-1-23 16:14:07 | 显示全部楼层
原来古墓派传人转行修炼单片机神功啦!
回复 支持 反对

使用道具 举报

     
发表于 2017-1-25 22:17:31 | 显示全部楼层
楼主的环境真够粗糙的。还有板砖
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-20 01:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表