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通道;剩余的AIN0~3被引出,其中AIN0直接和一个可调电阻W1连接。

 

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

AIN0用于可调电阻

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

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

一.ADC初始化

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

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

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

读取转换值

pasting

  1. #define GLOBAL_CLK      1
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "def.h"
  5. #include "option.h"
  6. #include "2440addr.h"
  7. #include "2440lib.h"
  8. #include "2440slib.h"
  9. #include "mmu.h"
  10. #include "profile.h"
  11. #include "memtest.h"
  12. #define ADC_FREQ 2500000
  13. //#define ADC_FREQ   1250000
  14. volatile U32 preScaler;
  15. void adc_init(void);
  16. int ReadAdc(int channel);
  17. static void cal_cpu_bus_clk(void);
  18. void Set_Clk(void);
  19. void beep_init(void);
  20. void beep_run(void);
  21. /*************************************************
  22. Function name: delay
  23. Parameter    : times
  24. Description  : 延时函数
  25. Return       : void
  26. Argument     : void
  27. Autor & date : Daniel
  28. **************************************************/
  29. void delay(int times)
  30. {
  31. int i,j;
  32. for(i=0;i<times;i++)
  33. for(j=0;j<400;j++);
  34. }
  35. /*************************************************
  36. Function name: Main
  37. Parameter    : void
  38. Description  : 主功能函数
  39. Return       : void
  40. Argument     : void
  41. Autor & date : Daniel
  42. **************************************************/
  43. void Main(void)
  44. {
  45. int a0=0,tmp;
  46. int Scom=0;
  47. Set_Clk();
  48. Uart_Init(0,115200);
  49. Uart_Select(Scom);
  50. adc_init();
  51. while(1)
  52. {
  53. a0=ReadAdc(0);
  54. Uart_Printf( "AIN0: %04d\n", a0);
  55. delay(1000) ;
  56. }
  57. }
  58. /*************************************************
  59. Function name: adc_init()
  60. Parameter    : int channel
  61. Description  : adc初始化
  62. Return       : void
  63. Argument     : void
  64. Autor & date : Daniel
  65. **************************************************/
  66. void adc_init(void)
  67. {
  68. int channel=0; //AIN0,对应开发板上W1可调电阻
  69. preScaler = ADC_FREQ;
  70. Uart_Printf("ADC conv,freq. = %dHz\n",preScaler);
  71. preScaler = 50000000/ADC_FREQ - 1; //PCLK=50M  我们要得到ADC_FREQ=2500000
  72. Uart_Printf("PRSCVL=PCLK/ADC_FREQ - 1=%d\n",preScaler);
  73. /*AD转换频率设置,最大频率为2.5MHz*/
  74. rADCCON = (1<<14)|(preScaler<<6)|(channel<<3);    //setup channel 1<<14使能预分频器 (preScaler<<6)预分频值  channel<<3模拟通道选择
  75. delay(1000);
  76. }
  77. /*************************************************
  78. Function name: ReadAdc(int channel)
  79. Parameter    : int channel
  80. Description  : 获取AD 转换后的值
  81. Return       : int
  82. Argument     : void
  83. Autor & date : Daniel
  84. **************************************************/
  85. int ReadAdc(int channel)
  86. {
  87. /*开启AD转换*/
  88. rADCCON |= 0x01; //start ADC
  89. while(rADCCON & 0x1);   //check if Enable_start is low
  90. while(!(rADCCON & 0x8000)); //check if EC(End of Conversion) flag is high判断转换是否结束
  91. return ( (int)rADCDAT0 & 0x3ff );//读取转换后的值
  92. }
  93. /*************************************************
  94. Function name: Set_Clk()
  95. Parameter    : void
  96. Description  : 设置CPU的时钟频率
  97. Return       : void
  98. Argument     : void
  99. Autor & date : Daniel
  100. **************************************************/
  101. void Set_Clk(void)
  102. {
  103. int i;
  104. U8 key;
  105. U32 mpll_val = 0 ;
  106. i = 2 ;              //don‘t use 100M!
  107. //boot_params.cpu_clk.val = 3;
  108. switch ( i ) {
  109. case 0: //200
  110. key = 12;
  111. mpll_val = (92<<12)|(4<<4)|(1);
  112. break;
  113. case 1: //300
  114. key = 13;
  115. mpll_val = (67<<12)|(1<<4)|(1);
  116. break;
  117. case 2: //400
  118. key = 14;
  119. mpll_val = (92<<12)|(1<<4)|(1);
  120. break;
  121. case 3: //440!!!
  122. key = 14;
  123. mpll_val = (102<<12)|(1<<4)|(1);
  124. break;
  125. default:
  126. key = 14;
  127. mpll_val = (92<<12)|(1<<4)|(1);
  128. break;
  129. }
  130. //init FCLK=400M, so change MPLL first
  131. ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);   //set the register--rMPLLCON
  132. ChangeClockDivider(key, 12);    //the result of rCLKDIVN [0:1:0:1] 3-0 bit
  133. cal_cpu_bus_clk();    //HCLK=100M   PCLK=50M
  134. }
  135. /*************************************************
  136. Function name: cal_cpu_bus_clk
  137. Parameter    : void
  138. Description  : 设置PCLK\HCLK\FCLK的频率
  139. Return       : void
  140. Argument     : void
  141. Autor & date : Daniel
  142. **************************************************/
  143. static void cal_cpu_bus_clk(void)
  144. {
  145. static U32 cpu_freq;
  146. static U32 UPLL;
  147. U32 val;
  148. U8 m, p, s;
  149. val = rMPLLCON;
  150. m = (val>>12)&0xff;
  151. p = (val>>4)&0x3f;
  152. s = val&3;
  153. //(m+8)*FIN*2 不要超出32位数!
  154. FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;     //FCLK=400M  FIN=12000000
  155. val = rCLKDIVN;
  156. m = (val>>1)&3;
  157. p = val&1;
  158. val = rCAMDIVN;
  159. s = val>>8;
  160. switch (m) {
  161. case 0:
  162. HCLK = FCLK;
  163. break;
  164. case 1:
  165. HCLK = FCLK>>1;
  166. break;
  167. case 2:
  168. if(s&2)
  169. HCLK = FCLK>>3;
  170. else
  171. HCLK = FCLK>>2;
  172. break;
  173. case 3:
  174. if(s&1)
  175. HCLK = FCLK/6;
  176. else
  177. HCLK = FCLK/3;
  178. break;
  179. }
  180. if(p)
  181. PCLK = HCLK>>1;
  182. else
  183. PCLK = HCLK;
  184. if(s&0x10)
  185. cpu_freq = HCLK;
  186. else
  187. cpu_freq = FCLK;
  188. val = rUPLLCON;
  189. m = (val>>12)&0xff;
  190. p = (val>>4)&0x3f;
  191. s = val&3;
  192. UPLL = ((m+8)*FIN)/((p+2)*(1<<s));
  193. UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;
  194. }
时间: 2024-08-03 01:52:28

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

uart串口发送---那些年我们一起玩mini2440(arm9)裸机

Uart工作原理: 数据通信方式为:并行通信与串行通信两种: §并行通信:利用多条数据线将数据的各位同时传送. 它的特点是:传输速度快,是用于短距离通信: §串行通信:利用一条数据线将数据一位位地顺序传送. 特点是通信线路简单,利用简单的线缆就实现通信,低成本,是用于远距离通信.   异步通信: ª异步通信:以一个字符为传输单位,通过两个字符间的时间间隔是不固定的,然而同一字符中的两个相邻位之间的时间间隔是固定的. ª通信协议:是指通信双方约定的一些规则.在异步通讯时,对数据格式有如下约定:规定

定时器中断---那些年我们一起玩mini2440(arm9)裸机

(时钟体系) 时钟概念: ★时钟脉冲:一个按一定电压幅度,一定时间间隔连续发出的脉冲信号: ★时钟频率:在单位时间(如:1秒)内产生的时钟秒冲数: 时钟的作用: 时钟信号是时序逻辑的基础,它用于决定逻辑单元中的状态何时更新.数字芯片中众多的晶体管都工作在开关状态,它们的导通和关断动作无不是按照时钟信号的节奏进行的. 时钟的作用(简洁版) 系统中的设备需要有个时间来和它进行同步—即靠时钟! 时钟的产生-晶振 晶振:晶体振荡器,是用石英晶体精密切割做成. 优点:振荡频率非常稳定:振荡频率很准确:结构

按键中断---那些年我们一起玩mini2440(arm9)裸机

ARM中断控制系统 按键驱动程序设计 一.Arm中断控制系统 1.查询方式 程序不断地查询设备的状态,并做出相应的反应.该方式实现比较简单,常用在比较单一的系统中,比如:一个温控系统中可以实用查询的方式不断检测温度变化. 特点:实现简单:但CPU利用率很低,不适合多任务的系统. 2.中断方式 当事件发生时,硬件会设置某个寄存器:CPU在每执行完一个指令时,查看这个寄存器,如果所关注的事件发生了,则中断当前程序,跳转到一个固定的地址处理这个事件,处理完后返回到被中断的程序中继续运行. 特点:实现相

verilog语言实现TCL549(AD)转换

此文章为原创出自 V3学院 www.v3edu.org,FPGA培训专家 ADC 和 DAC 是模拟量和数字量之间不可或缺的桥梁.A/D 转换器是将各种模拟信号转换为抗干扰性更强的数字信号,直接进入数字计算机进行处理. 本设计采用V3学院基础开发板,采用TCL549进行模数转换,通过数码管显示电压值.TLC549 是一个 8 位的串行模数转换器,I/O所需最大时钟为1.1MHz.A/D 转换时间最大 17us,如图1所示,TCL549引脚图,管脚8和4分别接VCC和GND,管脚1和3分别接基准电

重玩Mini2440遇到的坑

今天重新拿起Mini2440来玩,由于原来是在XP上玩的,没遇到什么问题,现在电脑系统升级到Win10了,遇到不少坑.以此记录一下,避免下次再玩的时候又重复出现一些坑. 坑一:板子电源接口有问题,供电偶然会出现异常(这是我的板子特有,使用有一段历史了) 现象:插上电源,板子电源灯亮,程序就是不跑. 解决:重新多插拔几次就可以.也有可能是板子某部分供电硬件有问题,之前使用的时候也发现了,没记录下来,时间长就忘记有这个问题了,还以为是烧的程序有问题.能用就好,硬件问题也不排差了. 坑二:XP上使用官

细数那些年我们一起玩过的Unity3D游戏(unity开发的游戏有哪些)

经典重现<新仙剑OL> <新仙剑OL>采用跨平台Unity3D引擎,耗资数千万,历时三年多,由台湾大宇正版授权,"仙剑之父"姚壮宪监制的全球首款Unity3D航母级双端(网页和客户端)中国风MMORPG网络游戏巨作.主打温情牌并且延续了仙剑系列的国风雅韵,人物塑造细腻唯美,场景构建精致逼真. <蒸汽之城>(City of Steam) 由国内游戏公司参与开发的Unity3D页游<蒸汽之城>(City of Steam)在北美地区呼声颇高,

那些年我们一起玩的Django框架之全面讲解

Web框架之Django: (1)简介: Django是一个由Python写成开源的重量级Web应用框架,采用MTV的框架模式.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的.Django的优势在于:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. (2)Django的处理流程: 1.   

基于24位AD转换模块HX711的重量称量实验(已补充皮重存储,线性温度漂移修正)

转载:http://www.geek-workshop.com/thread-2315-1-1.html 以前在X宝上买过一个称重放大器,180+大洋.原理基本上就是把桥式拉力传感器输出的mV级信号放大到5V供单片机读取.连接实验电路的时候很完美,能实现重量的转换,但是实际组装后却发现这种A/A模块受到的干扰太严重了,包括电源的干扰,导线长短的干扰,导线位置变化的干扰,无线电的干扰等等等等……实在是恼人. 后来感觉是思路错误了,就不该用模拟信号来传输,于是决定使用A/D模块来把重量转换成数字信号

PADS_AD_Cadence转换

软件版本:PADS的版本是PADS9.5,Altium designer的版本是Altium designer winter 09 PADS和AD的转换 PADS的PCB转换为AD9的PCB: 打开powerlayout的PCB后缀文件,导出为asc,格式为5.0或者V2005.0(亲测可用,其他还没测过),在 AD9的Import Wizard中导入PADS ASCII Design. PADS的原理图转换为AD9的原理图: 打开powerlayout的SCH后缀文件,导出为TXT,格式为V2