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

发布者:PeacefulWarrior最新更新时间:2024-08-09 来源: cnblogs关键字:mini2440  arm9  裸机 手机看文章 扫描二维码
随时随地手机看文章

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;  

    }  

      

    if(p)  

[1] [2]
关键字:mini2440  arm9  裸机 引用地址:AD电阻转换---那些年我们一起玩mini2440(arm9)裸机

上一篇:s3c2440裸机开发调试环境(MDK4.72,Jlink v8,mini2440)
下一篇:移植openssh至嵌入式ARM开发板

推荐阅读最新更新时间:2026-03-25 11:33

AD电阻转换---那些年我们一起玩mini2440(arm9)裸机
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通
[单片机]
<font color='red'>AD</font><font color='red'>电阻</font><font color='red'>转换</font>---那些年我们一起玩<font color='red'>mini2440</font>(<font color='red'>arm9</font>)<font color='red'>裸机</font>
s3c2440裸机开发调试环境(MDK4.72,Jlink v8,mini2440)
我的开发环境:windows 7 32位,J-linkv8,mini2440开发板一块。最后选择了:MDK4.72版本,J-ink v8的当前最新版本J-linkARM v4.94。 1)打开Keil uVision4新建一个工程: 2)新建一个目录用于存放我们的工程文件,这样我用新建一个test目录:并且取工程名为test并保存: 3)接下来选择CUP database:我们选择samsung的S3C2440A,点击OK;之后会出现第二个图问你是否拷贝'S3C2440.s'到工程文件夹并加入到工程里,S3C2440.s是启动代码我们选择YES 4)然后我们需要对S3C2440.s进行一些
[单片机]
s3c2440<font color='red'>裸机</font>开发调试环境(MDK4.72,Jlink v8,<font color='red'>mini2440</font>)
mini2440(2) LED灯裸机硬件控制程序
查找mini2440的原理图,找到LED部分的原理图: 然后查找nLED_1到nLED_4分别连接的S3C2440的引脚: 由图可知: nLED_1---GPB5 nLED_2---GPB6 nLED_3---GPB7 nLED_4---GPB8 在S3C2440的引脚划分中,这四个引脚都属于Port B,因此可以通过配置Port B的控制寄存器对这四个引脚的功能进行配置: 如果要让LED灯亮,nLED_1到nLED_4端需要低电平,因此GPB5到GPB8引脚需要: (1)输出:GPBCON 因此,GPBCON寄存器的11,13,15,17位要设置为0,而10,12,14,16位要设置为1,而且我们还知道GPBCO
[单片机]
<font color='red'>mini2440</font>(2) LED灯<font color='red'>裸机</font>硬件控制程序
mini2440裸机之MMU(二)(mmu.c)
/************************************************ NAME : MMU.C DESC : Revision: 2002.2.28 ver 0.0 ************************************************/ #include def.h #include option.h #include 2440addr.h #include 2440lib.h #include 2440slib.h #include mmu.h //段(section)是大小为1MB的存储块 // 1) Only the section table is use
[单片机]
<font color='red'>mini2440</font><font color='red'>裸机</font>之MMU(二)(mmu.c)
mini2440 裸机程序程序心得
1、写裸机程序心得 硬件初始化:a、关闭看门狗 b、初始化时钟 c、配置sdram,并初始化 软件初始化:a、设置堆栈 SP b、设置返回地址 c、调用函数 d、清理工作 看门狗代码: void disable_watch_dog(void) { WTCON = 0; // 关闭WATCHDOG很简单,往这个寄存器写0即可 } 初始化时钟: #define S3C2440_MPLL_200MHZ ((0x5c 12)|(0x01 4)|(0x02)) #define S3C2440_MPLL_400MHZ ((0x5c 12)|(0x01 4)|(0x01)) /* * 对于MPLLC
[单片机]
mini2440烧写裸机程序(linux+supervivi+dnw)
一、编写源程序(init.S、testledC.lds、testledC.c、Makefile) @****************************************************************************** @ File:init.S @ 功能:通过它转入C程序 @****************************************************************************** .text .global _start _start: ldr r0, =0x53000000 @ WATCHDOG寄存器地址
[单片机]
mini2440裸机程序LED
.text .global _start _start: ldr r0,=0x56000010 mov r1,#0x15400 str r1, ldr r0,=0x56000014 mov r1,#0x00 str r1, halt: b halt ****************************************** led_on.bin:led_on.S arm-linux-gcc -c -o led_on.o led_on.S arm-linux-ld -Ttext 0x00000000 led_on.o -o led_on_elf arm-linux-objcopy -O b
[单片机]
mini2440烧写裸机程序(MDK+Jlink)
1、实现1+2+3------+100 AREA test02,CODE,READONLY start MOV R0,#0 MOV R1,#1 MOV R2,#1 LOOP ADD R2,R2,R0 ADD R1,R1,#1 CMP R1,#101 BEQ label ADD R2,R2,R1 B LOOP label NOP NOP NOP END 2、汇编LED测试 /************************************ *注意修改段名为testLED(两处修改) *在MDK中,要添加簇文件RuninRAM.sct *在MDK中,要添加初始化文件Ext_RA
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved