本帖最后由 wangku001wei 于 2012-9-24 09:33 编辑
先找了个相对比较简单的代码进行分析
首先看原理图 dPort_AcclControl 控制加速度传感器的 ST/MODE MODE ACC_ENABLE (注意先后顺序) 引脚 PdPort_LSB 对应P2口的P2[3:0]控制 dPort_MSB 对应P4口的P4[3:0]控制 注意 PdPort_LSB 的最高位和 dPort_MSB的最低位都是由同一个控制寄存器 LED_Control_Reg 第3位 LED_Control_Reg[3] 经反向后输出 是为了实现在水平位置时候将最中间的两个LED灯同时点亮 之所以反向是因为电路设计为低电平点亮LED,高电平熄灭LED 代码分析 void main() { int16 BubbleValue=0;
/* 使能全局中断 */ CYGlobalIntEnable;
/* 关闭所有的LED灯 on PORT2(pin 0-3) and PORT4 pin(0-3) */ LED_Control_Reg_Write(0);
/* 设置加速度传感器的控制引脚 注1*/ dPort_AcclControl_Write(ACCL_SET_CONTROL);
/* 开始AD转换 */ ADC_Start(); ADC_StartConvert();
while(1) { /* 等待AD转换完成 */ ADC_IsEndConversion(ADC_WAIT_FOR_RESULT);
/* 读取AD转换的结果*/ BubbleValue = ADC_GetResult16(); /* 对转换结果值进行处理 注2*/ BubbleValue = ((BubbleValue - G_MEAN_VALUE)>>GAIN);
/* 将处理结果值加3以便将LED的显示偏移到中间 */ BubbleValue+=3;
/* 对测量的加速度结果超过限制阈值的处理 */ if(BubbleValue < 0) { BubbleValue = 0; } if(BubbleValue > 6) { BubbleValue = 6; }
/* 控制LED灯 */ /* 第3位控制了引脚3 4 以便实现当板子水平是很中间的两个LED点亮 */ LED_Control_Reg_Write(1<<BubbleValue); } }
注1 Bubble.h 文件中宏定义了 #define ACCL_SET_CONTROL ((uint8) 0x06) 对应加速度传感器的引脚 ENABLE=1, MODE=1, ST/MODE=LOW (可查找传感器的使用说明)
注2 减去 3300 的意思在 Bubble.h 文件中有提到 加速度传感器水平位置时候测量到的电压约为1.65V,对应12位ADC转换结果的数字为3300,因此减去3300得到实际的倾斜程度 除以 GAIN(7)是由于采用7位的寄存器控制了8个LED灯,为了将不同程度的倾斜分成7段
关于ADC转换组件的使用 可参考帮助文档 在配置对话框框中
单击Data Sheet即可出现一个PDF
|