完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
最近在改进太阳能庭院灯的时候,对上版的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 #include #define uchar unsigned char #define uint unsigned int ***it LED_R = P2^1; ***it LED_G = P2^0; ***it 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 #include #define uchar unsigned char #define uint unsigned int ***it LED_R = P2^1; ***it LED_G = P2^0; ***it 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状态 } }
|
|
相关推荐
3个回答
|
|
|
感觉int正数部分30000多,10位AD结果加个5次不会超的呀,结果就是偏很多~~
|
|
|
|
|
|
|
|
|
|
|
|
AD_AV 初始化也初始化0过,没有什么效果的。 int和float的运算差别这个就不理不清了~~~~ |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16899 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 18:59 , Processed in 0.540843 second(s), Total 75, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2867