写在前面
最近请教了一位前辈,终于搞明白用AD做按键扫描转换值的计算方法,这里写一篇博客加深下印象顺便给大伙儿分享一下。
总的来说,无论是用AD扫描按键还是用AD检测温度,湿度,亮度……原理都是利用电阻值不同来使转换出来的AD值不同,然后在程序中对这些值做判断从而识别出是哪一个按键按下或是温度等数值。
还是用上篇博客的按键扫描来做举例,电路图如下:
CN7这边,每条线都是通过串联一个10K的电阻到VCC,以一个AD扫描口做分析,四个按键通过导线或电阻连接到单片机IO口,同时还通过一个10K的电阻连接到VCC,这样按键这条路与10K的电阻就会分压,然后单片机IO口通过检测电压的大小来转换成一个相应的AD值,计算的式子为Vout=VCC*[Rx/(Rx+10K)],其中Rx代表的是与按键串联的分压电阻+按键内阻(忽略不计)。
这样假设我们什么键也没有按下,相当于IO口直接接了一个上拉电阻到VCC上,单片机IO口被置为高电平,电压理论上为5V,AD转换出来的值也为最大值255(基准值为VCC)
如果按下了10K的按键,这时候Rx大约为1/2VCC,单片机IO口检测出来的电压也大约只有1/2VCC,所以按照比例,转换出来的八位数据为256*1/2=128。
同理39K则为(39/(39+10))*256=203……如果按下了没有串联分压电阻的那一路按键,因为输入IO口的电压为0,那么转换出来的值就直接为0
其他的类似热敏,光敏……都是根据不同的温度,亮度……阻值不一样来给单片机IO口送入不同大小的电压,使值区分从而对应到温度或是其他我们需要得到的值。
下面是一个热敏电阻接到单片机IO口做AD检测电路,是一个典型的分压电路,VCC-热敏电阻-同热敏电阻阻值的精密电阻-GND,然后中间拉出一根到IO口的线,当热敏电阻组织最大为100K的时候,输入电压就是1/2 VCC,这时候为了精度,MCU内部选择基准值的时候就要尽量接近1/2VCC,最好是略大一点点,这样就可以把误差尽量减小。