打印
[活动专区]

【赛元95F】+5.DIY拓展3:多路ADC数据采集,串口打印测试

[复制链接]
1087|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
焊接了三个三个不同的电位器如下所示,分别连接到SC95F8617AIN12P4.0)、AIN13P4.1)、AIN14P4.2),同时也想比较一下三种电位器的品质!


使用特权

评论回复

相关帖子

沙发
一路向北lm|  楼主 | 2020-3-25 17:45 | 只看该作者
焊接后如下,背面飞线暂时不给大家看了!

使用特权

评论回复
板凳
一路向北lm|  楼主 | 2020-3-25 17:46 | 只看该作者
测试代码如下,(包括三路ADC的初始化、三路ADC数据串口打印)
//adc.c文件代码:
#include "bsp/adc.h"
//ADC转换完成标志位
bit AdcFlag = 0;
/*****************************************************
*函数名称:void ADC_Init(unsigned int Channel)
*函数功能:ADC初始化
*入口参数:Channel
*出口参数:void
*****************************************************/
void ADC_Init(unsigned int Channel)
{
        ADCCON = 0X80|Channel;//开启ADC,ADC采样频率为2M ,选择Channel位ADC采样口
        if(Channel<8)
        {
                ADCCFG0 = 1<<Channel;   //设置Channel作为采样口
        }
        else
        {
                ADCCFG1 = 1<<(Channel-8);   //设置Channel作为采样口
        }
        IE |= 0X40;        //开启ADC中断
        EA = 1;
}

/*****************************************************
*函数名称:unsigned int ADC_Read(void)
*函数功能:ADC读取数据
*入口参数:void
*出口参数:unsigned int
*****************************************************/
unsigned int ADC_Read(void)
{
          ADCCON |= 0X40;   //开始ADC转换
                while(!AdcFlag);        //等待 ADC转换完成;
                AdcFlag = 0;
         return (ADCVH<<4)+(ADCVL>>4);
}
/*****************************************************
*函数名称:ADC_Interrupt(void) interrupt 6
*函数功能:ADC中断函数
*入口参数:void
*出口参数:void
*****************************************************/
void ADC_Interrupt(void) interrupt 6
{
        ADCCON &= ~(0X20);  //清中断标志位
        AdcFlag = 1;
}


使用特权

评论回复
地板
一路向北lm|  楼主 | 2020-3-25 17:46 | 只看该作者
//adc.c文件代码:
#include "bsp/adc.h"
//ADC转换完成标志位
bit AdcFlag = 0;
/*****************************************************
*函数名称:void ADC_Init(unsigned int Channel)
*函数功能:ADC初始化
*入口参数:Channel
*出口参数:void
*****************************************************/
void ADC_Init(unsigned int Channel)
{
        ADCCON = 0X80|Channel;//开启ADC,ADC采样频率为2M ,选择Channel位ADC采样口
        if(Channel<8)
        {
                ADCCFG0 = 1<<Channel;   //设置Channel作为采样口
        }
        else
        {
                ADCCFG1 = 1<<(Channel-8);   //设置Channel作为采样口
        }
        IE |= 0X40;        //开启ADC中断
        EA = 1;
}

/*****************************************************
*函数名称:unsigned int ADC_Read(void)
*函数功能:ADC读取数据
*入口参数:void
*出口参数:unsigned int
*****************************************************/
unsigned int ADC_Read(void)
{
          ADCCON |= 0X40;   //开始ADC转换
                while(!AdcFlag);        //等待 ADC转换完成;
                AdcFlag = 0;
         return (ADCVH<<4)+(ADCVL>>4);
}
/*****************************************************
*函数名称:ADC_Interrupt(void) interrupt 6
*函数功能:ADC中断函数
*入口参数:void
*出口参数:void
*****************************************************/
void ADC_Interrupt(void) interrupt 6
{
        ADCCON &= ~(0X20);  //清中断标志位
        AdcFlag = 1;
}


使用特权

评论回复
5
一路向北lm|  楼主 | 2020-3-25 17:47 | 只看该作者
/*****************************************************************************////main.c文件测试代码:
unsigned int adc_value;
bit adc_flag;
void main(void)
{
        IO_Init();
        Uart_Init(32,9600);
        Uart_Send_String("\r\n串口初始化..............OK!\n");
        Timer_Init();
        Uart_Send_String("定时器初始化..............OK!\n");
        while(1)
        {
                if(adc_flag ==1)
                {
                  adc_flag = 0;
                        ADC_Init(AIN12);
                        adc_value = ADC_Read();
                        Uart_Send_Byte(adc_value/1000+0x30);
                        Uart_Send_Byte(adc_value%1000/100+0x30);
                        Uart_Send_Byte(adc_value%100/10+0x30);
                        Uart_Send_Byte(adc_value%10+0x30);
                    Uart_Send_String("    ");
                       
                        ADC_Init(AIN13);
                        adc_value = ADC_Read();;
                        Uart_Send_Byte(adc_value/1000+0x30);
                        Uart_Send_Byte(adc_value%1000/100+0x30);
                        Uart_Send_Byte(adc_value%100/10+0x30);
                        Uart_Send_Byte(adc_value%10+0x30);
                        Uart_Send_String("     ");
                       
                        ADC_Init(AIN14);
                        adc_value = ADC_Read();
                        Uart_Send_Byte(adc_value/1000+0x30);
                        Uart_Send_Byte(adc_value%1000/100+0x30);
                        Uart_Send_Byte(adc_value%100/10+0x30);
                        Uart_Send_Byte(adc_value%10+0x30);
                        Uart_Send_Byte('\n');
                }               
        }
}
/************************************************/
//定时器0中断函数
void timer0() interrupt 1
{
        unsigned int count;
  TL0 = (65536 - 16000)%256;
        TH0 = (65536 - 16000)/256;       
  count++;
        if(count == 1000)   //每500ms一次
        {
            count = 0;
                  Led_Toggle(LED_B); //LED状态提示
                  adc_flag = 1;      //转换一次ADC数据               
         }               
}


使用特权

评论回复
6
一路向北lm|  楼主 | 2020-3-25 17:47 | 只看该作者
实验效果,串口每隔1s打印了AIN12、AIN13、AIN14的AD值,拓展板上的LED间隔闪烁。

使用特权

评论回复
7
一路向北lm|  楼主 | 2020-3-25 17:48 | 只看该作者
蓝色LED间隔闪烁

使用特权

评论回复
8
一路向北lm|  楼主 | 2020-3-25 17:48 | 只看该作者
下面我们来做一个简单有趣的事情,三个电位器不是对应SC95F8617三路的ADC嘛,我们可以通过串口实时打印出当前电位器的AD转换值,现在我们不旋转电位器的按钮,串口助手存储5min的数据,最后我们用MATLAB来分别绘制这个三个电位器的曲线图,看哪个浮动最小,找出较好的电位器来。

使用特权

评论回复
9
一路向北lm|  楼主 | 2020-3-25 17:49 | 只看该作者
串口保存的数据足够啦,开始绘制曲线啦,matlab走起!

使用特权

评论回复
10
一路向北lm|  楼主 | 2020-3-25 17:49 | 只看该作者
看上去都差不多啦,都有一点小噪声,我们放大来仔细看一下,首先是AIN12,最大误差为1。

使用特权

评论回复
11
一路向北lm|  楼主 | 2020-3-25 17:49 | 只看该作者
接着就是AIN13,最大误差为2,中间出现了抖动。

使用特权

评论回复
12
一路向北lm|  楼主 | 2020-3-25 17:50 | 只看该作者
最后就是AIN14,最大误差为11,这种我就不提了哈。

使用特权

评论回复
评论
knk 2020-3-26 22:34 回复TA
你的程序不合理,建议参考92F芯片应用指南里面的多通道AD处理程序。 
13
一路向北lm|  楼主 | 2020-3-25 17:50 | 只看该作者
最终结论,胜出者如下:

使用特权

评论回复
14
一路向北lm|  楼主 | 2020-3-25 17:50 | 只看该作者
这是一次有趣的实验,如果大家对我的结论产生质疑,大家可以多此测试一下。

使用特权

评论回复
15
21ic小喇叭| | 2020-3-26 09:46 | 只看该作者
感谢分享,奖励您100家园币,家园币可以兑换礼品或抽奖,欢迎体验~

使用特权

评论回复
16
一路向北lm|  楼主 | 2020-3-26 13:04 | 只看该作者
21ic小喇叭 发表于 2020-3-26 09:46
感谢分享,奖励您100家园币,家园币可以兑换礼品或抽奖,欢迎体验~

家园币在哪里查看?

使用特权

评论回复
17
yygdzjs| | 2020-3-27 15:28 | 只看该作者
这个贴不错,整个完成应该不错。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

256

主题

3639

帖子

73

粉丝