STC8G1K08A单片机内部集成了一个十位ADC模块.ADC的时钟频率为系统频率2分频在经过用户设置的分频系数在进行再次分频(ADC的工作时钟频率范围为SYSclk/2/1到SYSclk/2/16)
STC8G1K08A单片机ADC的相关寄存器如下图
一、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位。格式如下:
1:转换结果右对齐。ADC_RES保存结果的高2位,ADC_RESL保存结果的低8位。格式如下:
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转换结果计算公式
六、反推ADC输入电压计算公式
采用查询方式的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