📄 adc_sampling.c
字号:
/*===============================================================*/
/*函数名称: main.c */
/*函数功能: 主函数,调用各模块 */
/*基本思想: 单端输入,定时启动,由T2定时,选择AIN0.3为ADC0转化通道 */
/*修改记录: 有修改记录 */
/*编写作者: t483-4-19chenyong */
/*编写日期: 2007-4-06 */
/*把realvol变为ad_value */
/**修改日期:2008.3.28/
/*===============================================================*/
#include "common.h"
#include "adc.h"
//extern float realvol; //真实测量电压值
extern long ad_value = 0;
int kk;
int number=0;
extern bit isnewdata;
/*===============================================================*/
/*函数说明:定时器2初始化
/*修改日期: 2008.3.27 */
/*===============================================================*/
void t2_initial()
{
// CKCON= 0x20; // T2时钟为系统时钟
// T2CON= 0x04; // T2为16bit定时器模式,并启动定时器运行
SFRPAGE = 0x00;
TMR2CF = 0x00; /*采用系统时钟12分频*/
TMR2CN = 0x00; /*定时器模式,自动重载*/
CKCON = 0x00; /*采用系统时钟12分频*/
// RCAP2H = 0x00; /*Init reload values*/
// RCAP2L= 0x00; /*Init reload values*/
// SFRPAGE = 0x00;
// TMR2L = 0x00;
// TMR2H = 0x00; /*定时初始化*/
// IE|=0x20; /* T2中断使能 ET2=1 */
}
/*===============================================================*/
/*函数说明:因为是用定时器2益处,中断来启动adc转换 */
/*入口参数:
t2reload---------------------------------定时脉冲数目*/
/*修改日期: 2008.3.27 */
/*===============================================================*/
void t2_baud(uint t2reload)
{ //每隔t2reload个T2时钟,产生一次定时溢出
// RCAP2H=(~t2reload+1)/256;//相当于65536-t2reload
// RCAP2L=(~t2reload+1)%256;
// TH2=RCAP2H;
// TH2=RCAP2L;
SFRPAGE = 0x00;
RCAP2H = (~t2reload+1)/256; /*Init reload values*/
RCAP2L = (~t2reload+1)%256; /*Init reload values*/
SFRPAGE = 0x00;
TMR2H = RCAP2H;
TMR2L = RCAP2L; /*装载初值*/
// TF2=0; /*T2没有溢出*/
// TR2=1; //启动定时器2
TMR2CN |=0x04; /*启动定时器2 */
}
/*===============================================================*/
/*函数说明:选择ADC输入的模拟通道 */
/*入口参数:
source----------------------为ADC0通道选择(共有9个通道)
type-------------------配置测量方式为差动还是单端输入*/
/*===============================================================*/
void adc0_mux(uchar type,uchar source){
SFRPAGE = 0x00;
AMX0CF=type; //AIN67IC,AIN45IC,AIN23IC,AIN01IC,0为单端输入。
AMX0SL=source; //选择AD输入通道的,有9个,其中第9通道是内部温度输入 /*0000B-0111B通道*/
/*source = 3选择AIN0.3*/
}
/*===============================================================*/
/*函数说明:ADC0的初始化函数 */
/*修改记录: 有修改记录 */
/*修改时间:2008.3.28 */
/*===============================================================*/
void adc0_initial()
{
char SFRPAGE_SAVE = SFRPAGE; // Preserve current SFR page
SFRPAGE = ADC0_PAGE;
ADC0CF=0x0f; //ADC0时钟为系统时钟2(/*1*1+1=2*/)分频,PGA增益为0.5/*ADC 0 CONFIGURATION */
ADC0CN=0x8c; //AD0TM=0,ADC0为连续跟踪模式,由T2溢出率启动ADC0/*ADC0开启,必须使BIASE置1*//*ADC 0 CONTROL */
SFRPAGE = ADC0_PAGE; //AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位
REF0CN&=0x0f; //AD0VRS=0,ADC0参考电压为VREFA
REF0CN|=0x07; //TEMPE=1,内部温度传感器工作/*ADC/DAC工作,须将此位置1 ,内部参考电压输出开启*/
/*
REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与 VREF0(C8051F040的16管脚相连,
并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波
*/
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page.
adc0_mux(0x08,3);//PORT3IC=1,ADC0 6、7通道为差动模式 /*P3奇数位和偶数位成差动输入模式*/
//AIN0.0-AIN0.3均为单端模式 /*HVDA为单端输入模式,送入ADC0转换的信号为HVDA输出与AGND之间的电平*/
//选择AIN0.1为ADC0转化通道 /* 最高电平不要超过3.6V,否则可能会烧坏AD转换器 */
EIE2|=0x02; //开ADC0中断
t2_initial();
t2_baud(2000); //每隔4000个T2时钟产生一次ADC0采样
// TR2=1; /*T2的优先级高于ADC0的优先级*/ /*T2溢出,启动ADC0转换*/
}
void ADC0_ISR() interrupt 15
{
number++;
if(number==1)
{
AD0INT=0; /*ADC0转换尚未完毕*/
SFRPAGE=0x00;
kk=ADC0VAL; /*ADC0 Data Word 16位*/
// realvol=(long)kk*ADJRATESE;
ad_value = (long)kk*ADJRATESE;
/*
ADC0转化值乘以单端电平系数,其结果为电平真实值乘以100000
*/
number = 0;
isnewdata=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -