STM32F03 系列微处理器,STMicroelectronics
基于 STMicroelectronics ARM Cortex-M0 的 STM32F0 系列微控制器,包括入门级 ARM Cortex™ M0 32 位 RISC 内核。 STM32F030 超值型提供高速嵌入式存储器,具有各种增强型外设和 I/O。 有如 I2C、SPI 和 USART 等通信接口,以及 12 位 ADC、16 位计时器和一个高级控制 PWM 计时器。
ST 的 STM32F0 MCU 高级体系结构与 STM32 平台相结合,允许低功率应用设计,提供不同的封装类型。 具有嵌入式闪存和 SRAM 的 ARM Cortex™-M0 内核处理器与所有 ARM 工具和软件兼容。
STM32F030 ARM 处理器微控制器 (MCU) 适用于广泛的应用,包括应用控制和用户界面、手持设备、A/V 接收器、PC 外设、游戏平台、消费者电器用具、打印机、报警系统和 HVAC。
频率:48 MHz CPU
闪存:高达 64 K 字节
SRAM:高达 8 K 字节
电源:2.4 至 3.6 V
温度范围:- 40 至 +85 °C
### STM32F0 系列 32 位 ARM® Cortex®-M0 微控制器,STMicroelectronics
STM32 F0 系列 32 位闪存微控制器 (MCU) 基于 ARM Cortex™-M0 核心;为嵌入式应用特别开发的核心。 STMicroelectronics 的 STM32 ARM Cortex™ M 处理器得益于 Cortex-M0 体系结构增强功能,包括数字信号处理、实时性能、低电压和低功率。 ST ARM® STM32 F0 主流系列提供 32 位性能,且特别适用于小项目或平台决策,具有易于使用功能。
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) {
/*使能AHB时钟*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1|RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB,ENABLE); 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传感器角度计算 }