最近在改进太阳能庭院灯的时候,对上版的AD进行变更,AD处理用int处理,但是AD结果差很多
12.5V的基准,int函数处理10.2V就动作了,float处理基本正确,大家有空帮忙分析、讨论下
1.原理图
2.int处理
/*******************************************************************************
1.分项目:AD测试
2.功能:AD测试
3.设计:robin_chen559
4.日期:20130911
5.备注:
5.1系统时钟11.0592MHz
*******************************************************************************/
#include<STC12C5410AD.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED_R = P2^1;
sbit LED_G = P2^0;
sbit LED_Y = P1^3; //定义R G Y指示灯端口
//子程序声明
void Init_AD(void); //AD初始化
int Get_AD(uchar channel); //进行AD转换
int AD_Res_Pro(uchar channel); //AD结果处理
void Delay_MS(uint MS); //MS延迟程序
void LED_ST(void); //LED状态
//子程序
//AD初始化
void Init_AD(void)
{
P1M0 = 0xe7; //1110 0111
P1M1 = 0xff; //1111 1111 P1.3 P1.4为强推挽输出,其余AD开漏
ADC_CONTR = 0x80; //1000 0000 配置AD控制字,1080T转换一次
Delay_MS(3); //延时5MS,待AD电源稳定
}
//AD转换
int Get_AD(uchar channel)
{
uchar AD_Finished = 0 ;
int result ;
ADC_DATA = 0x00;
ADC_LOW2 = 0x00;
ADC_CONTR |= channel; //选择AD转换通道
ADC_CONTR |= 0x08 ; // 开始AD转换
_nop_();
_nop_();
_nop_(); //延时3个指令周期,待AD电平稳定
while(AD_Finished == 0) //等待AD转化完成
{
AD_Finished = (ADC_CONTR&0x10); //判断AD转换是否为完成
}
result = ADC_DATA*4+ADC_LOW2 ; //读走AD转换结果
ADC_CONTR &= 0x80 ; //1000 0000 清除AD转换标志位,停止AD采样
return(result); //返回AD采样结果
}
// AD结果处理
int AD_Res_Pro(uchar channel) //对AD结果求5次均值
{
int AD_AV ;
uchar num ;
for(num=5;num>0;num--)
{
AD_AV +=Get_AD(channel);
}
AD_AV/=5;
return AD_AV;
}
//MS延迟程序
void Delay_MS(uint MS)
{
uint x,y;
for(x=MS;x>0;x--)
{
for(y=876;y>0;y--);
}
}
//LED状态
void LED_ST(void)
{
if( AD_Res_Pro(7)>512) //((12.5/5)/5)*1024=512 12.5V的AD转换结果 AD7电阻1/5采样
{
LED_G = 0 ;
LED_Y = 1 ;
}
else
{
LED_G = 1 ;
LED_Y = 0 ;
}
}
//主程序
void main(void)
{
P2M0 = 0x00;
P2M1 = 0xff; //P2口初始化,全部推挽输出
Init_AD(); //AD初始化
while(1) //无限循环检测
{
LED_ST(); //LED状态
}
}
2.float处理
/*******************************************************************************
1.分项目:AD测试
2.功能:AD测试
3.设计:robin_chen559
4.日期:20130911
5.备注:
5.1系统时钟11.0592MHz
*******************************************************************************/
#include<STC12C5410AD.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED_R = P2^1;
sbit LED_G = P2^0;
sbit LED_Y = P1^3; //定义R G Y指示灯端口
//子程序声明
void Init_AD(void); //AD初始化
int Get_AD(uchar channel); //进行AD转换
float AD_Res_Pro(uchar channel); //AD结果处理
void Delay_MS(uint MS); //MS延迟程序
void LED_ST(void); //LED状态
//子程序
//AD初始化
void Init_AD(void)
{
P1M0 = 0xe7; //1110 0111
P1M1 = 0xff; //1111 1111 P1.3 P1.4为强推挽输出,其余AD开漏
ADC_CONTR = 0x80; //1000 0000 配置AD控制字,1080T转换一次
Delay_MS(3); //延时5MS,待AD电源稳定
}
//AD转换
int Get_AD(uchar channel)
{
uchar AD_Finished = 0 ;
int result ;
ADC_DATA = 0x00;
ADC_LOW2 = 0x00;
ADC_CONTR |= channel; //选择AD转换通道
ADC_CONTR |= 0x08 ; // 开始AD转换
_nop_();
_nop_();
_nop_(); //延时3个指令周期,待AD电平稳定
while(AD_Finished == 0) //等待AD转化完成
{
AD_Finished = (ADC_CONTR&0x10); //判断AD转换是否为完成
}
result = ADC_DATA*4+ADC_LOW2 ; //读走AD转换结果
ADC_CONTR &= 0x80 ; //1000 0000 清除AD转换标志位,停止AD采样
return(result); //返回AD采样结果
}
// AD结果处理
float AD_Res_Pro(uchar channel) //对AD结果求5次均值
{
float AD_AV ;
uchar num ;
for(num=5;num>0;num--)
{
AD_AV +=Get_AD(channel);
}
AD_AV=(AD_AV*5.0)/1024 ; //电阻分压比列1/5 ((Vin/5)/5.0)/1024 = ADC_Res
return AD_AV;
}
//MS延迟程序
void Delay_MS(uint MS)
{
uint x,y;
for(x=MS;x>0;x--)
{
for(y=876;y>0;y--);
}
}
//LED状态
void LED_ST(void)
{
if( AD_Res_Pro(7)>12.5) // 12.5V的AD转换结果 AD7电阻1/5采样
{
LED_G = 0 ;
LED_Y = 1 ;
}
else
{
LED_G = 1 ;
LED_Y = 0 ;
}
}
//主程序
void main(void)
{
P2M0 = 0x00;
P2M1 = 0xff; //P2口初始化,全部推挽输出
Init_AD(); //AD初始化
while(1) //无限循环检测
{
LED_ST(); //LED状态
}
}
-
-
12W太阳能庭院灯控制器.pdf
下载积分: 积分 -1 分
81.28 KB, 下载次数: 8, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2, int和float处理函数,对AD_AV的处理不同。
AD_AV 初始化也初始化0过,没有什么效果的。
int和float的运算差别这个就不理不清了~~~~
一周热门 更多>