ARM ADC程序设计
来源:互联网 发布:手机上怎样查淘宝积分 编辑:程序博客网 时间:2024/06/08 22:46
ARM ADC程序设计
模拟信号:时间上连续,数值上也连续,数字信号:时间和数值上是离散的,而离散信号只有0或1。
S3c2440内部有8路A/D转换通道AIN0~AIN7,但是转换器只有一个,从8路中选出一路进行转换,转换精度10位(0~1024-1),转换频率500kSPS(每秒采样500次),在mini2440,AIN4,5,6,7,用作了触摸屏通道YM,YP,XM,XP,AIN0连接可变电阻
AIN0为模拟信号输入通道,电压作为模拟信号输入,ADC程序流程:
初始化---->启动(CPU告诉AD硬件做某项工作)---->转换结束(查询,中断)----->读取转换值
初始化:选择转换通道----->设置转换频率 SEL_MUX选择转换通道,PRSCEN为1表示使用分频器做频率设置,PRSCVL为具体分频器的值,ECFLG转换结束。
数据在0--9位
使用可调电阻作为输入ADC转换程序:#define ADC_FREQ 2500000//#define ADC_FREQ 1250000volatile 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);void delay(int times) { int i,j; for(i=0;i<times;i++) for(j=0;j<400;j++);}void Main(void) { int a0=0,tmp; int Scom=0; Set_Clk();//PCLK在AD转换中用到,ADC转换所需要的时钟频率 beep_init(); Uart_Init(0,115200); Uart_Select(Scom); Uart_Printf("\nHello World!\n"); adc_init();// //tmp=a0; while(1) { a0=ReadAdc(0); //启动转换 // if(a0 != tmp) Uart_Printf( "AIN0: %04d\n", a0); // tmp=a0; delay(1000) ;}}void adc_init(void) {int channel=0; //AIN0,对应开发板上W1可调电阻,选择0号通道 //设置时钟频率preScaler = ADC_FREQ;Uart_Printf("ADC conv,freq. = %dHz\n",preScaler);preScaler = 50000000/ADC_FREQ - 1; //PCLK=50M//50M除以所需频率为预分频系数Uart_Printf("PRSCVL=PCLK/ADC_FREQ - 1=%d\n",preScaler);/*AD转换频率设置,最大频率为2.5MHz*/rADCCON = (1<<14)|(preScaler<<6)|(channel<<3);//setup channeldelay(1000);} int ReadAdc(int channel) {/*开启AD转换,把第0位改为1,然后检查是否为0,变为0后才真正转换 */rADCCON |= 0x01; //start ADCwhile(rADCCON & 0x1);//check if Enable_start is low while(!(rADCCON & 0x8000));//判断第15位是否为1,完成转换 return ( (int)rADCDAT0 & 0x3ff );//data寄存器最后十位} 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://200key = 12;mpll_val = (92<<12)|(4<<4)|(1);break;case 1://300key = 13;mpll_val = (67<<12)|(1<<4)|(1);break;case 2://400key = 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 firstChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); //set the register--rMPLLCONChangeClockDivider(key, 12); //the result of rCLKDIVN [0:1:0:1] 3-0 bitcal_cpu_bus_clk(); //HCLK=100M PCLK=50M}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<<s))*100; //FCLK=400M FIN=12000000val = 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;elseHCLK = FCLK>>2;break;case 3:if(s&1)HCLK = FCLK/6;elseHCLK = FCLK/3;break;}if(p)PCLK = HCLK>>1;elsePCLK = HCLK;if(s&0x10)cpu_freq = HCLK;elsecpu_freq = FCLK;val = rUPLLCON;m = (val>>12)&0xff;p = (val>>4)&0x3f;s = val&3;UPLL = ((m+8)*FIN)/((p+2)*(1<<s));UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;}void beep_init(void) { rGPBCON &= ~(0x3<<0); rGPBCON |= (0x1<<0);}void beep_run(void) { rGPBDAT |= (0x1<<0); delay(5000); rGPBDAT &= (0x0<<0); delay(5000);}
0 0
- ARM ADC程序设计
- ARM裸机程序设计—ADC驱动程序设计
- ARM-STM32-RTC/ADC
- ARM裸机之ADC
- ARM学习之ADC实验
- arm下adc测试代码
- ARM学习--ARM程序设计
- ARM裸机——FS2410操作ADC
- ARM Linux S3C2440之ADC驱动实现
- 【ARM】ADC·FS2410数模转换
- arm-linux --ADC驱动(中断方式)
- ARM-Linux--ADC 驱动(查询方式)
- ARM Linux S3C2440之ADC驱动实现
- ARM串口实验,ADC实验,I2C实验
- ARM程序设计基础
- arm程序设计优化
- ARM程序设计优化
- ARM程序设计基础
- Fedora安装vmware-tools后系统无法正常启动的解决方法
- 插入排序
- wait waitpid WNOHANG 僵尸进程
- 重新认识c++(01),做个简单的复数Complex类
- MSSQL与MySQL语法区别
- ARM ADC程序设计
- 毕业论文参考文献规范格式
- 我们什么时候应该使用异常
- unity3d中C#委托的应用
- Android的shape和颜色选择器结合使用
- C++模版的特化
- Android即时通信系 之openfire安装
- Android中 int 和 String 互相转换的多种方法
- 机器学习笔记目录