STC32系列单片机ADC自定义函数

目录

 

简介

代码

说明

一、第一种

二、第二种


 

简介

        本文是针对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转换的结果,并不是实际的电源值。真正的电压值需要与参考电压进行比较,具体比较公式如下:

8c02f66343a642c38c98b946b9c57bc8.png

        由于代码中已经给了具体代码的意义,故不再作特殊说明。下面给出如何作通道选择的寄存器(ADC_CONTR):

5899cafcf9b6498a85c407ea80f6efc1.png

 

        前4位B7-B6正常赋值为1111即可,具体功能解释为:

c91b1a15a6f8482fbd6949171ca4ccf7.png

        后4位为通道选择,具体通道选择为:

ac04ee296a514e1f987e38876c8661a1.png

        因此在本文代码为了方便,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):

e57eb73ed189487781d83676f4038ba4.png

注意的是,根据我实际测试来看,SW0对应的是ADC15--ADC8通道,SW0对应的是ADC7--ADC0通道。要使能那个通道,则对应使能那个通道置1例如使能15通道,则为0X80,本文使能的是ADC15到ADC13通道。(即CH7对应ADC15 CH0对应ADC8 CH15对应ADC7 CH8对应ADC0 )具体ADC对应的通道如下图:

0ad131a8594448ce91a9fa8de28f36d6.png

 DMA_ADC_CFG = 0x00;	

        此为中断优先级设置,具体为:

b6e864526be9488aa82f14be8c91fb7e.png

        下面为具体使用方法:

        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通道则还需对对应的通道进行使能。

 

(注:不喜白嫖,如对你有帮助请不吝啬您的点赞收藏+关注,如有错误,请批评校正)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值