[技术问答] 用SC92F7320 MCU测温,反馈的值相差甚远,各位大佬帮我看看...

[复制链接]
359|7
 楼主 | 2019-12-26 19:27 | 显示全部楼层 |阅读模式
本帖最后由 化骨龙 于 2019-12-27 09:06 编辑

C:\Users\11593\Desktop
原理图   
下面为程序
#define _Function_Init_H_
#include <SC92F732x_C.H>
void ADC_Init(Channel);
unsigned int ADCValue = 0x0000;
bit AdcFlag = 0;
enum Channel {AIN0=0,AIN1,AIN6=6,AIN7,VDD4=15};
void main(void)
{
        ADC_Init(AIN0);  //选择AIN0作为通道
        while(1)
        {
                ADCCON |= 0X40;   //开始ADC转换
                while(!AdcFlag);                                  //等待 ADC转换完成;
                AdcFlag = 0;
                ADCValue = (ADCVH<<4)+(ADCVL>>4);
        }
}
void ADC_Init(Channel)
{
        P2CON = 0x40;  //0100 xx00 配置LED灯的管脚为推挽输出
        P2PH=0x81;
        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;
}
void ADC_Interrupt(void) interrupt 6
{
        ADCCON &= ~(0X10);  //清中断标志位
        AdcFlag = 1;
}


常温下 仿真采集到的数据对应电压只有1V左右(对应60℃),而实际用万用表测的电压2.6V左右(对应室温23℃)
原理图.png

使用特权

评论回复
| 2019-12-27 08:43 | 显示全部楼层
我是这么认为的:5/20*10=2.5是正常的啊,你的测量误差2.6,我没有看懂你的ADC

使用特权

评论回复
 楼主 | 2019-12-27 09:04 | 显示全部楼层
dengweian 发表于 2019-12-27 08:43
我是这么认为的:5/20*10=2.5是正常的啊,你的测量误差2.6,我没有看懂你的ADC ...

这个就是直接套用的这个MCU ADC转换的模板,直接转换看看效果

转换结果

转换结果

使用特权

评论回复
 楼主 | 2019-12-27 09:06 | 显示全部楼层
dengweian 发表于 2019-12-27 08:43
我是这么认为的:5/20*10=2.5是正常的啊,你的测量误差2.6,我没有看懂你的ADC ...

2.6V是用万用表测的电压  不是转换的电压

使用特权

评论回复
| 2019-12-27 14:56 | 显示全部楼层
#include "H/Function_Init.H"
#include <rtx51tny.h>
#include <stdio.h>                /* prototype declarations for I/O functions */
void ADC_Init(uint Channel);
void ADC_Multichannel(void);
unsigned int ADCValue = 0x0000;
bit AdcFlag = 0;
uint16_t ADC_Value0,ADC_Value1,ADC_Value2;
/***********ADC采样口选择*************/
#if (IC_MODEL == SC92F7252)
        enum Channel {AIN0=0,AIN1,AIN4=4,AIN5,AIN6,AIN7,AIN8,AIN9,VDD4=15};
#endif

#if (IC_MODEL == SC92F7251)
        enum Channel {AIN0=0,AIN1,AIN4=4,AIN5,AIN8=8,AIN9,VDD4=15};
#endif
       
#if (IC_MODEL == SC92F7250)
        enum Channel {AIN0=0,AIN1,AIN6=6,AIN7,VDD4=15};
#endif
       
/*****************************************************
*函数名称:void ADC_Test(void)
*函数功能:ADC测试
*入口参数:void
*出口参数:void
*****************************************************/
void ADC_Test(void)_task_ 7  
{
        ADC_Init(AIN0);
        while(1)
        {
                                printf ("os_running_task_id is:%d\n",(int)os_running_task_id());
        //        ADCValue++;
//                ADCCON |= 0X40;   //开始ADC转换
//                while(!AdcFlag);                                  //等待 ADC转换完成;
//                   os_wait (K_TMO, 2000, 0);            /* wait for timeout: 5 ticks            */
//                AdcFlag = 0;
//                ADCValue = (ADCVH<<4)+(ADCVL>>4);

                ADC_Multichannel();
                printf("%d\n",ADC_Value0);
    os_wait (K_TMO, 200, 0);            /* wait for timeout: 5 ticks            */
               
  }
}


uint16_t ADC_Convert(void)        //AD转换

{

unsigned int Tad=0,MinAd=0x0fff,MaxAd=0x0000,TempAdd=0;
unsigned char t=0;
        

        for(t=0;t<10;t++)
        {
                ADCCON |= 0xE0;        //开始 ADC 转换
               while(!AdcFlag);       //等待 ADC 转换完成
                ADCCON&=~(0x10);        //清中断标志位
                Tad = ((unsigned int)ADCVH<<4)+(ADCVL>>4); //取得一次转换值
        if (Tad>MaxAd)
        {
                MaxAd=Tad        ;//获得当前的最大值
        }
        if (Tad<MinAd)
        {
                MinAd=Tad;        //获得当前的最小值
        }
        TempAdd+=Tad;        //转换值累加
        }
        TempAdd-=MinAd;        //去掉最小值
        TempAdd-=MaxAd;        //去掉最大值
        TempAdd>>=3;        //求平均值
        
                return(TempAdd);
                       
}
void ADC_channel(unsigned char channel)
{

ADCCON=ADCCON&0xE0|channel;
}

void ADC_Multichannel(void)
{
        ADCCFG0 = 0x07;        // 设置AIN0.AIN1.AIN2为 ADC 口,并自动将上拉电阻移除。
        ADCCON  |= 0X80;        //开启 ADC 模块电源
ADC_channel(0);
        ADC_Value0=ADC_Convert();//启动ADC转换AIN0通道
        ADC_channel(1);
        ADC_Value1=ADC_Convert();//启动ADC转换AIN0通道
        ADC_channel(2);
        ADC_Value2=ADC_Convert();//启动ADC转换AIN0通道
}

/*****************************************************
*函数名称:void ADC_Init(uint Channel)
*函数功能:ADC初始化
*入口参数:Channel
*出口参数:void
*****************************************************/
void ADC_Init(uint Channel)
{
        ADCCON = 0X80|Channel;                //开启ADC,ADC采样频率为2M ,选择Channel位ADC采样口
        if(Channel<8)
        {
                ADCCFG0 = 1<<Channel;   //设置Channel作为采样口
        }
        else
        {
                ADCCFG1 = 1<<(Channel-8);   //设置Channel作为采样口
        }
        EADC=1;        //开启ADC中断
        EA = 1;
}


void ADC_Interrupt(void) interrupt 6
{
        ADCCON &= ~(0X10);  //清中断标志位
        AdcFlag = 1;
}

使用特权

评论回复
| 2019-12-27 15:02 | 显示全部楼层
这个是4.85V的测试,你试一下 微信图片编辑_20191213220004.jpg

使用特权

评论回复
| 2019-12-27 15:13 | 显示全部楼层
你这个KEIL是单步运行,你debug的时候你的KEIL是停止在某一时刻的,并不代表你实际芯片的转换值,所有你在ADC转换的时候你读取的值可能是有很大误差,你自已要搞懂这个原理,这是我个人认为的,供参考,我也是前两天刚接触这个芯片

使用特权

评论回复
 楼主 | 2019-12-27 16:01 | 显示全部楼层
dengweian 发表于 2019-12-27 15:13
你这个KEIL是单步运行,你debug的时候你的KEIL是停止在某一时刻的,并不代表你实际芯片的转换值,所有你在A ...

谢谢大佬  我先去捋一下

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

快速回复

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

论坛热帖

在线客服 快速回复 返回顶部 返回列表