4932|7

5979

帖子

8

TA的资源

版主

楼主
 

【Altera SoC体验之旅】高速数据采集之数据显示(2) [复制链接]

  本帖最后由 chenzhufly 于 2015-5-7 15:58 编辑
【Altera SoC体验之旅】高速数据采集之数据显示(2)
作者:chenzhufly QQ:36886052
研究了几天终于可以在web上显示曲线了,需要优化的工作还很多,继续努力吧
1、 硬件环境
硬件平台: Embest SoC --LarkBoard
软件平台:开发板-linux-3.10.31
Quartus 14.0
2、Web服务器
我这次使用的是Lighttpd
Lighttpd 是一个德国人领导的开源Web服务器软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销、cpu占用率低、效能好以及丰富的模块等特点。
Lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI,CGI,Auth,输出压缩(output compress),URL重写,Alias等重要功能;而Apache之所以流行,很大程度也是因为功能丰富,在lighttpd上很多功能都有相应的实现了,这点对于apache的用户是非常重要的,因为迁移到lighttpd就必须面对这些问题。
debian系统就是这点好,直接安装就可以了
  1. apt-get install lighttpd
复制代码
配置文件在/etc/lighttpd/lighttpd.conf,可自行更具需要修改
3、曲线显示控件
我使用的是Highcharts
链接地址:http://www.hcharts.cn/,资源很丰富,可以下载例程,自己学习学习
演示曲线非常漂亮:
4、数据的获取
Highchart支持多种方式的数据获取,由于能力有限,就没继续研究了,我使用了比较笨的办法,把数据存在一个文件中,然后从文件中数据读出并展示出来;数据都存入到adcdata.js这个文件,分别是原始数据adcdata、FFT后的数据fftdata,信号频率freq
数据获取的代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <math.h>
  7. #define PI (3.14159f)
  8. #define TWOPI (6.2831853f)
  9. #define POINT (1024)
  10. struct complex{
  11. double real;
  12. double imag;
  13. }complex ;
  14. static float gFft_res_ch0[POINT];
  15. static float gFft_res_ch1[POINT];
  16. static struct complex gFft_sr_ch0[POINT];
  17. static struct complex gFft_sr_ch1[POINT];
  18. static unsigned int gSource_buff[POINT];
  19. static int gChanel0_buff[POINT];
  20. static int gChanel1_buff[POINT];
  21. struct complex EE(struct complex c1,struct complex c2)
  22. {
  23. struct complex c3;
  24. c3.real = c1.real*c2.real - c1.imag*c2.imag;
  25. c3.imag = c1.real*c2.imag + c1.imag*c2.real;
  26. return (c3);
  27. }
  28. void fft(struct complex *xin,int N)
  29. {
  30. int f, m, LH, nm, i, k, j, L;
  31. int le, B, ip;
  32. double p , ps;
  33. struct complex w, t;
  34. LH = N/2;
  35. f = N;
  36. for(m = 1;(f = f/2) != 1;m++);
  37. for(L = m;L >= 1;L--)
  38. {
  39. le = pow((double)2,(int)L);
  40. B = le/2;
  41. for(j = 0;j <= B - 1;j++)
  42. {
  43. p = pow((double)2,(int)(m-L))*j;
  44. ps = TWOPI/N*p;
  45. w.real = cos(ps);
  46. w.imag = -sin(ps);
  47. for(i = j;i <= N - 1;i = i + le)
  48. {
  49. ip = i + B;
  50. t = xin[i];
  51. xin[i].real = xin[i].real + xin[ip].real;
  52. xin[i].imag = xin[i].imag + xin[ip].imag;
  53. xin[ip].real = xin[ip].real - t.real;
  54. xin[ip].imag = xin[ip].imag - t.imag;
  55. xin[ip] = EE(xin[ip],w);
  56. }
  57. }
  58. }
  59. nm = N - 2;
  60. j = N / 2;
  61. for(i = 1;i <= nm;i++)
  62. {
  63. if(i < j)
  64. {
  65. t = xin[j];
  66. xin[j] = xin[i];
  67. xin[i] = t;
  68. }
  69. k = LH;
  70. while(j >= k)
  71. {
  72. j = j - k;
  73. k = k/2;
  74. }
  75. j = j + k;
  76. }
  77. }
  78. int main(int argc, char* argv[])
  79. {
  80. int i = 0;
  81. int val;
  82. size_t write_len = 0;
  83. FILE * srFp;
  84. FILE * adcFp;
  85. double freq_ch0 = 0;
  86. double freq_ch1 = 0;
  87. int max_ch0 = 0;
  88. int max_num_ch0 = 0;
  89. int max_ch1 = 0;
  90. int max_num_ch1 = 0;
  91. unsigned int tmp = 0;
  92. int fd;
  93. adcFp = fopen("/www/pages/adcdata.js", "wb");
  94. if(!adcFp){
  95. perror("adcdata.js open failed\n");
  96. return 1;
  97. }
  98. fd = open("/dev/adc/adc", O_RDONLY);
  99. if (fd == -1) {
  100. perror("device open error\n");
  101. return 1;
  102. }
  103. read(fd,gSource_buff,POINT*4);
  104. fprintf(adcFp,"%s","var adcdata = [");
  105. for(i = 0;i < POINT; i++ ){
  106. tmp = (gSource_buff[i]&0xffff0000)>>16; //chanel 1
  107. if( (tmp&0x800) != 0){ //negative
  108. tmp = (tmp | 0xfffff000);
  109. }
  110. gChanel1_buff[i] = (int)tmp;
  111. fprintf(adcFp,"%d, ",tmp);
  112. gFft_sr_ch1[i].real = gChanel1_buff[i];
  113. }
  114. fprintf(adcFp,"%s\n"," ];");
  115. fft(gFft_sr_ch1,POINT);
  116. fprintf(adcFp,"%s","var fftdata = [");
  117. for(i = 0;i < POINT/2 ;i++){
  118. gFft_res_ch1[i] = sqrt( gFft_sr_ch1[i].real*gFft_sr_ch1[i].real + gFft_sr_ch1[i].imag*gFft_sr_ch1[i].imag ) * 2 / POINT; /* caculate the amplitude ch1*/
  119. fprintf(adcFp,"%f, ",gFft_res_ch1[i]);
  120. if((int)gFft_res_ch1[i] > max_ch1){
  121. max_ch1 = (int)gFft_res_ch1[i];
  122. max_num_ch1 = i;
  123. }
  124. }
  125. fprintf(adcFp,"%s\n"," ];");
  126. close(fd);
  127. fprintf(adcFp,"%s","freq = ");
  128. freq_ch1 = 105.0 / POINT*max_num_ch1;
  129. printf("\n%d:chanel1 frequency = %f Mhz, amplitude=%d\n", max_num_ch1, freq_ch1, max_ch1);
  130. fprintf(adcFp,"%d;",freq_ch1);
  131. return 0;
  132. }
复制代码
5、网页代码
利用highcharts的例程,自己写了一个index.html,放在/var/www文件夹下面。
  1. <!DOCTYPE HTML>
  2. <html>
  3. <meta http-equiv="refresh" content="5">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  6. <title>Data Acquisition System</title>
  7. <script type="text/javascript" src="http://cdn.hcharts.cn/jquery/jquery-1.8.3.min.js"></script>
  8. <style type="text/css">
  9. ${demo.css}
  10. </style>
  11. <script src="adcdata.js"></script>
  12. <script type="text/javascript">
  13. $(function () {
  14. $('#container').highcharts({
  15. title: {
  16. text: '原始数据',
  17. x: -20 //center
  18. },
  19. subtitle: {
  20. text: '作者:chenzhufly 来源:www.eeworld.com.cn',
  21. x: -20
  22. },
  23. tooltip: {
  24. valueSuffix: ''
  25. },
  26. legend: {
  27. layout: 'vertical',
  28. align: 'right',
  29. verticalAlign: 'middle',
  30. borderWidth: 0
  31. },
  32. series: [{
  33. name: '原始数据',
  34. data: adcdata
  35. // data : [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]
  36. }
  37. ]
  38. });
  39. });
  40. $(function () {
  41. $('#container1').highcharts({
  42. title: {
  43. text: 'FFT数据分析',
  44. x: -20 //center
  45. },
  46. subtitle: {
  47. text: '作者:chenzhufly 来源:www.eeworld.com.cn',
  48. x: -20
  49. },
  50. tooltip: {
  51. valueSuffix: ''
  52. },
  53. legend: {
  54. layout: 'vertical',
  55. align: 'right',
  56. verticalAlign: 'middle',
  57. borderWidth: 0
  58. },
  59. series: [ {
  60. name: 'FFT数据',
  61. data: fftdata
  62. // data : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
  63. }
  64. ]
  65. });
  66. });
  67. </script>
  68. </head>
  69. <body>
  70. <script src="http://cdn.hcharts.cn/highcharts/highcharts.js"°></script>
  71. <script src="http://cdn.hcharts.cn/highcharts/exporting.js"></script>
  72. <div id="container" style="min-width: 250px; height: 300px; margin: 0 auto"></div>
  73. <div id="container1" style="min-width: 250px; height: 300px; margin: 0 auto"></div>
  74. <FORM >
  75. <p>Frequency(Mhz):
  76. <script>document.write(freq);</script>
  77. </FORM>
  78. </body>
  79. </html>
复制代码
网页5秒钟自动刷新一次,使用如下的代码
6、测试结果
此帖出自Altera SoC论坛

最新回复

这么高端,很是羡慕。  详情 回复 发表于 2018-2-11 20:53

赞赏

2

查看全部赞赏

点赞 关注(1)
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复
举报

1891

帖子

2

TA的资源

纯净的硅(中级)

沙发
 
好厉害的样子。。。
此帖出自Altera SoC论坛
个人签名
分享铸就美好未来。。。




 
 
 

回复

1025

帖子

1

TA的资源

纯净的硅(高级)

板凳
 
不明觉厉

网页显示采集数据,对于做硬件或者底层开发的来说,是很炫的技术了
此帖出自Altera SoC论坛
 
 
 

回复

5979

帖子

8

TA的资源

版主

4
 
是啊 也就对硬件和底层的开发人员有难度
专门做web的一看就是小儿科 哈哈
此帖出自Altera SoC论坛
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

5979

帖子

8

TA的资源

版主

5
 
所以我也不准备继续了,到此为止
此帖出自Altera SoC论坛
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

27

帖子

0

TA的资源

一粒金砂(中级)

6
 
大神,我最近也在学习者部分内容,能留个qq一块交流一下么???拜托拜托
此帖出自Altera SoC论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
要是深究的话还是有很多东西的
此帖出自Altera SoC论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

8
 
这么高端,很是羡慕。
此帖出自Altera SoC论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表