打印
[51单片机]

STC12C5A60S2 基准电压计算不对

[复制链接]
1217|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyao00|  楼主 | 2016-1-16 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yyao00 于 2016-1-16 14:32 编辑

P1.0接2.5V基准电源
P1.1接电源电压
P1.2接待测电压
现在遇到的问题用基准电源来计算电源电源压总是计算不对
下面是源代码
main :
#include<STC12C5A60S2.h>
#include <intrins.h>  
#include <ad.h>

//AD转换电压
void checkpower()
{
        unsigned int temp;
        f_adconverting = 1;


        GetADCResult(0);                                                                                //测基准电压
        while (f_adconverting);                                                        //等待转换完成
        temp = ad_result10;                                                                        //保存2.5V基准电压转换值

        GetADCResult(1);                                                                                //测电源电压
        while (f_adconverting);                                                        //等待转换完成
        
        vin = 2.5 * ad_result10 / temp;                        //求电源电压
        display_num = (int)(vin * 10);
        shi =  display_num / 10;
        ge = display_num % 10;
}
void display(unsigned char c2, unsigned char c1)
{
        P0 = seg7[c2];                                //送入十位的段码
        en2 = 0;                                                        //显示DS2
        delay(10);
        en2 = 1;                                                        //关闭DS2        

        P0 = seg7[c1];                                //送入个位的段码
        en1 = 0;                                                        //显示DS1
        delay(10);
        en1 = 1;                                                        //关闭DS1
}


void main()
{
        delay(10);
        InitADC();                                                //AD初始化
        while(1)
        {
                checkpower();                                //测量电源电压
                display(shi,ge);                //电源电压显示
        }
}

ad.h:
typedef unsigned char                BYTE;
typedef unsigned int                WORD;

/*Define SFR operation const for ADC_CONTR */
#define        ADC_POWER                0x80                                        //ADC 电源控制位
#define ADC_FLAG                0x10                                        //ADC 转换结束标志位
#define ADC_START                0x08                                        //ADC 转换启动控制位
#define        ADC_SPEEDLL 0x00                                        //540 个时钟转换一次
#define        ADC_SPEEDL        0x20                                        //360 个时钟转换一次
#define ADC_SPEEDH  0x40                                        //180 个时钟转换一次
#define ADC_SPEEDHH        0x60                                        //90  个时钟转换一次

unsigned int ad_result10;                                                //10位精度的电压转换值
float vin;
unsigned int display_num;
unsigned char shi, ge;        //定义十位、个位要输出的数据
bit f_adconverting; //正在AD转换标志

sbit en1 = P2^6;
sbit en2 = P2^7;

/*
共阴极数码管0 - 9的字形码
“0” 3FH “5” 6DH  
“1” 06H “6” 7DH
“2” 5BH “7” 07H
“3” 4FH “8” 7FH
“4” 66H “9” 6FH
*/
const unsigned char seg7[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66,
                                                                 0x6d, 0x7d, 0x07, 0x7f, 0x6f};   

void delay(unsigned int max)
{
        unsigned int i,j;
        for(i=max;i>0;i--)
                for(j=1230;j>0;j--);
}


//初始化 ADC sfr
void InitADC()
{
        P1ASF = 0xff;                                                                        //打开8通道ADC功能
        ADC_RES = 0;                                                                        //清除以前的结果
        ADC_CONTR = ADC_POWER|ADC_SPEEDLL;        
        delay(1);                                                                                        //ADC的上电和延迟
}

//获取ADC结果
BYTE GetADCResult(BYTE ch)
{

        ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
        _nop_();                                                                                        //经过4个时钟延时后,才能够正确写入ADC_CONTR
        _nop_();
        _nop_();
        _nop_();
        while(!ADC_CONTR&ADC_FLAG);                //等待完成标志
        ADC_CONTR &= ~ADC_FLAG;                                //关闭ADC
        ad_result10 = ADC_RES;
        ad_result10 = ( ad_result10 << 2 ) | ADC_RESL;
        f_adconverting = 0;
}

相关帖子

沙发
yyao00|  楼主 | 2016-1-16 15:17 | 只看该作者
没有人吗

使用特权

评论回复
板凳
yyao00|  楼主 | 2016-1-16 15:35 | 只看该作者
顶顶

使用特权

评论回复
地板
JY-DX-JY| | 2016-1-16 16:57 | 只看该作者
你算出的电源电压是多少啊?

使用特权

评论回复
5
yyao00|  楼主 | 2016-1-16 17:30 | 只看该作者
JY-DX-JY 发表于 2016-1-16 16:57
你算出的电源电压是多少啊?

要是用基准电压算是乱码
直接算就对

使用特权

评论回复
6
JY-DX-JY| | 2016-1-16 18:56 | 只看该作者
会不会中间结果溢出了?

使用特权

评论回复
7
jrcsh| | 2016-1-16 19:27 | 只看该作者
P1.0接2.5V基准电源
P1.1接电源电压
P1.2接待测电压
//=============================

这样就行了  

P1.0接2.5V基准电源   ==>   p1.0AD=由PDF上的公式  vin/Vcc*1025=P1.0AD值  ===> 已知电压2.5V/(1204/P1.0AD值) ===> 电源电压

P1.2接待测电压     ==>   p1.2AD=由PDF上的公式  vin/Vcc*1025===> P1.2AD值 /1024 *电源电压 ==> P1.2实际电压

使用特权

评论回复
8
yyao00|  楼主 | 2016-1-16 20:53 | 只看该作者
JY-DX-JY 发表于 2016-1-16 18:56
会不会中间结果溢出了?

我刚刚又试了一下  ,只要吧基准电源脚接地 就会乱码  电源电压脚接地计算出来的电压还是5v
基准电压暂存定义成  无符号整形
计算出来的电源电压定义成  单精度浮点

使用特权

评论回复
9
mmkav| | 2016-1-20 23:12 | 只看该作者
其实用无符号整形就OK了
基准电压使用MV 2540mV
2540/temp=ADdv>>ADdv  得出每点AD值对应电压这个值
ADdv*ad_result10=vin==》vin测得得值为mV

使用特权

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

本版积分规则

2

主题

14

帖子

1

粉丝