STM32F030C8T6单片机与GY-61 ADXL335模块测角度
ADXL335 是一款小尺寸、薄型、低功耗、完整的三轴加速度计,提供经过信号调理的电压输出,能以最小±3 g 的满量程范围测量加速度。它可以测量倾斜检测应用中的静态重力加速度,以及运动、冲击或振动导致的动态加速度。用户使用 CX、CY和 CZ引脚上的电容 XOUT、YOUT和 ZOUT选择该加速度计的带宽。可以根据应用选择合适的带宽,X 轴和 Y 轴的带宽范围为 0.5 Hz 至 1600 Hz,Z 轴的带宽范围为0.5 Hz 至 550 Hz。
根据工程具体情况,我们使用STM32F030C8T6单片机连接模块进行角度的测量。
考虑到测量角度的机械运动部分是垂直90°张开的,我们仅仅使用芯片的模块的4个引脚VCC、Y-out、Z-out、GND。
运用F0单片机的12位ADC转换单元。
F0单片机时钟配置:
void RCC_Configuration(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1|RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB,ENABLE);//使能AHB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//使能APB2时钟
}
ADC引脚配置(使用了两块模块4个ADC通道):
void ADC_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;//GY61角度传感器YZ引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //模拟模式
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //浮空无上下拉
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;//GY61角度传感器YZ引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //模拟模式
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //浮空无上下拉
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
MDA配置:
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel1); //DMA1通道1配置
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&RegularConvertedAdcValue;//内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为数据传输来源
DMA_InitStructure.DMA_BufferSize = 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器不变
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //设定DMA通道的优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);//DMA1_Channel1使能
}
ADC配置:
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_DeInit(ADC1);
ADC_StructInit(&ADC_InitStructure); //初始化ADC结构体
ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b; //精度为12位
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE; //设置连续的装换工作模式
ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //数据为右对齐
ADC_InitStructure.ADC_ScanDirection=ADC_ScanDirection_Upward;//ADC的扫描方向Upward
ADC_Init(ADC1,&ADC_InitStructure);
ADC_ChannelConfig(ADC1,ADC_Channel_4,ADC_SampleTime_239_5Cycles);//转换ADC1通道4与239.5周期作为采样时间
ADC_ChannelConfig(ADC1,ADC_Channel_5,ADC_SampleTime_239_5Cycles);//转换ADC1通道5与239.5周期作为采样时间
ADC_ChannelConfig(ADC1,ADC_Channel_8,ADC_SampleTime_239_5Cycles);//转换ADC1通道8与239.5周期作为采样时间
ADC_ChannelConfig(ADC1,ADC_Channel_9,ADC_SampleTime_239_5Cycles);//转换ADC1通道9与239.5周期作为采样时间
ADC_GetCalibrationFactor(ADC1); //校准ADC1
ADC_DMARequestModeConfig(ADC1,ADC_DMAMode_Circular);//ADC_DMA请求模式配置
ADC_DMACmd(ADC1,ENABLE); //使能ADC的DMA传输
ADC_Cmd(ADC1,ENABLE); //使能ADC
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_ADEN)); //等待ADEN标志位
ADC_StartOfConversion(ADC1); //ADC1常规软件启动Conv
}
ADC检查:
uint32_t ADC_Check(void)
{
uint8_t i;
for(i=0;i<8;i++)
{
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
ResultVolt +=(uint32_t)ADC_GetConversionValue(ADC1);
}
ResultVolt=ResultVolt >>3;
ResultVolt=(ResultVolt*3300)>>12;
return ResultVolt;
}
配置初始化:
void Init_ALL(void)
{
RCC_Configuration();
ADC_GPIO_Configuration();
DMA_Config();
ADC_Configuration();
}
计算左右模块变化的角度值:
void datacollect_process(void)
{
/*获得各个通道ADC的值*/
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待传输完成否则第一位数据容易丢失
Y=RegularConvertedAdcValue[0];
Z=RegularConvertedAdcValue[1];
y=RegularConvertedAdcValue[2];
z=RegularConvertedAdcValue[3];
Y-=0X0800;//(1.65*4096)/3.3=2048
Z-=0X0800;//(1.65*4096)/3.3=2048
y-=0X0800;//(1.65*4096)/3.3=2048
z-=0X0800;//(1.65*4096)/3.3=2048
T=Y;
K=Z;
t=y;
k=z;
left_pitch=(float)((atan2(K,T)*180)/3.14159265);//GY61传感器角度计算
right_pitch=(float)((atan2(k,t)*180)/3.14159265);//GY61传感器角度计算
}