c语言ad采样程序思路,单片机AD采样程序及其寄存器讲解

描述

ad采样的步骤:首先将外部的信号,通过电路或者已有的AD芯片转换成 主CPU能接受的电压 信号。但是此电压信号必须转换成8、10 、12位或更高位数的数字才能进一步做计算。另外转换成位数多少表明了ad转换的精度。所以需要采样,为了将电压信号转换为8、10 、12位或更高位数的数字。

单片机AD采样工作原理

一般来说,AD有积分型的和逐次逼近型的,后都更多的被使用,所以我们一般也都是使用的这一种。说的简单点,它就像我们用天平来称东西一样;AD收到一个电压信号,先将AD内部的一个寄存器里的最高位置1,然后再把这个数据转换成电压信号与输入的比较,如果大了,那么把最高位清0,次高位置位,就这样比较;如果小了,次高位再置位,再次比较。和称东西的一样吧,你一边放上东西,另一边先放最大的砝码,如果大了再换小的,如果不够,再加次大的,这样比较进行的。

545997c244e38a383f4ed40d33d44fc9.png

STC12C5A60S2单片机AD采样程序

/*********************************************************************************************************************************************************

*程序说明:本程序使用STC12C5A60S2 ADC转换功能,ADC采样使用查询方式

*芯片供电:5V

*采样通道:P1^0

*********************************************************************************************************************************************************/

#include “STC12C5A60S2.h”

#include “stdio.h”

#include “intrins.h”

#include “math.h”

#define uint unsigned int

#define uchar unsigned char

/*******************************************************************************************************************************************************************

*函数功能:获取ADC采样值

*时间:2013、3、27

*相关寄存器讲解: 7 6 5 4 3 2 1 0 Reset Vale

*:ADC_CONTR://A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000

* ADC_RES //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000

*ADC_RESL //A/D 转换结果低2位 ADCV.1 ADCV.0 0000,0000

*寄存器位控制讲解:

ADC_POWER:ADC电源

ADC_START:ADC转换启动控制位 设置为1时开始转换 转换结束后为0

ADC_FLAG:ADC转换结束标志位 转换完成后 ADC_FLAG=1 要由软件一定要清0

SPEED1|SPEED0:模数转换器速度控制位 CHS2/CHS1CHS0:模拟输入通道选择

------------------------------------------------ -------------------------------------------------

|SPEED1 | SPEED0 | 转换时间 | | CHS2 | CHS1 | CHS0 | 模拟输入通道|

| 1 | 1 | 90个时钟周期 | | 0 | 0 | 0 | | P1^0 |

| 1 | 0 | 180个时钟周期 | | 0 | 0 | 1 | | P1^1 |

| 0 | 1 | 360个时钟周期 | | 0 | 1 | 0 | | P1^2 |

| 0 | 0 | 540个时钟周期 | | 0 | 1 | 1 | | P1^3 |

------------------------------------------------- | 1 | 0 | 0 | | P1^4 |

| 1 | 0 | 1 | | P1^5 |

| 1 | 1 | 0 | | P1^6 |

| 1 | 1 | 1 | | P1^7 |

----------------------------------------------

************************************************************************************************************************************************************************/

uint ADC_Get(uchar Channel)

{

ADC_CONTR=0x88|Channel;

_nop_(); _nop_(); _nop_(); _nop_();

while(!(ADC_CONTR&0x10)); //等待转换完成

ADC_CONTR&=0xe7; //关闭AD转换,ADC_FLAG位由软件清0

return(ADC_RES*4+ADC_RESL); //返回AD转换完成的10位数据(16进制)

}

/******************************************************************

*函数功能:将ADC采样值转换为10进制数据

*时间:2013、3、27

******************************************************************/

float ADC_Value(uchar Channel)

{

float AD_Value;

uint i;

for(i=0;i《10;i++) //采样10次取平均值

AD_Value+=ADC_Get(Channel); //转换100次求平均值(提高精度)

AD_Value/=10;

AD_Value=(AD_Value*5)/1024;//ADRJ=0,取10位转换结果ADC_RES+ADC_RESL=1024*Vin/Vcc

return AD_Value;

}

/***************************************************************

*Funtion Name:delay

*Time:2013/3/27

Author:zhuhao

***************************************************************/

void delay(unsigned int a) //延时约1ms

{

unsigned int i;

while (--a!=0)

for(i=600

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值