|
本文主要介绍使用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的结果中得到g如下:
结合上面的两个方程,以VREF和Vs为单位,我们得到,
将ADXL335加速度计与ARM7 LPC2148连接示例
为了连接加速度计,我们将使用LPC2148的ADC模块。由于我们的传感器有3个输出,我们将分别使用AD0.1、AD0.2、AD0.3来读取输出电压。获取ADC结果后,我们可以将其转换为每个轴的g。在下面的例子中,我们将使用UART0发送数据到终端。下面链接的示例项目还包含KEIL的重定向的printf(),它将输出重定向到UART0。
原理图
ADXL335加速度传感器与LPC2148连接的原理图
注意:某些模块可能板载电源稳压器(因此在接口插座中有多余的引脚),这使得与5V微控制器的连接更容易。请确保模块的电源连接正确,并在程序中正确更改电压的值以获得有效的结果。
main.c源代码 - /*Interfacing ADXL335 Accelerometer sensor with LPC2148 - Example Source Code for KEIL ARM.*/
- #include <lpc214x.h>
- #include <stdio.h> //visit http://www.ocfreaks.com/retarget-redirect-printf-scanf-uart-keil/
- #include "lib_funcs.h" //OCFreaks LPC214x Tutorials Library Header
- #define SEL_AD01 (1<<1) //Select AD0.1 Channel
- #define SEL_AD02 (1<<2) //Select AD0.2 Channel
- #define SEL_AD03 (1<<3) //Select AD0.3 Channel
- #define CLKDIV (15-1) //4Mhz ADC clock (ADC_CLOCK=PCLK/CLKDIV) where "CLKDIV-1" is actually used, in our case PCLK=60mhz
- #define BURST_MODE_OFF (0<<16) //1 for on and 0 for off
- #define PowerUP (1<<21)
- #define START_NOW ((0<<26)|(0<<25)|(1<<24)) //001 for starting the conversion immediately
- #define ADC_DONE (1UL<<31)
- #define VREF 3.3 //Reference Voltage at VREF pin
- #define VS 3.3 //Supply Voltage for ADXL335
- #define ZERO_G (VS/2) //Zero g bias
- int main(void)
- {
- initClocks(); //Set PCLK = CCLK = 60Mhz - used by: UART, Timer and ADC
- initUART0(); //Initialize UART0 for retargeted printf()
- initTimer0(); //Init Timer for delay functions
-
- PINSEL1 |= (1<<24) | (1<<26) | (1<<28); //select AD0.1/2/3 for P0.28/29/30.
- int adcX,adcY,adcZ;
- float resultVolts,Xg,Yg,Zg;
- unsigned long ADC0CR_Setup = (CLKDIV<<8) | BURST_MODE_OFF | PowerUP;
- printf("OCFreaks.com LPC214x ADXL335 Sensor Interfacing Tutorial\n");
-
- int skipFirst = 1;
-
- while(1)
- {
- AD0CR = ADC0CR_Setup | SEL_AD01 | START_NOW;//Start new Conversion on AD0.1
- while( (AD0DR1 & ADC_DONE) == 0 );
- adcX = (AD0DR1>>6) & 0x3FF; //get the 10bit ADC result
-
- AD0CR = ADC0CR_Setup | SEL_AD02 | START_NOW; //Start new Conversion on AD0.2
- while( (AD0DR2 & ADC_DONE) == 0 );
- adcY = (AD0DR2>>6) & 0x3FF; //get the 10bit ADC result
-
- AD0CR = ADC0CR_Setup | SEL_AD03 | START_NOW; //Start new Conversion on AD0.3
- while( (AD0DR3 & ADC_DONE) == 0 );
- adcZ = (AD0DR3>>6) & 0x3FF; //get the 10bit ADC result
-
- if(skipFirst) //Ignore first ADC readings.
- {
- skipFirst = 0;
- continue;
- }
-
- //Computing in 2 steps to keep things simple.
- resultVolts = ((float)adcX * VREF) / 1024; //ADC Result converted to millivolts
- Xg = (resultVolts - ZERO_G) / (VS*0.1);
-
- resultVolts = ((float)adcY * VREF) / 1024; //ADC Result converted to millivolts
- Yg = (resultVolts - ZERO_G) / (VS*0.1);
-
- resultVolts = ((float)adcZ * VREF) / 1024; //ADC Result converted to millivolts
- Zg = (resultVolts - ZERO_G) / (VS*0.1);
-
- printf("X=%0.2fg Y=%0.2fg Z=%0.2fg\n", Xg,Yg,Zg);
-
- delayMS(250); //4 Updates per second
- }
-
- //return 0; //This won't execute normally
- }
复制代码
截图
ADXL335加速度传感器与LPC2148连接的演示屏幕截图
参考链接
ADXL335数据手册:ADXL335 Datasheet GitHub上的整个Keil工程:ADXL335 Accelerometer Interfacing with LPC2148 |