| 
钻石会员 主题
回帖0
积分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
 }
 }
 }
 | 
 |