AD电阻转换---那些年我们一起玩mini2440(arm9)裸机

发布时间:2024-08-09  

ADC驱动程序设计

ADC:模/数转换器

一种将模拟信号转换成数字信号的装置;

DAC:数/模转换器。

一种将数字信号转换成模拟信号的装置。

模拟信号转换为数值信号的步骤:

1.     取值;

2.     量化;

3.     编码;

S3C2440ADC

S3C2440芯片内部共有8路A/D转换通道AIN0~AIN7,但是转换器只有一个。

转换精度为10位,故转换后的值最小时会接近0,最大时会接近1024.

 

 


最大的转换率在2.5MHZ转换时钟下能达到500KSPS(每秒采样5000千次)

 

在常见的设计中,如mini2440开发板,一般AIN4、AIN5、AIN6、AIN7被用作了四线电阻触摸的YM、YP、XM、XP通道;剩余的AIN0~3被引出,其中AIN0直接和一个可调电阻W1连接。

 

师:AIN4、AIN5、AIN6、AIN7给触摸屏用的;

AIN0用于可调电阻

(这样电压就可以作为一路模拟信号进行转换)

 

 

 

 ADC驱动流程:1.初始化à2.启动à3.转换结束à4.读取转换值

 

 

 


一.ADC初始化

 

A.选择转换通道-     B.设置转换频率

 

 

 怎么判断开始转换了?用一个whlie循环,查询ENABLE_START是否变成0

 

 怎么判断转换完成了?不断查询ECFLG是否为1

 

 读取转换值

 

#define GLOBAL_CLK      1  

#include   

#include   

#include "def.h"  

#include "option.h"  

#include "2440addr.h"  

#include "2440lib.h"  

#include "2440slib.h"  

#include "mmu.h"  

#include "profile.h"  

#include "memtest.h"  

  

  

#define ADC_FREQ 2500000  

//#define ADC_FREQ   1250000  

  

  

volatile U32 preScaler;  

  

void adc_init(void);  

int ReadAdc(int channel);  

static void cal_cpu_bus_clk(void);  

void Set_Clk(void);  

void beep_init(void);  

void beep_run(void);  

/*************************************************  

Function name: delay  

Parameter    : times  

Description  : 延时函数  

Return       : void  

Argument     : void  

Autor & date : Daniel  

**************************************************/  

void delay(int times)  

{  

    int i,j;  

    for(i=0;i       for(j=0;j<400;j++);  

}  

/*************************************************  

Function name: Main  

Parameter    : void  

Description  : 主功能函数  

Return       : void  

Argument     : void  

Autor & date : Daniel  

**************************************************/  

void Main(void)  

{     

    int a0=0,tmp;  

    int Scom=0;  

    Set_Clk();  

    Uart_Init(0,115200);  

    Uart_Select(Scom);  

        

    adc_init();  

       while(1)  

    {  

        a0=ReadAdc(0);  

        Uart_Printf( "AIN0: %04dn", a0);  

        delay(1000) ;  

    }  

  

}     

  

/*************************************************  

Function name: adc_init()  

Parameter    : int channel  

Description  : adc初始化  

Return       : void  

Argument     : void  

Autor & date : Daniel  

**************************************************/   

void adc_init(void)  

{  

    int channel=0; //AIN0,对应开发板上W1可调电阻  

      

    preScaler = ADC_FREQ;  

    Uart_Printf("ADC conv,freq. = %dHzn",preScaler);  

    preScaler = 50000000/ADC_FREQ - 1; //PCLK=50M  我们要得到ADC_FREQ=2500000  

      

    Uart_Printf("PRSCVL=PCLK/ADC_FREQ - 1=%dn",preScaler);  

      

    /*AD转换频率设置,最大频率为2.5MHz*/  

    rADCCON = (1<<14)|(preScaler<<6)|(channel<<3);    //setup channel 1<<14使能预分频器 (preScaler<<6)预分频值  channel<<3模拟通道选择  

    delay(1000);          

  

}  

      

/*************************************************  

Function name: ReadAdc(int channel)  

Parameter    : int channel  

Description  : 获取AD 转换后的值  

Return       : int  

Argument     : void  

Autor & date : Daniel  

**************************************************/      

int ReadAdc(int channel)  

{  

  

    /*开启AD转换*/  

    rADCCON |= 0x01; //start ADC  

      

      

    while(rADCCON & 0x1);   //check if Enable_start is low  

      

    while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high判断转换是否结束  

          

    return ( (int)rADCDAT0 & 0x3ff );//读取转换后的值  

}   

/*************************************************  

Function name: Set_Clk()  

Parameter    : void  

Description  : 设置CPU的时钟频率  

Return       : void  

Argument     : void  

Autor & date : Daniel  

**************************************************/  

void Set_Clk(void)  

{  

    int i;  

    U8 key;  

    U32 mpll_val = 0 ;  

    i = 2 ;              //don't use 100M!  

                         //boot_params.cpu_clk.val = 3;  

    switch ( i ) {  

    case 0: //200  

        key = 12;  

        mpll_val = (92<<12)|(4<<4)|(1);  

        break;  

    case 1: //300  

        key = 13;  

        mpll_val = (67<<12)|(1<<4)|(1);  

        break;  

    case 2: //400  

        key = 14;  

        mpll_val = (92<<12)|(1<<4)|(1);  

        break;  

    case 3: //440!!!  

        key = 14;  

        mpll_val = (102<<12)|(1<<4)|(1);  

        break;  

    default:  

        key = 14;  

        mpll_val = (92<<12)|(1<<4)|(1);  

        break;  

    }  

      

    //init FCLK=400M, so change MPLL first  

    ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //set the register--rMPLLCON  

    ChangeClockDivider(key, 12);    //the result of rCLKDIVN [0:1:0:1] 3-0 bit  

    cal_cpu_bus_clk();    //HCLK=100M   PCLK=50M  

}  

/*************************************************  

Function name: cal_cpu_bus_clk  

Parameter    : void  

Description  : 设置PCLKHCLKFCLK的频率  

Return       : void  

Argument     : void  

Autor & date : Daniel  

**************************************************/  

static void cal_cpu_bus_clk(void)  

{  

    static U32 cpu_freq;  

    static U32 UPLL;  

      

    U32 val;  

    U8 m, p, s;  

      

    val = rMPLLCON;  

    m = (val>>12)&0xff;  

    p = (val>>4)&0x3f;  

    s = val&3;  

  

    //(m+8)*FIN*2 不要超出32位数!  

    FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<      

    val = rCLKDIVN;  

    m = (val>>1)&3;  

    p = val&1;    

    val = rCAMDIVN;  

    s = val>>8;  

      

    switch (m) {  

    case 0:  

        HCLK = FCLK;  

        break;  

    case 1:  

        HCLK = FCLK>>1;  

        break;  

    case 2:  

        if(s&2)  

            HCLK = FCLK>>3;  

        else  

            HCLK = FCLK>>2;  

        break;  

    case 3:  

        if(s&1)  

            HCLK = FCLK/6;  

        else  

            HCLK = FCLK/3;  

        break;  

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    电压从哪里来? 我们要检测输出电压,就要连接到输出电压端,但是输出端是24V,12V,5V,REF要稳压到多少V呢?这就要看电源芯片3842的FB引脚了,这个......
    。所以,后端电源芯片的选择也需提前规划,如果选用耐压60V电源芯片,可通过测试。 以上是三颗器件的选型原则,当然客户也可以根据测试指标稍作调整。有关器件DWP60-300F、SS56、SM8S36CA......
    到了一款TI的电源芯片TPS54560,目前因为TI的交期比较紧张,急需要一款参数合适的国产电源芯片去替代它。以下就是芯洲科技的SCT2650TPS54560的参数对比图 图1:SCT2650......
    电源管理类芯片分类 汽车电机控制器的电源方案;1. 电源类芯片介绍 电源芯片是指对电源进行变换或者控制,为负载正常工作提供合适的电压或者电流的集成电路芯片,是模拟集成电路中非常重要的芯片种类,一般包括电源转换类芯片......
    一文读懂汽车芯片电源转换类芯片;1. 电源类芯片介绍 电源芯片是指对电源进行变换或者控制,为负载正常工作提供合适的电压或者电流的集成电路芯片,是模拟集成电路中非常重要的芯片种类,一般包括电源转换类芯片......
    只是德州仪器等少数国外厂商的天下。3月31日,来自苏州的易能在深圳市科兴科学园召开了“2017易能微电子春季快充新品发布会”,给大家带来了性价比极高的芯片和快充方案,搅局火热的快充芯片市场。   可重构电源芯片......
    。 图5 DC24V_DC5V转换电路 LM2576为系列电源芯片,此次选用电源芯片具体型号为LM2576SX-5.0,其输入为DC8V-DC40V,输出稳定为DC5V,效率为77......
    一般不会造成灾难性的后果,但是电源短路就...... b. 电源网络没短路?那么好,那就看看电源输出是否是自己理想的值,对于初学者,调试的时候最好IC一件件芯片上,第一个要上的就是电源芯片。 c. 电源......
    用它的布局。 2、MB1319 是MB1136的改版,出现在ST芯片低功耗和LORA盛行的2017年至2018年,这款主板主要为低功耗系列芯片提供电源控制实验验证环境,它板载一颗开关电源芯片SMPS是它区别......
    PN8368 5V1.5A高精度低功耗电源芯片;每个电路板上都有电源芯片,不管是线性电源芯片,还是开关电源芯片,都是有损耗的。一般情况下,开关电源芯片的损耗要比线性电源芯片的损耗小的多,电源管理芯片......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>