钻石会员
  
主题
帖子
积分11931
阅读权限50
注册时间2009-7-18
最后登录1970-1-1
在线时间 小时
|

楼主 |
发表于 2011-5-8 15:01
|
显示全部楼层
本帖最后由 LBQ691477940 于 2011-5-8 15:08 编辑
谢谢!回复,我也是用一个通道作为基准源,实际连接是P1.2口接基准源的,R17是个可调电阻(如果不接C7/C8/R18效果更差),但结果好像不太理想比如你输入的是 15V然后调节R17让其显示的值跟万用表相等但然后再输入10V以下的电压却显示值会比万用表 > 0.1V的样子,如果输入的是20V以上又会比万用表 < 0.1V左右。也就是线性度相当差请问有什么方法能控制吗?
GandF原创M8数控电源所用的M8里面的AD位不比STC12A60S2的位高呀!(AD性能应该是M8的高,哈哈!)为何GandF版的线性那么好呢??
//=============================== AD转换程序 ======================================
//功能:各通道AD转换通用程序
//入口: uchar channels 可 = 0/1/2/3/4/5/6/7 分别对应为P1.0~P1.7 为AD输入通道
//出口:返回对应通道的转换结果
//设计: LBQ691477940 2011-02-19
//=================================================================================
uint ADC(uchar channels) //AD转换程序
{
uchar AD_finished=0; //存储 A/D 转换标志
ADC_RES = 0;
ADC_RESL = 0;
channels &= 0x07; //0000,0111 清0高5位
ADC_CONTR = AD_SPEED;
nop;
ADC_CONTR |= channels; //选择 A/D 当前通道
nop;
ADC_CONTR |= 0x80; //启动 A/D 电源
delay(1); //使输入电压达到稳定
ADC_CONTR |= 0x08; //0000,1000 令 ADCS = 1, 启动A/D转换,
AD_finished = 0;
while (AD_finished ==0 ) //等待A/D转换结束
{
AD_finished = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
}
ADC_CONTR &= 0xE7; //1111,0111 清 ADC_FLAG 位, 关闭A/D转换,
return (ADC_RES*256+ADC_RESL+1); //返回 A/D 转换结果
}
//==========================ADC转换30次的平均数=====================================
uint ADC_Filter(uchar IOd) //软件算术平均滤波
{
ulong sum = 0;
uchar count;
for(count=0;count <32;count++)
{
sum += ADC(IOd);
delay(1);
return (uint)(sum /32);
}
//============================= 检测 V1 =================================
void TEST_V1() //22V-24.2V 19.6V-22.2V
{
V1_OK = 0;
ADC_result2 = ADC(2); //P1.2接LM385_BZ1.2稳压实测为1.241V作基准电压
//voltage = (ADC_Filter(0) * 50000.0/1024);//外部已缩小了10倍故*10
voltage = ADC_Filter(0)*1.0/ADC_result2*1241;; //P1.0 为 A/D 当前通道
if(V1_H_L)//判断是测V1的22~24.2V还是19.6~22.2V
{
if((voltage >= 22100)&&(voltage <= 24100)) //收严为22.1v~24.1v
{
V1_OK = 1;//在规格范围则将V1_OK置1
}
else
{
if((voltage < 22100)&&(voltage > 24100)) //收严为22.1v~24.1v
V1_OK = 0; //不在规格范围则将V1_OK置0
}
}
if(!V1_H_L)//判断是测V1的22~24.2V还是19.6~22.2V
{
if((voltage >= 19700)&&(voltage <= 22100)) //收严为19.7v~22.1v
{
V1_OK = 1;//在规格范围则将V1_OK置1
}
else
{
if((voltage < 19700)&&(voltage > 22100)) //收严为19.7v~22.1v
V1_OK = 0; //不在规格范围则将V1_OK置0
}
}
} |
|