STM32F030C8T6单片机与GY-61 ADXL335模块——角度传感器
发布日期:2021-07-26 18:44:25 浏览次数:49 分类:技术文章

本文共 4399 字,大约阅读时间需要 14 分钟。

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传感器角度计算 }

转载地址:https://blog.csdn.net/qq_41877422/article/details/85621972 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:IAR for ARM系列教程(二)_主窗口与工具栏的描述
下一篇:树莓派3B散热风扇控制脚本

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月11日 13时28分23秒