12. ADC模块(STC8A8K64S4A12)
创造点
编辑于 2023年09月27日 18:33
收录于文集
共33篇

一、ADC是模数转换模块。

芯片引脚图

芯片引脚图

二、工作原理

内部有一个数模转换器,把一个数字信号(也就是PWM)转成模拟信号与通道上的电压进行比较,由于是12位的所以数字信号,因此是从0到4096的占空比对5V电压进行转换依次与通道上的模拟电压进行比较,最终结果在寄存器中得到的数据就是需要的数字。

下面的图只是参考,注意15个通道每次只能转换一个,也就是在通道设置寄存器中设置的那个通道。

相关寄存器

三、过程

  1. 清空转换结果寄存器

  2. 配置寄存器中设置转换结果的格式转换速度

  3. 设置要转换哪个通道,开启电源,启动转换

  4. 转换成功后ACD_FLAG会变成1,查这个位就行了,然后读取转换结果寄存器,并把ADC_FLAG置0。

四、代码

代码块
clike
自动换行
复制代码
void ADC_init(int pin,int speed)    //ADC初始化函数
{ 
	switch(pin)
	{
      //下面是设置IO端口的模式为开漏输出,通过两个寄存器相应的位都设置成1
		case 0:P1M0 &= ~0x01; P1M1 |= 0x01; break;                //ADC通道0
		case 1:P1M0 &= ~0x02; P1M1 |= 0x02; break;                //ADC通道1
		case 2:P1M0 &= ~0x04; P1M1 |= 0x04; break;                //ADC通道2
		case 3:P1M0 &= ~0x08; P1M1 |= 0x08; break;                //ADC通道3
		case 4:P1M0 &= ~0x10; P1M1 |= 0x10; break;                //ADC通道4
		case 5:P1M0 &= ~0x20; P1M1 |= 0x20; break;                //ADC通道5
		case 6:P1M0 &= ~0x40; P1M1 |= 0x40; break;                //ADC通道6
		case 7:P1M0 &= ~0x80; P1M1 |= 0x80; break;                //ADC通道7
	}
	ADC_RES=0; 							  //清空结果寄存器高8位
	ADC_RESL=0; 				     	 //清空结果寄存器低8位
   ADC_CONTR |= 0x80;                //使能ADC模块,打开了ADC电源
	ADCCFG = 0x20 | (16-speed);         
  //0x20设置数据输出格式为低8位+高4位,
  //(16-speed)speed取0-16,与0x20按位或就是设置低四位的速度设置位,有16种速度

}

int ADC_get(int pin)                 //取得ADC转换值
{
	int u;
		switch(pin)										//AD通道选择
	{
    //下面的0xc0-0xc7中的c是设置第7和第8位为1,也就是打开ADC电源并且启动转换,
    //后面的0-7是选择通道。
		case 0:ADC_CONTR=0xC0; break;				//通道P10
		case 1:ADC_CONTR=0xC1; break;				//通道P11
		case 2:ADC_CONTR=0xC2; break;				//通道P12
		case 3:ADC_CONTR=0xC3; break;				//通道P13
		case 4:ADC_CONTR=0xC4; break;				//通道P14
		case 5:ADC_CONTR=0xC5; break;				//通道P15
		case 6:ADC_CONTR=0xC6; break;				//通道P16
		case 7:ADC_CONTR=0xC7; break;				//通道P17
	}                      
	_nop_();										//等待4空指令
	_nop_();
	_nop_();
	_nop_();
	while(!(ADC_CONTR & 0x20));                //等待ADC转换完成
	ADC_CONTR &= ~0x20;                      //清除ADC标志
	u = ADC_RES*256+ADC_RESL;					 //结果转换
	return u;
}
复制成功

五、电路图