目录
简介
本文是针对STC32G系列单片机12位高速A/D 转换器两种代码总结,一种是直接读取ADC值,一种是采用ADC_DMA先存取再读,代码中包括如何使能ADC模数转换、定义端口采集。
代码
#include "adc.h"
#include "STC32G.h"
#include "intrins.h"
#define DMA_ADDR 0x800 //寄存器的地址
xdata unsigned char AD_Value[8][6] _at_ DMA_ADDR; //定义储存位置
void ADC_Init()
{
ADCTIM=0x3f;
ADCCFG =0x20; //数据右对齐,时钟选择最慢的
ADC_POWER=1; //打开ADC电源
}
int ADC_Read(unsigned int d)
{
int adcval;
ADC_CONTR&=0xf0; //清空通道
ADC_CONTR|=d; //选择通道
ADC_START =1; //开启ADC转化
_nop_();
_nop_();
while(!ADC_FLAG); //等待ADC转化结束
ADC_FLAG=0;
adcval=(ADC_RES<<8)+ADC_RESL; //计算ADC的值
return adcval;
}
void DMA_Config(void)
{
DMA_ADC_STA = 0x00; //状态寄存器,使能使用ADC通道后置1
DMA_ADC_CFG = 0x00; //bit7 1:Enable Interrupt,中断优先级
DMA_ADC_RXAH = (unsigned char)(DMA_ADDR>>8);//ADC转换数据存储地址
DMA_ADC_RXAL = (unsigned char)DMA_ADDR;
DMA_ADC_CFG2 = 0x00; //每个通道ADC转换次数:4// 1,2,4,8......
DMA_ADC_CHSW0 = 0xe0; //ADC通道使能寄存器 ADC15~ADC13,对应P17~P15
// DMA_ADC_CHSW1 = 0xe0; //ADC通道使能寄存器 ADC7~ADC5
DMA_ADC_CR = 0xc0; //bit7 1:Enable ADC_DMA, bit6 1:Start ADC_DMA
}
说明
一、第一种
第一种代码
void ADC_Init();
int ADC_Read(unsigned int d); //使用前需初始化ADC_Init
为直接读取ADC的值,值得注意的是这里读取和返回的是12位ADC转换的结果,并不是实际的电源值。真正的电压值需要与参考电压进行比较,具体比较公式如下:
由于代码中已经给了具体代码的意义,故不再作特殊说明。下面给出如何作通道选择的寄存器(ADC_CONTR):
前4位B7-B6正常赋值为1111即可,具体功能解释为:
后4位为通道选择,具体通道选择为:
因此在本文代码为了方便,ADC_Read(unsigned int d)中的d为我们的具体的通道选择,同时返回了一个整型的12位ADC值。具体使用例子如下:
V1=ADC_Read(0xf7); //ADC值
num=(float)(V1*5)/4096; //实际电压
代码中5为采用的是外部参考源电压(5V),注意的是采用外部参考源电压不能超过单片机供电电压(5V),测量也同样如此;0Xf7,为选择的是P1.7端口测量电压。
二、第二种
第二种代码:
void ADC_Init();
void DMA_Config(void);
为自动扫描使能的ADC通道并将转换的ADC数据自动存储到XRAM中,即采用ADC_DMA先存取再读。在实际应用过程中建议采用这种方式,可以避免在复杂工程,可能由于中断等问题而导致读取ADC的值不准。下面给出如何作通道选择的寄存器(ADC_CONTR):
注意的是,根据我实际测试来看,SW0对应的是ADC15--ADC8通道,SW0对应的是ADC7--ADC0通道。要使能那个通道,则对应使能那个通道置1例如使能15通道,则为0X80,本文使能的是ADC15到ADC13通道。(即CH7对应ADC15 CH0对应ADC8 CH15对应ADC7 CH8对应ADC0 )具体ADC对应的通道如下图:
DMA_ADC_CFG = 0x00;
此为中断优先级设置,具体为:
下面为具体使用方法:
V1=AD_Value[2][4]*256+AD_Value[2][5]; //P17
V2=AD_Value[1][4]*256+AD_Value[1][5]; //P16
I1=AD_Value[0][4]*256+AD_Value[0][5]; //P15
值得注意的是,V1 V2 I1 都为12为ADC值,如需具体的电压值还需进行转换。[a][b]中a为对应的那个端口b为对应的高四位,低四位数据。其中本文使能了ADC15~ADC13,对应P17~P15,故仅配置了这几个,如果还需要ADC通道则还需对对应的通道进行使能。
(注:不喜白嫖,如对你有帮助请不吝啬您的点赞收藏+关注,如有错误,请批评校正)