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开发板

推荐阅读最新更新时间:2024-11-03 00:04

mini2440_LCD_x35移植
从linux 2.6起引入了新一套的驱动管理和注册机制:platform_device 和piatform_driver. (platform代表平台);设备用platform_device表示,驱动用piatform_driver进行注册。 Linuxplatformdriver机制和传统的devicedriver机制(通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platformdevice提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安
[单片机]
mini2440学习之2440时钟配置解
在移植Nboot时,发现串口输出乱码,检查串口配置没问题后,觉得应该是时钟配置没配好,修改后果然ok,所以补习一下! 2440时钟配置详细说明,以上电为顺序讲述: 一、S3C2440A时钟概述 1、S3C2440A的电源管理有4种模式:NORMAL,SLOW,IDLE,SLEEP。 2、 有4种时钟:FCLK,HCLK,PCLK,UCLK具体分工如下: FCLK is used by ARM920T. HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD con
[单片机]
<font color='red'>mini2440</font>学习之2440时钟配置解
TQ2440裸机中断(软中断swi)
1. 引出: 一般情况下,比如调用open系统调用,大家会说此时系统陷入了内核态,继而调用内核的sys_open来进行实际的open处理,但是为什么用户态调用了open就会陷入内核态呢?所谓的用户态及内核态究竟是什么呢? 2. S3C2440软中断 ARM9处理器有7种工作模式,软中断,通俗的说就是为了从其他工作模式切换到管理模式(在管理模式,可以使用的资源最多),处理器提供软中断,主要是为了支持操作系统的系统调用功能。 ARM体系 CPU的7种工作模式: · 用户模式(usr): ARM处理器正常的程序执行状态(对应于LINUX的用户态) · 快速中断模式(fiq): 用于高速数据传输或通道处理 · 中断模式(irq):
[单片机]
【ARM裸机】 - 中断与异常
中断与异常 这节重点理解,对于一个CPU,如S3C2440,它的中断控制器所起的硬件作用,即当中断触发时,硬件本身会强迫CPU到异常向量表的地址处执行其中一条,这是硬件强行完成的跳转操作;之后跳转到中断处理程序,此部分由程序员来实现,一般需要做:1、保护现场 2、执行处理程序 3、回复现场。 理解中断带来的好处,节省了CPU资源,是操作系统中的基础。 ARM的7中工作模式 ARM的2种状态:ARM指令集与Thumb指令集的区别 1、中断控制器 一个事件的处理往往有两种方式: 中断方式 轮询方式 轮询方式比较简单,在死循环中没隔一定时间,进行一次判断事件是否发生,比较耗费资源。 中断方式相对复杂一点,但是节省资源
[单片机]
【ARM<font color='red'>裸机</font>】 - 中断与异常
黑客或可将隐形恶意软件植入“裸机”云主机当中
安全领域中的坚定保守派们一直警告称,一旦计算机落入陌生人手中,那么这些设备将不再值得信任。如今,一家公司的研究人员已经证明,在某些情况下,同样的论断也适用于我们根本无法触及的某些计算设备——云服务器。 本周二,安全厂商Eclypsium公司的研究人员公布了一项实验结果,他们表示对于某类特定云计算服务器,完全可以通过某种狡猾的方式进行入侵:他们可以从云计算供应商处租用服务器——他们在实际测试中选择了IBM云服务——而后变更其固件,隐藏对代码的更改,从而在租用期限截止后将变更延续至另一位租用同一台机器的客户。 虽然在演示当中,他们仅仅只对IBM服务器的固件进行了良性发动,但他们警告称同样的技术完全可以被用于在服务器的隐藏代码内植入
[安防电子]
黑客或可将隐形恶意软件植入“<font color='red'>裸机</font>”云主机当中
S3C2440-裸机篇-03 | GPIO的使用(点亮LED、按键检测)
实验1 —— 点亮一个LED 1.看原理图确定硬件如何连接 原理图中表示了芯片控制LED的硬件电路以及芯片的引脚与LED如何连接。 2. 看主芯片手册确定如何控制引脚 具体:如何让GPF4输出高低电平? 2.1.配置GPF4为输出模式(GPFCON) 设置GPFCON寄存器的第 位=0b01。 2.2.配置GPF4输出高/低电平(GPFDAT) GPFDAT的第4位为0-低电平,1-高电平。(注:corresponding,相应的) 3.汇编程序访问寄存器控制LED 3.1.编辑程序 @ brief: 点亮连接在GPF4的LED @ author: mculover666 @ date: 2
[单片机]
S3C2440-<font color='red'>裸机</font>篇-03 | GPIO的使用(点亮LED、按键检测)
u-boot2011.12在mini2440上的移植1
以u-boot中的smdk240为原型移植到mini2440, gcc版本4.4.3,u-boot版本2011.12 1. 复制board/samsung/smdk2410 到board/samsung/mini2440; 将board/samsung/mini2440下的smdk2410.c重命名为mini2440.c; 修改board/samsung/mini2440的Makefile,将COBJS := smdk2410.o改为COBJS := mini2440.o; 2. 复制include/configs/smdk2410.h到include/configs/mini2440.h 3. 在根目录下的boa
[单片机]
s3c2440裸机-UART编程1-UART硬件介绍及传输原理
1.uart硬件介绍 UART的全称是Universal Asynchronous Receiver and Transmitter(异步收发器)。 uart主要用于: 1.打印调试 2.数据传输 串口通过三根线即可,发送、接收、地线。 pc的TxD - arm的RxD (UART write) arm的TxD - pc的RxD (UART read) 2.uart的参数和格式 波特率:表示每秒传输多少bit,bits per second(bps).一般波特率都会有9600,19200,115200等选项。 格式: 起始位: 先发出一个逻辑”0”的信号,表示传输数据的开始。 数据位:可以是5~8位逻辑”0”或”1”。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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