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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月11日 13时28分23秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
python 数据科学 - 【分类模型】 ☞ 决策树
2019-04-27
python - zip、numpy.c 函数
2019-04-27
python 数据科学 - 【分类模型】 ☞ 逻辑回归
2019-04-27
python 数据科学 - 【分类模型】 ☞ 稳健滴 SVM 支持向量机
2019-04-27
python - selenium 处理 alert
2019-04-27
Java - Set、List、Map
2019-04-27
Java - OnlyLady Spider(HttpClient 4.5 )
2019-04-27
Math - 高斯分布(正态分布)
2019-04-27
android学习笔记----简易音乐播放器原理
2019-04-27
Unity编辑器扩展——标签属性Attribute
2019-04-27
Unity中实现拖拽操作
2019-04-27
Unity中的UGUI事件系统
2019-04-27
C#中的常量
2019-04-27
C#中的静态变量与非静态变量
2019-04-27
C#中的ref、out、params关键字
2019-04-27
C#中的多态性
2019-04-27
C#中的命名空间
2019-04-27
设计模式——状态模式
2019-04-27
设计模式——工厂模式
2019-04-27