自学单片机之ADC-模数转换.docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
自学单片机之ADC-模数转换

ADC 模数转换Adc转换的值乘以分辨率的最小刻度就是对应电压值1.1 AD转换的主要技术指标1.11 分辨率 (可以类比于量程最小刻度来理解) 常用二进制的位数来表示。例如:12位的ADC 分辨率就为 12 位,或者说分辨率为满刻度的1/(2^12) 。一个10V的满刻度的12 位adc 能分辨的输入电压变化最小值为:10V*1/(2^12)=2.4mv1.12 量化误差 所谓量化:ADC把模拟量变为数字量,用数字量近似表示模拟量,这个过程就是量化,所引起的误差就是量化误差。1.13 偏移误差 满刻度误差 线性度 绝对精度 转换速率 (详见普中51单片机教程)1.14 逐次逼近式AD转换器介绍:1.2 xpt 2046 芯片 XPT2046 是一款 4 线制电阻式触摸屏控制器,内含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器。XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口。XPT2046 能通过执行两次 A/D 转换查出被按的屏幕位置, 除此之外,还可以测量加在触摸屏上的压力。内部自带 2.5V 参考电压,可以作为辅助输入、温度测量和电池监测之用,电池监测的电压范围可以从 0V 到 6V。XPT2046 片内集成有一个温度传感器。 在 2.7V 的典型工作状态下,关闭参考电压,功耗可小于 0.75mW。 X、Y、Z、VBAT、Temp和AUX模拟信号经过片内的控制寄存器选择后进入ADC,ADC可以配置为单端或差分模式。选择VBAT、Temp和AUX时应该配置为单端模式;作为触摸屏应用时,应该配置为差分模式,这可有效消除由于驱动开关的寄生电阻及外部的干扰带来的测量误差,提高转换精度。 1.3 编程相关通信时序:程序:程序思路:1首先我们要定义一个全局变量来存储我们读到的 AD (模数转换)值;2再就是 SPI 通信,我们首先要给XPT2046写入命令字,高位在前一位一位写入, 即 选择相应的通道输出。3 再就是读取 XPT2046 的 12 位输出值,一位一位读取,先读高位。void SPI_Write(uchar dat) 写入命令字函数 {uchar i;CLK = 0;for(i=0; i8; i++) //写八次{DIN = dat 7; // 右移七位 将最高位写入XPT2046 dat = 1; //右移一位 选取次高位CLK = 0;CLK = 1; 时钟上升沿 开始写入}}uint SPI_Read(void) // SPI 通信 读函数 因为读取的值是要用的,所以程序最后 需要返回值 , 又因为读取的数据为12位,所以用 uint 而 不是 空定义 void {uint i, dat=0;CLK = 0;for(i=0; i12; i++)//循环读取 12 次 注意 写函数是先赋值,再移位。而读函数 需要先移位再赋值,因为只需移位十一次,第一次移位是初值0 所以并没有移位{dat = 1;CLK = 1; //开始读CLK = 0;dat |= DOUT; 用“与”符号是防止干扰 只要DOUT有1 则dat 就有1 }return dat; 返回值}uint Read_AD_Data(uchar cmd) 单片机读取AD值函数 {uchar i;uint AD_Value;CLK = 0;CS = 0;SPI_Write(cmd); 写命令字for(i=6; i0; i--); // 循环六次 小延时 ,等待命令字写完CLK = 1; // 发送一个时钟周期,清除BUSY_nop_();_nop_();CLK = 0;_nop_();_nop_();AD_Value=SPI_Read(); 赋值读到的 值CS = 1; 片选拉高 停止工作return AD_Value; 返回值 等待调用}void datapros() 数据处理函数 {u16 temp;static u8 i;if(i==50){i=0;temp = Read_AD_Data(0x94);// }i++;disp[0]=smgduan[temp/1000];//千位disp[1]=smgduan[temp%1000/100];//百位disp[2]=smgduan[temp%1000%100/10];//十位disp[3]=smgduan[temp%1000%100%10];}

文档评论(0)

138****7331 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档