找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2126|回复: 9
收起左侧

请教C8051F020单片机的AD转换问题

[复制链接]
ID:33455 发表于 2020-11-18 16:21 | 显示全部楼层 |阅读模式
PT100通过op07c芯片接到C8051F020芯片,用网上找的例程改的测到的温度室温只有8度,而且显示25以上就又称0了,大神们帮我看看是程序哪里不对
万分感谢
程序如下

#include <stdio.h>
#include <INTRINS.H>

#define uchar unsigned char
#define uint unsigned int


sfr16 ADC0= 0xbe;                 // ADC0 data
sfr16 ADC0GT   = 0xc4;                 // ADC0 greater than window
sfr16 ADC0LT   = 0xc6;                 // ADC0 less than window
sfr16 DAC0= 0xd2;                 // DAC0 data
sfr16 DAC1= 0xd5;                 // DAC1 data


//#define SYSCLK       22118400          // SYSCLK frequency in Hz
//#define SAMPLE_RATE  50000             // Sample frequency in Hz
//#define        AMX0SL_AIN   0                                   // 0=AIN0....7=AIN7,8=TEMP





uint ADCdata;
bit   ADCflag;
uchar volarray[3];         //读到的数值缓存
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// ADC0配置,ADC0BUSY为转换启动源, 并在转换完成时产生中断
//-----------------------------------------------------------------------------
void ADC0_Init (void)
{
    AMX0CF = 0x60;                           // AMUX Configuration Register
        AMX0SL = 0;                   // 第0个通道
        ADC0CF = (22118400/50000)<< 3;     // ADC conversion clock = .5MHz
        ADC0CN = 0x80;                           // ADC Control Register
    REF0CN = 0x03;                     // 启用内部基准源
    EIE2 |= 0x02;                       // 启用 ADC 中断
}

//-----------------------------------------------------------------------------
// 显示子程序
//-----------------------------------------------------------------------------
void ADZH()
{

        float Voltage;
   int   Vol;
   uint temp;
  if (ADCflag)
                        {
             ADCflag=0;
                    Voltage=(ADCdata*2.4)/4096;
                         Vol=Voltage*100;
             volarray[0]=Vol/100;  //数码管第一位
             temp=Vol%100;
             volarray[1]=temp/10;  //数码管第二位        
                         volarray[2]=temp%10;  //数码管第三位
                     AD0BUSY=1;         
                                                
                        }

}


//-----------------------------------------------------------------------------
void ADCSH ()
{

   ADC0_Init();                       // init ADC
   AD0BUSY=1;            

}


//-----------------------------------------------------------------------------
// ADC0采样中断
//-----------------------------------------------------------------------------
void ADC0_ISR (void) interrupt  15
{                 
   AD0INT = 0;                                        // 清 ADC 中断标志位
   ADCdata= ADC0;               // ADC采样数据
   ADCflag=1;

}


回复

使用道具 举报

ID:33455 发表于 2020-11-19 11:03 | 显示全部楼层
有没有大佬帮忙给看看 万分感谢
回复

使用道具 举报

ID:33455 发表于 2020-11-19 15:04 | 显示全部楼层
有没有师傅指点一下
回复

使用道具 举报

ID:587208 发表于 2020-11-20 14:41 | 显示全部楼层
Voltage=(ADCdata*2.4)/4096;
你的这个算法,c8051f单片机AD是多少位的AD啊?12位的AD就对了,2.4是你采样的AD最高电压吗?如果对,这条语句就没有问题了。
回复

使用道具 举报

ID:33455 发表于 2020-11-21 16:00 来自手机 | 显示全部楼层
studylyl 发表于 2020-11-20 14:41
Voltage=(ADCdata*2.4)/4096;
你的这个算法,c8051f单片机AD是多少位的AD啊?12位的AD就对了,2.4是你采样 ...

这样算下来的值是实际单片机ad输入的电压值,我用万用表检测了一下基本没有误差,但是这个电压值怎么就算成温度值,温度范围为负10度到130度,单片机ad电压范围为0-2.5伏
回复

使用道具 举报

ID:213173 发表于 2020-11-21 20:53 | 显示全部楼层
yanfeng082 发表于 2020-11-21 16:00
这样算下来的值是实际单片机ad输入的电压值,我用万用表检测了一下基本没有误差,但是这个电压值怎么就算 ...


没有用过PT100,印象中其温阻特性曲线的线性比较好。按楼主说法温度范围为负10度到130度对应单片机ad电压范围为0-2.5V,也就是0~2500mV。基本算法:温度C=mV/17.86-10。
回复

使用道具 举报

ID:33455 发表于 2020-11-22 12:02 | 显示全部楼层
wulin 发表于 2020-11-21 20:53
没有用过PT100,印象中其温阻特性曲线的线性比较好。按楼主说法温度范围为负10度到130度对应单片机ad电 ...

感谢楼上的回答,万分感谢,我想知道你至个公式是怎么得来的,怎么推算出来的,我代入程序中和实际温度差异还是很大,下面附上电路图 我现在想知道怎么通过AD采集的电压值计算PT100的电阻值,得到电阻值可以通过查表得到温度,下面付电路图C:\Users\Administrator\Desktop\QQ截图20201122104949
回复

使用道具 举报

ID:33455 发表于 2020-11-22 12:03 | 显示全部楼层
运放电路如图,怎么通过运放输出的电压计算出PT100的电阻值
51hei截图20201122104949.png
回复

使用道具 举报

ID:213173 发表于 2020-11-22 15:01 | 显示全部楼层
yanfeng082 发表于 2020-11-22 12:02
感谢楼上的回答,万分感谢,我想知道你至个公式是怎么得来的,怎么推算出来的,我代入程序中和实际温度差 ...

要在高级模式里才能发图片和其它附件。给你一个示例,用单片机自带10位ADC和普通10K B3950 NTC热敏电阻制作伪12位ADC温度表,经测试20~100°C范围误差不超0.5°C。外电路极其简单。 无标题.jpg

10K B3950 NTC温阻电压编码表 上偏电阻2.4K.zip (33.83 KB, 下载次数: 7)
回复

使用道具 举报

ID:213173 发表于 2020-11-23 08:40 | 显示全部楼层
yanfeng082 发表于 2020-11-22 12:02
感谢楼上的回答,万分感谢,我想知道你至个公式是怎么得来的,怎么推算出来的,我代入程序中和实际温度差 ...

按照你提供的数据:温度范围为负10度到130度,单片机ad电压范围为0-2.5伏计算。
电压mV=ADC转换结果*参考电压*放大1000/4096
系数=2500/140=17.85714285714286
温度=电压*系数-温度基点
C=mV/17.86-10
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表