STC8G1K08A单片机数模转换

STC8G1K08A单片机内部集成了一个十位ADC模块.ADC的时钟频率为系统频率2分频在经过用户设置的分频系数在进行再次分频(ADC的工作时钟频率范围为SYSclk/2/1到SYSclk/2/16)

STC8G1K08A单片机ADC的相关寄存器如下图
STC8G1K08A单片机数模转换_第1张图片
一、ADC控制寄存器(ADC_CONTR),PWM触发ADC控制器
在这里插入图片描述
ADC_POWER: ADC电源控制位
0:关闭ADC电源
1:打开ADC电源
ADC_START: ADC转换启动控制位
0:无影响.即使ADC已经开始转换工作,写0也不会停止A/D转换
1:开始ADC转换,转换完成后硬件自动将此位清零
ADC_FLAG: ADC转换结束标志位
当ADC完成一次转换后,硬件会自动将此位置1,并向CPU提出中断请求。此标志位必须由软件清零
ADC_CHS[3:0]: ADC模拟通道选择位
STC8G1K08A-8PIN系列

ADC_CHS[3:0] ADC通道
0000 P3.0/ADC0
0001 P3.1/ADC1
0010 P3.2/ADC2
0011 P3.3/ADC3
0100 P5.4/ADC4
0101 P5.5/ADC5

二、ADC配置寄存器(ADCCFG)
在这里插入图片描述RESFMT: ADC转换结果格式控制位
0:转换结果左对齐。ADC_RES保存结果的高8位,ADC_RESL保存结果的低2位。格式如下:
STC8G1K08A单片机数模转换_第2张图片
1:转换结果右对齐。ADC_RES保存结果的高2位,ADC_RESL保存结果的低8位。格式如下:
STC8G1K08A单片机数模转换_第3张图片
SPEED[3:0] :设置ADC工作时钟频率{Fadc=SYSclk/2(SPEED+1)}

SPEED[3:0] 给ADC的工作时钟频率
0000 SYSclk/2/1
0001 SYSclk/2/2
0010 SYSclk/2/3
1101 SYSclk/2/14
1110 SYSclk/2/15
1111 SYSclk/2/16

三、ADC转换结果寄存器(ADC_RES , ADC_RESL)
在这里插入图片描述
当A/D转换完成后,10位的转换结果会自动保存到ADC_RES和ADC_RESL中。保存结果的数据格式请参考ADC_CFG寄存器中的RESFMT设置。
四、ADC时序控制寄存器
在这里插入图片描述
CSSETUP: ADC通道选择时间控制 Tsetup

CSSETUP 占用ADC工作时钟数
0 1(默认值)
1 2

CSHOLD[1:0]:ADC通道选择保持时间控制Thold

CSHOLD[1:0] 占用ADC工作时钟数
00 1
01 2(默认值)
10 3
11 4

SMPDUTY[4:0]: ADC模拟信号采样时间控制Tduty(注意:SMPDUTY一定不能设置小于01010B)

SMPDUTY[4:0] 占用ADC工作时钟数
00000 1
00001 2
01010 11(默认值)
11110 31
11111 32

五、ADC转换结果计算公式
STC8G1K08A单片机数模转换_第4张图片
六、反推ADC输入电压计算公式
STC8G1K08A单片机数模转换_第5张图片
采用查询方式的ADC采样
1.配置寄存器参数

#define ADC_Power 0X85	   //宏定义   使能ADC模块     打开ADC   将ADC引脚设置到P5.5
#define ADC_Start 0X40	   //宏定义	  开始AD转换
#define ADC_Flag  0X20     //宏定义	  转换完成标志位
#define ADC_SYS   0X0F	   //宏定义   将ADC系统时钟设定为SYSclk/2/16

2.ADC初始化函数

/*ADC初始化函数*/
void Adc_Start()
{
	ADC_CONTR = ADC_Power;     	   //使能ADC模块     打开ADC   将ADC引脚设置到P5.5
	ADCCFG    = ADC_SYS;           //将ADC系统时钟设定为SYSclk/2/16
}

3.ADC转换函数

/*开启ADC转换函数*/
void Adc_ZhuanHuan()
{
	ADC_CONTR |= ADC_Start;           //开启AD转换
	_nop_();		                  //空指令
	_nop_();		                  //空指令
	while(!(ADC_CONTR & ADC_Flag));   //等待转换完成
	ADC_CONTR &=~ ADC_Flag;		      //清除完成标志位
}

4.计算结果(这里只使用8位)

Adc_ZhuanHuan();		//开启ADC转换
NUM = ADC_RES;			//将转换的值赋给NUM
temp = NUM*10*5/256;	//将转换后的数值进行计算  NUM*10*5/255

你可能感兴趣的:(笔记,单片机,51单片机,嵌入式硬件,硬件工程)