yzc88亚洲城官网: [活动专区] 【赛元95F】+5.DIY拓展3:多路ADC数据采集,串口打印测试

永利游戏开户直营
537|17
楼主
焊接了三个三个不同的电位器如下所示,分别连接到SC95F8617AIN12P4.0)、AIN13P4.1)、AIN14P4.2),同时也想比较一下三种电位器的品质!


沙发
 楼主 | 2020-3-25 17:45 | 只看该作者
焊接后如下,背面飞线暂时不给大家看了!
板凳
 楼主 | 2020-3-25 17:46 | 只看该作者
测试代码如下,(包括三路ADC的初始化、三路ADC数据串口打印)
  1. //adc.c文件代码:
  2. #include "bsp/adc.h"
  3. //ADC转换完成标志位
  4. bit AdcFlag = 0;
  5. /*****************************************************
  6. *函数名称:void ADC_Init(unsigned int Channel)
  7. *函数功能:ADC初始化
  8. *入口参数:Channel
  9. *出口参数:void
  10. *****************************************************/
  11. void ADC_Init(unsigned int Channel)
  12. {
  13.         ADCCON = 0X80|Channel;//开启ADC,ADC采样频率为2M ,选择Channel位ADC采样口
  14.         if(Channel<8)
  15.         {
  16.                 ADCCFG0 = 1<<Channel;   //设置Channel作为采样口
  17.         }
  18.         else
  19.         {
  20.                 ADCCFG1 = 1<<(Channel-8);   //设置Channel作为采样口
  21.         }
  22.         IE |= 0X40;        //开启ADC中断
  23.         EA = 1;
  24. }

  25. /*****************************************************
  26. *函数名称:unsigned int ADC_Read(void)
  27. *函数功能:ADC读取数据
  28. *入口参数:void
  29. *出口参数:unsigned int
  30. *****************************************************/
  31. unsigned int ADC_Read(void)
  32. {
  33.           ADCCON |= 0X40;   //开始ADC转换
  34.                 while(!AdcFlag);        //等待 ADC转换完成;
  35.                 AdcFlag = 0;
  36.          return (ADCVH<<4)+(ADCVL>>4);
  37. }
  38. /*****************************************************
  39. *函数名称:ADC_Interrupt(void) interrupt 6
  40. *函数功能:ADC中断函数
  41. *入口参数:void
  42. *出口参数:void
  43. *****************************************************/
  44. void ADC_Interrupt(void) interrupt 6
  45. {
  46.         ADCCON &= ~(0X20);  //清中断标志位
  47.         AdcFlag = 1;
  48. }
复制代码


地板
 楼主 | 2020-3-25 17:46 | 只看该作者
  1. //adc.c文件代码:
  2. #include "bsp/adc.h"
  3. //ADC转换完成标志位
  4. bit AdcFlag = 0;
  5. /*****************************************************
  6. *函数名称:void ADC_Init(unsigned int Channel)
  7. *函数功能:ADC初始化
  8. *入口参数:Channel
  9. *出口参数:void
  10. *****************************************************/
  11. void ADC_Init(unsigned int Channel)
  12. {
  13.         ADCCON = 0X80|Channel;//开启ADC,ADC采样频率为2M ,选择Channel位ADC采样口
  14.         if(Channel<8)
  15.         {
  16.                 ADCCFG0 = 1<<Channel;   //设置Channel作为采样口
  17.         }
  18.         else
  19.         {
  20.                 ADCCFG1 = 1<<(Channel-8);   //设置Channel作为采样口
  21.         }
  22.         IE |= 0X40;        //开启ADC中断
  23.         EA = 1;
  24. }

  25. /*****************************************************
  26. *函数名称:unsigned int ADC_Read(void)
  27. *函数功能:ADC读取数据
  28. *入口参数:void
  29. *出口参数:unsigned int
  30. *****************************************************/
  31. unsigned int ADC_Read(void)
  32. {
  33.           ADCCON |= 0X40;   //开始ADC转换
  34.                 while(!AdcFlag);        //等待 ADC转换完成;
  35.                 AdcFlag = 0;
  36.          return (ADCVH<<4)+(ADCVL>>4);
  37. }
  38. /*****************************************************
  39. *函数名称:ADC_Interrupt(void) interrupt 6
  40. *函数功能:ADC中断函数
  41. *入口参数:void
  42. *出口参数:void
  43. *****************************************************/
  44. void ADC_Interrupt(void) interrupt 6
  45. {
  46.         ADCCON &= ~(0X20);  //清中断标志位
  47.         AdcFlag = 1;
  48. }
复制代码


5
 楼主 | 2020-3-25 17:47 | 只看该作者
  1. /*****************************************************************************////main.c文件测试代码:
  2. unsigned int adc_value;
  3. bit adc_flag;
  4. void main(void)
  5. {
  6.         IO_Init();
  7.         Uart_Init(32,9600);
  8.         Uart_Send_String("\r\n串口初始化..............OK!\n");
  9.         Timer_Init();
  10.         Uart_Send_String("定时器初始化..............OK!\n");
  11.         while(1)
  12.         {
  13.                 if(adc_flag ==1)
  14.                 {
  15.                   adc_flag = 0;
  16.                         ADC_Init(AIN12);
  17.                         adc_value = ADC_Read();
  18.                         Uart_Send_Byte(adc_value/1000+0x30);
  19.                         Uart_Send_Byte(adc_value%1000/100+0x30);
  20.                         Uart_Send_Byte(adc_value%100/10+0x30);
  21.                         Uart_Send_Byte(adc_value%10+0x30);
  22.                     Uart_Send_String("    ");
  23.                        
  24.                         ADC_Init(AIN13);
  25.                         adc_value = ADC_Read();;
  26.                         Uart_Send_Byte(adc_value/1000+0x30);
  27.                         Uart_Send_Byte(adc_value%1000/100+0x30);
  28.                         Uart_Send_Byte(adc_value%100/10+0x30);
  29.                         Uart_Send_Byte(adc_value%10+0x30);
  30.                         Uart_Send_String("     ");
  31.                        
  32.                         ADC_Init(AIN14);
  33.                         adc_value = ADC_Read();
  34.                         Uart_Send_Byte(adc_value/1000+0x30);
  35.                         Uart_Send_Byte(adc_value%1000/100+0x30);
  36.                         Uart_Send_Byte(adc_value%100/10+0x30);
  37.                         Uart_Send_Byte(adc_value%10+0x30);
  38.                         Uart_Send_Byte('\n');
  39.                 }               
  40.         }
  41. }
  42. /************************************************/
  43. //定时器0中断函数
  44. void timer0() interrupt 1
  45. {
  46.         unsigned int count;
  47.   TL0 = (65536 - 16000)%256;
  48.         TH0 = (65536 - 16000)/256;       
  49.   count++;
  50.         if(count == 1000)   //每500ms一次
  51.         {
  52.             count = 0;
  53.                   Led_Toggle(LED_B); //LED状态提示
  54.                   adc_flag = 1;      //转换一次ADC数据               
  55.          }               
  56. }
复制代码


6
 楼主 | 2020-3-25 17:47 | 只看该作者
实验效果,串口每隔1s打印了AIN12、AIN13、AIN14的AD值,拓展板上的LED间隔闪烁。
7
 楼主 | 2020-3-25 17:48 | 只看该作者
蓝色LED间隔闪烁
8
 楼主 | 2020-3-25 17:48 | 只看该作者
下面我们来做一个简单有趣的事情,三个电位器不是对应SC95F8617三路的ADC嘛,我们可以通过串口实时打印出当前电位器的AD转换值,现在我们不旋转电位器的按钮,串口助手存储5min的数据,最后我们用MATLAB来分别绘制这个三个电位器的曲线图,看哪个浮动最小,找出较好的电位器来。
9
 楼主 | 2020-3-25 17:49 | 只看该作者
串口保存的数据足够啦,开始绘制曲线啦,matlab走起!
10
 楼主 | 2020-3-25 17:49 | 只看该作者
看上去都差不多啦,都有一点小噪声,我们放大来仔细看一下,首先是AIN12,最大误差为1。
11
 楼主 | 2020-3-25 17:49 | 只看该作者
接着就是AIN13,最大误差为2,中间出现了抖动。
12
 楼主 | 2020-3-25 17:50 | 只看该作者
最后就是AIN14,最大误差为11,这种我就不提了哈。

评论

knk 2020-3-26 22:34 回复TA
你的程序不合理,建议参考92F芯片应用指南里面的多通道AD处理程序。 
13
 楼主 | 2020-3-25 17:50 | 只看该作者
最终结论,胜出者如下:
14
 楼主 | 2020-3-25 17:50 | 只看该作者
这是一次有趣的实验,如果大家对我的结论产生质疑,大家可以多此测试一下。
15
| 2020-3-26 09:46 | 只看该作者
感谢分享,奖励您100家园币,家园币可以兑换礼品或抽奖,欢迎体验~
16
 楼主 | 2020-3-26 13:04 | 只看该作者
21ic小喇叭 发表于 2020-3-26 09:46
感谢分享,奖励您100家园币,家园币可以兑换礼品或抽奖,欢迎体验~

家园币在哪里查看?
17
| 2020-3-27 15:28 | 只看该作者
这个贴不错,整个完成应该不错。
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

永利游戏开户直营 快速回复 返回顶部 返回列表
tyc577.com 富城夜总会 澳门 色惑 水舞间 区别登入 永利游戏开户直营 tt幸运农场彩票官网
澳门赌场攻略钱晶网上娱乐场 网络赌的人能戒掉吗网上娱乐场 鸿运国际娱乐场开户网上娱乐场 乐博现金彩票游戏网站 17彩票网址导航
永乐国际娱乐平台网站 岘港赌场地址网上娱乐场 hb天空之际登入 太阳城皇家六合彩开奖 巴黎人重庆时时彩官方网
银河国际网上投注登入 百家乐支付宝充值澳门赌场 www.88msc.com 澳门新濠赌场网上娱乐场 马洪刚如何评价澳门赌场网上娱乐场