一板网电子技术论坛

阿哲
发表于: 2017-12-23 21:38:04 | 显示全部楼层

本文主要介绍使用ARM7 LPC2148微控制器连接ADXL335加速度计的方法。 ADXL335是一款三轴加速度传感器,每个轴都有模拟输出。模拟量输出与正交轴上的每个加速度成正比。它的最小测量范围为±3g,其中g是地表重力加速度(9.8m / s2)。最常见的应用包括倾斜、运动和冲击感应。 ADXL335的电源电压范围为1.8V至3.6V。 ADXL335采用16引脚LFCSP_LQ封装。


输出电压

每个轴的输出电压与所使用的电源电压成正比(比例)。零g偏置输出也与电源电压成正比。对于任何给定的有效电源电压,零g输出电压通常为Vs / 2。


灵敏度

灵敏度也称为ADXL335传感器的比例因子,以“mV(或V)每g”即mV / g(或V / g)给出。对于给定的电源电压Vs,灵敏度通常为0.1xVs V / g或Vsx100 mV / g。因此,对于Vs = 3.3V,灵敏度通常为330mV / g或0.33V / g。在后面的例子中,我们将使用V / g作为灵敏度的单位。


将ADC结果转换为g

让我们从基本公式开始,将10位ADC结果转换为给定VREF的电压。传感器输出可以计算如下:

Adc volts.png

让我们也将所有电压的单位设定为伏特。我们从ADC的结果中得到g如下:

g.png

结合上面的两个方程,以VREF和Vs为单位,我们得到,

adc result.png


将ADXL335加速度计与ARM7 LPC2148连接示例

为了连接加速度计,我们将使用LPC2148的ADC模块。由于我们的传感器有3个输出,我们将分别使用AD0.1、AD0.2、AD0.3来读取输出电压。获取ADC结果后,我们可以将其转换为每个轴的g。在下面的例子中,我们将使用UART0发送数据到终端。下面链接的示例项目还包含KEIL的重定向的printf(),它将输出重定向到UART0。


原理图

ADXL335加速度传感器与LPC2148连接的原理图

adxl335_interfacing_lpc214x_schematic.png

注意:某些模块可能板载电源稳压器(因此在接口插座中有多余的引脚),这使得与5V微控制器的连接更容易。请确保模块的电源连接正确,并在程序中正确更改电压的值以获得有效的结果。

main.c源代码

  1. /*Interfacing ADXL335 Accelerometer sensor with LPC2148 - Example Source Code for KEIL ARM.*/

  2. #include <lpc214x.h>
  3. #include <stdio.h> //visit http://www.ocfreaks.com/retarget-redirect-printf-scanf-uart-keil/
  4. #include "lib_funcs.h" //OCFreaks LPC214x Tutorials Library Header

  5. #define SEL_AD01 (1<<1) //Select AD0.1 Channel
  6. #define SEL_AD02 (1<<2) //Select AD0.2 Channel
  7. #define SEL_AD03 (1<<3) //Select AD0.3 Channel
  8. #define CLKDIV   (15-1) //4Mhz ADC clock (ADC_CLOCK=PCLK/CLKDIV) where "CLKDIV-1" is actually used, in our case PCLK=60mhz  
  9. #define BURST_MODE_OFF (0<<16) //1 for on and 0 for off
  10. #define PowerUP   (1<<21)
  11. #define START_NOW ((0<<26)|(0<<25)|(1<<24)) //001 for starting the conversion immediately
  12. #define ADC_DONE  (1UL<<31)

  13. #define VREF 3.3 //Reference Voltage at VREF pin
  14. #define VS          3.3 //Supply Voltage for ADXL335
  15. #define ZERO_G (VS/2) //Zero g bias

  16. int main(void)
  17. {
  18.         initClocks(); //Set PCLK = CCLK = 60Mhz - used by: UART, Timer and ADC
  19.         initUART0();  //Initialize UART0 for retargeted printf()
  20.         initTimer0(); //Init Timer for delay functions
  21.         
  22.         PINSEL1 |= (1<<24) | (1<<26) | (1<<28); //select AD0.1/2/3 for P0.28/29/30.
  23.         int adcX,adcY,adcZ;
  24.         float resultVolts,Xg,Yg,Zg;
  25.         unsigned long ADC0CR_Setup = (CLKDIV<<8) | BURST_MODE_OFF | PowerUP;
  26.         printf("OCFreaks.com LPC214x ADXL335 Sensor Interfacing Tutorial\n");
  27.         
  28.         int skipFirst = 1;
  29.         
  30.         while(1)
  31.         {
  32.                 AD0CR = ADC0CR_Setup | SEL_AD01 | START_NOW;//Start new Conversion on AD0.1
  33.                 while( (AD0DR1 & ADC_DONE) == 0 );
  34.                 adcX = (AD0DR1>>6) & 0x3FF; //get the 10bit ADC result
  35.                
  36.                 AD0CR = ADC0CR_Setup | SEL_AD02 | START_NOW; //Start new Conversion on AD0.2
  37.                 while( (AD0DR2 & ADC_DONE) == 0 );
  38.                 adcY = (AD0DR2>>6) & 0x3FF; //get the 10bit ADC result
  39.                
  40.                 AD0CR = ADC0CR_Setup | SEL_AD03 | START_NOW; //Start new Conversion on AD0.3
  41.                 while( (AD0DR3 & ADC_DONE) == 0 );
  42.                 adcZ = (AD0DR3>>6) & 0x3FF; //get the 10bit ADC result
  43.                
  44.                 if(skipFirst) //Ignore first ADC readings.
  45.                 {
  46.                         skipFirst = 0;
  47.                         continue;
  48.                 }
  49.                
  50.                 //Computing in 2 steps to keep things simple.
  51.                 resultVolts = ((float)adcX * VREF) / 1024; //ADC Result converted to millivolts
  52.                 Xg = (resultVolts - ZERO_G) / (VS*0.1);
  53.                
  54.                 resultVolts = ((float)adcY * VREF) / 1024; //ADC Result converted to millivolts
  55.                 Yg = (resultVolts - ZERO_G) / (VS*0.1);
  56.                
  57.                 resultVolts = ((float)adcZ * VREF) / 1024; //ADC Result converted to millivolts
  58.                 Zg = (resultVolts - ZERO_G) / (VS*0.1);
  59.                
  60.                 printf("X=%0.2fg Y=%0.2fg Z=%0.2fg\n", Xg,Yg,Zg);
  61.                
  62.                 delayMS(250); //4 Updates per second
  63.         }
  64.         
  65.         //return 0; //This won't execute normally
  66. }
复制代码

截图

ADXL335加速度传感器与LPC2148连接的演示屏幕截图

adxl335_lpc214x_demo.png


参考链接

ADXL335数据手册:ADXL335 Datasheet

GitHub上的整个Keil工程:ADXL335 Accelerometer Interfacing with LPC2148

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 42 | 回复: 58



Archiver|手机版|小黑屋|

GMT+8, 2018-9-20 15:51 , Processed in 0.031250 second(s), 34 queries . Powered by Discuz! X3.4

YiBoard一板网 © 2015-2018 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表