注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

bqgup的个人空间 http://home.eeworld.com.cn/space-uid-1014845.html [收藏] [复制] [分享] [RSS]

日志

高能采集AD7606 ADCV2.0那些事?(二)

热度 1已有 310 次阅读2018-10-5 10:23 |个人分类:技术学习

       上个帖子给大家分享了AD7606 ADCV2.0的硬件和功能,然后自己根据AD7606的技术文档做转接板调程序,从之前的采集不到数据到最后能够采到数据,这个探索过程真的不容易,采集导数据后我与官方卖家给的程序作了对比,发现我采集到的数据和他们用的公式计算出来的数据有一点点误差,意思是这样的,官方例程中计算电压的公式是用采集到的数据ADC_Value/32768*10,也就是说比如单片机采集到ADC_Value=16319,16319/32768*10=4.9801636,但是这个ADC_Value是我用直流电源输出5.004V时采集到的,所以误差|err|=5.004-4.9801636=0.0238364V,误差大概就是23.8364mV,自我感觉这个误差还是比较大的,于是我就用AD7606对电压做了多组数据采集,具体数据见下表:(使用直流电源供电)
电压(V) 0 0.2040.302 0.401 0.5 1.0
ADC_Value 10 660 981 1304 1625 3257
  电压(V) 1.51.999 2.501 3.001 3.303 4.003
ADC_Value 4888 6517 8154 9785 10773 13055
电压(V) 5.004 6.002 7.002 8.002 9.002 10.003
  ADC_Value 163191957522839 26089 29360 32626
通过表格我们无法直观的看出数据的变化规律,因此我借用MATLAB仿真软件将表格转换成图像,打开MATLAB软件,我用的是2014版的,然后再MATLAB命令行窗口写代码
  1. clear
  2. clc
  3. cftool
  4. syms x y
  5. y=[0,0.204,0.302,0.401,0.500,1,1.5,1.999,2.501,3.001,3.303,4.003,5.004,6.002,7.002,8.002,9.002,10.003]
  6. x=[10,660,981,1304,1625,3257,4888,6517,8154,9785,10773,13055,16319,19575,22839,26098,29360,32626]
复制代码

由上图可知电压与ADC_Value 呈现线性关系:Vol = 0.0003066*ADC_Value + 0.0008209.
曲线拟合好之后,我把他转化成C语言写进单片机,
  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "logo.h"
  7. #include "key.h"
  8. #include "24cxx.h"
  9. #include "w25qxx.h"
  10. #include "touch.h"
  11. #include "modechoose.h"
  12. #include "adc.h"
  13. #include "freecarscope.h"
  14. #include "anoflyscope.h"
  15. #include "keyboard.h"
  16. #include "fdc2214.h"
  17. #include "datapro.h"
  18. #include "key.h"
  19. #include "AD7606.h"
  20. #include "Del.h"
  21. int main(void)
  22. {       
  23.         double Vol = 0;                                                                                //电压
  24.         char buf[20];
  25.         s16 DB_data[8] = {0};                                                                //通道采集数值存放数组
  26.         u8 temp;                                                                                        //BUSY变量
  27.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                //设置中断优先级分组2
  28.         delay_init();                                                                             //延时函数初始化       
  29.         uart_init(115200);                                                                         //串口初始化为115200
  30.         LCD_Init();                                                                                        //LCD屏初始化
  31.         LED_Init();                                                                                 //指示灯初始化
  32. //        Adc_Init();                                                                                        //ADC采集初始化
  33.         tp_dev.init();                                                                                //触摸屏初始化
  34.        
  35.         AD7606_Init();                                                                                //AD7606初始化
  36. //        KeyInit();                                                                                        //按键初始化


  37.         while(1)
  38.         {
  39.                 AD7606_startconvst();                                                                        //AD7670启动转换
  40.                 Delay_ns(1);
  41.                 temp = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1);                        // 读取 BUSY的状态
  42.                 while((temp == 1))                                                                                //当busy为低电平时,数据转换完毕,此时可以读取数据
  43.                 {
  44.                         Delay_ns(10);
  45.                         temp = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_1);                // 读取 BUSY的状态          
  46.                 }
  47.                 AD7606_read_data(DB_data);                                                                //读取各通道数据
  48.                 Vol = (double)(DB_data[0]) * 0.0003066 + 0.0008209;                //MATLAB拟合公式
  49.                
  50.                 sprintf(buf,"vol=%lf",Vol);
  51.                 LCD_ShowString(50,100,200,24,24,(u8 *)"CH1:");
  52.                 LCD_ShowNum(100,100,DB_data[0],8,24);
  53.                 LCD_ShowString(250,100,200,24,24,(u8 *)buf);
  54. //                LCD_ShowString(50,200,200,24,24,(u8 *)"CH2:");
  55. //                LCD_ShowNum(100,200,DB_data[1],8,24);
  56. //               
  57. //                LCD_ShowString(50,300,200,24,24,(u8 *)"CH3:");
  58. //                LCD_ShowNum(100,300,DB_data[2],8,24);
  59. //               
  60. //                LCD_ShowString(50,400,200,24,24,(u8 *)"CH4:");
  61. //                LCD_ShowNum(100,400,DB_data[3],8,24);
  62. //               
  63. //                LCD_ShowString(50,500,200,24,24,(u8 *)"CH5:");
  64. //                LCD_ShowNum(100,500,DB_data[4],8,24);
  65. //               
  66. //                LCD_ShowString(50,600,200,24,24,(u8 *)"CH6:");
  67. //                LCD_ShowNum(100,600,DB_data[5],8,24);
  68. //               
  69. //                LCD_ShowString(50,700,200,24,24,(u8 *)"CH7:");
  70. //                LCD_ShowNum(100,700,DB_data[6],8,24);
  71. //               
  72. //                LCD_ShowString(50,800,200,24,24,(u8 *)"CH8:");
  73. //                LCD_ShowNum(100,800,DB_data[7],8,24);
  74.                
  75.                 delay_ms(500);
  76.         }
  77. }



复制代码

实验效果如图所示:
我输出电压设定为8.451,实际采集电压为8.4507176,误差|err|= 8.451-8.4507176=0.0002824v=0.2824mV,由此可见,精度提高了不少。

本文来自论坛,点击查看完整帖子内容。

发表评论 评论 (1 个评论)

回复 sjl2001 2018-10-5 10:27
  

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-12-10 12:12 , Processed in 0.034781 second(s), 11 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2018 http://bbs.eeworld.com.cn/

返回顶部