stm32平衡小车控制部分代码解析
- 格式:docx
- 大小:88.89 KB
- 文档页数:2
摘要对于小车的控制,即是对于电机的控制。
电机作为机电能量转换装置,其应用范围已遍及国民经济的各个领域以及人们的日常生活中,所以怎么更好的对电机进行控制就显得尤为重要。
基于Cortex- M3内核的STM32F10x系列芯片是新型的32位嵌入式微处理器,其性能优良,移植性好,提高了对直流电机的控制效率,并对控制系统进行模块化设计,有利于智能小车的功能扩展和升级。
本论文主要分析了基于STM32F103的小车控制系统的设计过程。
此系统主要包括STM32F103控制器、液晶显示电路、键盘控制电路、电机驱动电路、红外探测电路、触角检测电路等。
以STM32F103主控芯片及其外围扩展电路实现系统整体功能;小车基本运动模式的选择及速度调节用按键开关式的键盘输入实现;同时液晶模块实时显示小车运动参数;用红外探测电路实现小车循迹功能;用触角传感检测模块实现小车简单避障功能。
在硬件设计的基础上提出了实现电机控制功能、LCD显示功能及小车简单循迹和避障功能的软件设计方案,并在STM32集成开发环境IAR EWARM 5.3下编写了控制程序。
关键词:PWM,STM32F103,电机,传感器目录前言 (1)第1章绪论 (2)1.1 STM32芯片介绍 (2)1.1.1STM32处理器的分类 (2)1.1.2 STM32处理器的内部结构及特点 (3)1.1.3 TIMx定时器介绍 (4)1.2 小车及其驱动器介绍 (6)1.2.1 小车结构及功能简介 (6)1.2.2 电机驱动电路简介 (7)第2章小车控制系统硬件设计 (9)2.1 系统功能实现及需求分析 (9)2.2 主要电路设计 (10)2.2.1 STM32F103及外围电路设计 (10)2.2.2 电源电路设计 (12)2.2.3 电机驱动电路设计 (12)2.2.4 液晶显示电路设计 (13)2.2.5 键盘扩展电路设计 (14)2.2.6 触角探测电路设计 (15)2.2.7 红外探测电路设计 (15)第3章小车控制系统软件设计 (17)3.1 IAR开发环境介绍 (17)3.2 程序设计思路及部分模块程序 (18)3.2.1 程序设计思路 (18)3.2.2 按键子程序 (19)3.2.3 循迹子程序 (21)3.2.4 自由行走子程序 (22)3.2.5 LCD显示子程序 (23)第4章结论 (24)致谢 (25)参考文献 (26)附录 (27)前言随着计算机、微电子、信息技术的快速发展,智能化技术的开发速度越来越快,程度越来越高,广泛应用于海洋开发、宇宙探测、工农业生产、军事、社会服务、娱乐等各个领域。
基于STM32的两轮自平衡小车控制系统设计本文主要对两轮自平衡小车的姿态检测算法、PID控制算法两方面进行展开研究。
用加速度传感器和陀螺仪传感器融合而成的姿态传感系统与互补滤波器组合得到自平衡小车准确而稳定的姿态信息,然后PID调节器则利用这些姿态信息输出电机控制信号,控制电机的转动,从而使小车得以平衡。
标签:STM32;自平衡小车;控制系统;控制算法1 研究意义应用意义:两轮平衡车是一种新型的交通工具,它与电动自行车和摩托车车轮前后排列方式不同,而是采用两轮并排固定的方式,就像一种两轮平行的机器人一样。
两轮自平衡控制系统是一种两轮左右平行布置的,像传统的倒立摆一样,本身是一个自然不稳定体,必须施加强有力的控制手段才能使之稳定。
两轮平衡车具有运动灵活、智能控制、操作简单、节省能源、绿色环保、转弯半径为0等优点。
因此它适用于在狭小空间内运行,能够在大型购物中心、国际性会议或展览场所、体育场馆、办公大楼、大型公园及广场、生态旅游风景区、城市中的生活住宅小区等各种室内或室外场合中作为人们的中、短距离代步工具。
具有很大的市场和应用前景。
理论研究意义:车体状态运算主要是将各传感器测量的数据加以融合得出车体倾斜角度值、倾斜角速度值以及行车速度等。
平衡控制运算根据车体状态数据,计算保持平衡需要的行车速度和加速度,或者转弯所需要的左右电机速度变化值,向电机控制驱动模块发送控制指令。
运算模块相当于两轮自平衡电动车的大脑,它主要负责的工作是:控制电机的起停,向控制模块发出加速、减速、电机正反转和制动等速度控制信号,接收电机Hall信号进行车速度计算,并通过RS 一232串口向PC发送车速数据以供存储和分析。
另外,还负责接收车体平衡姿态数据,进行自平衡运算。
现有的自平衡车结构种类繁多,但车体都归根于由三层的基本结构组成,从上到下依次是电池层、主控层、电机驱动层。
电池层用于放置给整个系统供电的6V锂电池,主控层由主控芯片系统和传感器模块组成,电机驱动层接受单片机信号,并控制电机。
基于STM32的自平衡车系统的设计与实现学院:专业:姓名:指导老师:计算机学院计算机科学与技术蔡瑞峰学号:职称:160201102848 宋琛讲师中国·珠海二○二○年五月诚信承诺书本人郑重承诺:本人承诺呈交的毕业设计《基于STM32的自平衡车系统的设计与实现》是在指导教师的指导下,独立开展研究取得的成果,文中引用他人的观点和材料,均在文后按顺序列出其参考文献,设计使用的数据真实可靠。
本人签名:日期: 2020 年 5 月 1 日基于STM32的自平衡车系统的设计与实现摘要随着新时代技术的不断革新,人们对日常使用的机器人系统有了更多的需求,因此衍生出多种不同类型、形态各异的机器人,有日常生活中的扫地机器人、汽车组装厂的机械臂,酒店中的智能服务机器人等等。
而自平衡车系统则是其中一个很具代表性的机器人科技产物。
平衡车相比其他传统代步工具而言,集轻便、无污染、速度适中、价格成本低等优点于一身,使人们的日常生活变得更加便利,成为了人们出行新的性价比极高的代步工具。
自平衡车系统是基于STM 32设计实现,通过以STM 32作为核心控制板,集成陀螺仪模块、驱动电机模块、超声波模块、电机模块等组成整个平衡车结构。
为实现小车平衡,使其实现站立平衡行走,通过运用平衡原理,测量小车倾角和角速度控制小车加速度即加入PID算法,调节参数,实现小车平衡行走。
PID算法通过对小车角度进行测量(PD算法)是小车在直立控制下保持平衡,再通过对小车测速(PI算法),使小车通过改变倾角来控制速度,进而对自身姿势进行调整。
关键词:机器人;自平衡车系统;性价比;模块;PID算法Design and implementation of self-balancing vehicle system based onSTM32AbstractWith the innovation of the new era of technology, people for daily use of robotic systems have more demand, so a variety of different types of forms are derived from the robot, a sweeping robot car assembly plant in everyday life of mechanical arm, the intelligent service robot, and so on and the balance in the hotel car system is one of the very representative of the robot technology balanced car, compared with other traditional transport sets of portable pollution-free speed moderate price low cost advantages in one, make People's Daily life become more convenient, has become a new travel the transport of high performance-price ratio The self-balancing vehicle system is designed and realized based on STM 32. By STM 32 as core control board, integrating gyroscope module driven motor module ultrasonic module of the whole car balance structure to achieve the car balance, make its standing balance walking, by using the principle of balance, measuring Angle and angular velocity control car the car acceleration to join the PID algorithm, namely to adjust parameters, to achieve the car balance walking PID algorithm based on Angle measurement algorithm (PD) is the car under control in the vertical balance, again through the car speed (PI algorithm), make the car to control the speed by changing the Angle, and then adjust their own position. Keywords: Robot; The self-balancing vehicle system;Cost performance; The module; PID algorithm目录1 绪论 (1)1.1课题研究现状 (1)1.2课题研究意义 (1)1.3课题研究内容与目标 (2)2系统总体设计 (2)2.1系统总体方案设计 (2)2.2系统平衡原理设计 (3)3系统硬件设计 (3)3.1单片机 (3)3.2电源模块 (4)3.3陀螺仪模块 (4)3.4驱动电机模块 (5)3.5电机模块 (7)4系统软件设计 (7)4.1程序初始化 (7)4.2平衡算法 (7)4.2.1角度(PD算法) (8)4.2.2速度(PI算法) (8)4.2.3串级PID (9)5系统测试 (10)5.1系统测试概述 (10)5.2系统测试内容 (10)5.3系统测试结果 (12)6 总结 (12)参考文献 (14)谢辞 (15)附录 (16)1 绪论1.1 课题研究现状随着近几年科技行业的迅速发展,因时代需要,各种平衡小车(Balance of the car)在此背景下应运而生,平衡小车作为一种新兴行业里的前沿技术之一——机器人技术,不但顺应时代潮流的发展,还符合市场需求。
#include "stm32f10x_lib.h"#include <math.h>#define Kp 18 // 比例常数Proportional Const #define Ki 0 // 积分常数Integral Const#define Kd 0.5 // 微分常数Derivative Constvoid RCC_Configuration(void);void GPIO_Configuration(void);void ADC_Configuration(void);void DMA_Configuration(void);void SysTick_Configuration(void);void TIM1_Configuration(void);void FORWARD_Init(void);void BACKWARD_Init(void);void STOP_Init(void);void PID_algorithm(double filer_angle);void Kalman_Filter(float ,float);void active(void);void Delay_ms(u32 nTime);void ADC_result(void);u16 AD_Value[16];u32 TimingDelay;u16 CCR1_Val =500;float gyro;float acceler;s16 Gyro;s16 AccleX;int main(void){RCC_Configuration();GPIO_Configuration();DMA_Configuration();ADC_Configuration();SysTick_Configuration();TIM1_Configuration();while (1){Delay_ms(10);ADC_result();active();}}void RCC_Configuration(void){ErrorStatus HSEStartUpStatus;RCC_DeInit(); //RCC复位RCC_HSEConfig(RCC_HSE_ON); // 开启HSE振荡器HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待HSE完成启动if(HSEStartUpStatus==SUCCESS){RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK2Config(RCC_HCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2); //配置AHB,APB2,APB1的时钟FLASH_SetLatency(FLASH_Latency_2);FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能预取RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK=72Mhz RCC_PLLCmd(ENABLE); //使能PLLwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){} //PLL是否就绪RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置PLL为系统时钟源while(RCC_GetSYSCLKSource()!=0x08){}}RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL , ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);}void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;//配置ADCGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOA, &GPIO_InitStructure);//配置PWM输出引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOC, &GPIO_InitStructure);//电机方向控制端口GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD, &GPIO_InitStructure);}void DMA_Configuration(void){DMA_InitTypeDef DMA_InitStructure;/* DMA channel1 configuration ----------------------------------------------*/DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4001244C;DMA_InitStructure.DMA_MemoryBaseAddr = (u32)AD_Value;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 16;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* Enable DMA channel1 */DMA_Cmd(DMA1_Channel1, ENABLE);}void ADC_Configuration(void){ADC_InitTypeDef ADC_InitStructure;/* ADC1 configuration ------------------------------------------------------*/ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = ENABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 2;ADC_Init(ADC1, &ADC_InitStructure);ADC_TempSensorVrefintCmd(ENABLE);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_71Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_71Cycles5); ADC_DMACmd(ADC1, ENABLE);ADC_Cmd(ADC1, ENABLE);ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));ADC_SoftwareStartConvCmd(ADC1, ENABLE);}void TIM1_Configuration(void){TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;TIM_OCInitTypeDef TIM_OCInitStructure;//TIM1基本计数器设置(设置PWM频率)//频率=TIM1_CLK/(ARR+1)TIM_BaseInitStructure.TIM_Period =1000;TIM_BaseInitStructure.TIM_Prescaler =71;TIM_BaseInitStructure.TIM_ClockDivision = 0;TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_BaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM1, &TIM_BaseInitStructure);//启用ARR的影子寄存器(直到产生更新事件才更改设置)TIM_ARRPreloadConfig(TIM1, ENABLE);//TIM1_OC1模块设置(设置1通道占空比)TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;TIM_OCInitStructure.TIM_Pulse =CCR1_Val;TIM_OC3Init(TIM1, &TIM_OCInitStructure);//启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);//TIM2_OC2模块设置(设置2通道占空比)TIM_OCInitStructure.TIM_Pulse =CCR1_Val;TIM_OC4Init(TIM1, &TIM_OCInitStructure);//启用CCR2寄存器的影子寄存器(直到产生更新事件才更改设置)TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);//TIM1开启TIM_Cmd(TIM1, ENABLE);//TIM1_OC通道输出PWM(一定要加)TIM_CtrlPWMOutputs(TIM1, ENABLE);}void SysTick_Configuration(void){SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0);SysTick_SetReload(72000);SysTick_ITConfig(ENABLE);}void Delay_ms(u32 nTime){SysTick_CounterCmd(SysTick_Counter_Enable);TimingDelay = nTime;while(TimingDelay != 0); //等待计数至0SysTick_CounterCmd(SysTick_Counter_Disable);SysTick_CounterCmd(SysTick_Counter_Clear);}void ADC_result(void){unsigned int result[2]={0,0};unsigned char i;for(i=0;i<15;i=i+2)result[0]+=*(AD_Value+i);for(i=1;i<16;i=i+2)result[1]+=*(AD_Value+i);AccleX=(result[0]>>3)-2098; //AccleX=(result[0]*3.3/(4096*4));Gyro=(result[1]>>3)-1510; //Gyro=(result[1]*3.3/(4096*4));acceler=(float)(AccleX/409.6);if(acceler>1)acceler=1;else if(acceler<-1)acceler=-1;acceler=asin(acceler)*57.296; //弧度转换180/3.14gyro=Gyro*0.0644; //3.3/(4096*25mv)Kalman_Filter(acceler,gyro);}//kalman filterstatic float angle, angle_dot; //外部需要引用的变量static float Q_angle=0.001, Q_gyro=0.003, R_angle=0.5, dt=0.01; //注意:dt的取值为kalman 滤波器采样时间;static float P[2][2] = { { 1, 0 },{ 0, 1 }};static float Pdot[4] ={0,0,0,0};static char C_0 = 1;static float q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;//-------------------------------------------------------void Kalman_Filter(float angle_m,float gyro_m) //gyro_m:gyro_measure{angle+=(gyro_m-q_bias) * dt;//先验估计Pdot[0]=Q_angle - P[0][1] - P[1][0];// Pk-' 先验估计误差协方差的微分Pdot[1]=- P[1][1];Pdot[2]=- P[1][1];Pdot[3]=Q_gyro;P[0][0] += Pdot[0] * dt;// Pk- 先验估计误差协方差微分的积分= 先验估计误差协方差P[0][1] += Pdot[1] * dt;P[1][0] += Pdot[2] * dt;P[1][1] += Pdot[3] * dt;angle_err = angle_m - angle;//zk-先验估计PCt_0 = C_0 * P[0][0];PCt_1 = C_0 * P[1][0];E = R_angle + C_0 * PCt_0;K_0 = PCt_0 / E;//KkK_1 = PCt_1 / E;t_0 = PCt_0;t_1 = C_0 * P[0][1];P[0][0] -= K_0 * t_0;//后验估计误差协方差P[0][1] -= K_0 * t_1;P[1][0] -= K_1 * t_0;P[1][1] -= K_1 * t_1;angle += K_0 * angle_err;//后验估计q_bias += K_1 * angle_err;//后验估计angle_dot = gyro_m-q_bias;//输出值(后验估计)的微分= 角速度}//====================电机方向控制===================== void FORWARD_Init(void) {GPIO_SetBits(GPIOD, GPIO_Pin_0); //亮GPIO_ResetBits(GPIOD, GPIO_Pin_1); //灭GPIO_SetBits(GPIOD, GPIO_Pin_14); //亮GPIO_ResetBits(GPIOD, GPIO_Pin_15); //D2灭}void BACKWARD_Init(void){GPIO_ResetBits(GPIOD, GPIO_Pin_0); //亮GPIO_SetBits(GPIOD, GPIO_Pin_1); //灭GPIO_ResetBits(GPIOD, GPIO_Pin_14); //亮GPIO_SetBits(GPIOD, GPIO_Pin_15); //D2灭}void STOP_Init(void){GPIO_ResetBits(GPIOD, GPIO_Pin_0); //亮GPIO_ResetBits(GPIOD, GPIO_Pin_1); //灭GPIO_ResetBits(GPIOD, GPIO_Pin_14); //亮GPIO_ResetBits(GPIOD, GPIO_Pin_15); //D2灭}//======================================================//===================电机驱动=========================== void active(void) {TIM_OCInitTypeDef TIM_OCInitStructure;s16 pwm;if(angle>2) FORWARD_Init();if(angle<-2) BACKWARD_Init();if((angle<=2)&&(angle>=-2)) STOP_Init();pwm=angle*Kp+angle_dot*Kd;if(pwm<0) CCR1_Val=0-pwm;else CCR1_Val=pwm;CCR1_Val+=30; //最终输出if(angle>20||angle<-20) CCR1_Val=999;if(CCR1_Val>999) CCR1_Val=999;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;TIM_OCInitStructure.TIM_Pulse =CCR1_Val;TIM_OC3Init(TIM1, &TIM_OCInitStructure);TIM_OCInitStructure.TIM_Pulse =CCR1_Val;TIM_OC4Init(TIM1, &TIM_OCInitStructure);}//======================================================。
stm32的自平衡小车设计STM32自平衡小车设计是一个将许多功能组合在一起的有趣项目。
它不仅需要控制技术,还需要实时处理图像,以便识别障碍物。
自平衡小车使用STM32单片机来控制,这是一款微控制器,具有16位或32位内外存储器、高速Cortex-M4 MCU和多种集成的外设。
STM32单片机的内部集成了多种传感器,如角度传感器、编码器、温度传感器和光学传感器等,可以测量周围环境的变化并作出相应的反应,使小车保持平衡。
它还有两个电机驱动的轮子,电机可以控制小车的前进和后退,而角度传感器可以测量小车的角度,从而判断小车是否已完成平衡,从而调整小车的动作来使其保持平衡。
此外,STM32开发板还具有I2C通信接口,可让开发者使用I2C总线通信,与外部设备交换数据,如摄像头等。
摄像头的主要功能是对周围环境的跟踪,可以帮助小车避开障碍物,准确地定位和预测小车的行驶路径。
为了使小车实现自主运动,还需要一块用于实现运动控制的FPGA芯片,可以用于处理传感器发来的控制信号,根据预设的算法以及图像处理结果,向STM32发出运动控制指令,使小车实现自动行驶。
FPGA芯片可以提供更高的运算速度,以满足实时性要求,这是实现智能小车自动行驶的重要前提。
最后,将所有的控制程序和程序连接在一起,并与SOC系统进行连接,形成一个完整的系统,以实现智能小车的自动行驶。
当实现了自动行驶的功能之后,可以根据需要添加更多的功能,比如跟踪、识别物体、定位、自动充电等,这些功能可以帮助小车自主行驶时更加“聪明”,也可以使小车更好地适应环境调整,实现自主运动。
总而言之,设计一台智能自平衡小车,其基本设计思路是:首先使用STM32单片机作为主控核心,集成传感器用于控制小车保持平衡,而两个电机驱动的轮子可以控制小车前后行驶;其次,使用I2C总线通信的图像传感器可以测量小车的方向,以避开前方的障碍物;最后,使用FPGA芯片实现小车的运动控制,实现智能小车的自动行驶。
毕业设计 STM32平衡车设计与实现1 简介Hi,大家好,学长今天向大家介绍一个单片机项目,大家可用于课程设计或毕业设计基于STM32的平衡车设计与实现1 课题描述课题的研究主要是为了设计出可以在小范围内活动的轻巧灵活的绿色代步工具,并且在自平衡的功能上加上一些新功能,如自跟随功能和遥控功能,这样平衡车不仅可以当作交通工具来使用还可以作为人们的助手,如可以制造出平衡车形式的拉杆箱、平衡车形式的超市购物车等。
平衡车技术起源于国外被叫作摄位车(Segway),在国内有被叫做平衡车、思维车、体感车,平衡车易于放置,便于携带。
公共场所、汽车、火车上都可以随意携带,平衡车不需要专用的场地,可以在马路、公园、林间小路甚至室内都可以骑行,所以它相比传统的四轮车是有很大的优势的。
两轮平衡车和单轮平衡车都可以在小范围内移动,不像传统的四轮车在小范围内很难转弯。
随着电子技术的不断发展,人们对行走功能的需求越来越高,平衡车应运而生。
电动平衡车的小巧轻便也给人们带来了很多便利。
同时,电动平衡车的电力驱动赋予了它绿色交通的使命,它的广泛普及对文明城市的建设和人居环境的改善具有重要意义。
电动平衡车为人们节省了大量的油费和时间。
与其他交通工具相比,它还具有价格优势,这使得大多数人都负担得起,维护起来也相对简单。
在平衡车上增加一些传感器,可以让人更好的控制它,同时还具有操控、墙障等功能。
比如增加自走功能,可以避免人们需要用手携带的缺点。
市面上常见的平衡车2 课题设计内容这个项目的核心是平衡车的控制系统,在平衡车稳定平衡的基础上对自跟随和无线遥控进行研究,并且计划使用 STM32 作为主处理器进行开发制作,由对倒立摆控制系统的分析进而分析平衡车的控制理论,其中包括直立行驶和转弯,还有自跟随的控制理论分析。
该项目的重点首先是要对 STM32 单片机的各个硬件系统有熟练使用的能力,这样才能对各模块进行正确的驱动设计。
其中,需要对 MPU6050 原始数据进行滤波处理,所以要通过对滤波算法的分析对 MPU6050 中的陀螺仪和加速度数据进行融合,使滤波后的结果可以满足设计要求。
平衡⼩车调试指南(直⽴环速度环)平衡⼩车调试指南接下来将和⼤家⼀起以⼯程的思想去完成⼀个平衡⼩车的调试,包括平衡⼩车的直⽴环、速度环、转向环,⼀般我们是先调试直⽴环,再调试速度环,最好调试转向环。
另外需要说明的是,因为我们使⽤的电机性能⾮常好,对PID参数不敏感,也就是说每个参数的取值范围都很⼴,这将对我们接下来的调试有很⼤的帮助。
1.1平衡⼩车直⽴控制调试平衡⼩车直⽴环使⽤PD(⽐例微分)控制器,其实⼀般的控制系统单纯的P控制或者PI控制就可以了,但是那些对⼲扰要做出迅速响应的控制过程需要D (微分)控制。
下⾯是直⽴PD控制的代码:int balance(float Angle,float Gyro){float Bias,kp=300,kd=1;int balance;Bias=Angle-0;//计算直⽴偏差balance=kp*Bias+Gyro*kd;//计算直⽴PWMreturn balance;//返回直⽴PWM}⼊⼝参数是平衡⼩车倾⾓和Y轴陀螺仪(这个取决MPU6050的安装),我们的⼩车前进⽅向是MPU6050的X轴的正⽅向,电机轴与Y轴平⾏。
前⾯两⾏是相关变量的定义,第三⾏是计算⾓度偏差,第四⾏通过PD控制器计算直⽴PWM,最后⼀⾏是返回。
调试过程包括确定平衡⼩车的机械中值、确定kp值的极性(也就是正负号)和⼤⼩、kd值的极性和⼤⼩等步骤。
在调试直⽴环的时候,我们要屏蔽速度环和转向环,如下图所⽰:1.1.1确定平衡⼩车的机械中值把平衡⼩车放在地⾯上,绕电机轴旋转平衡⼩车,记录能让⼩车接近平衡的⾓度,⼀般都在0°附近的。
我们调试的⼩车正好是0度,所以就是Bias=Angle-0;1.1.2确定kp值的极性(令kd=0)⾸先我们估计kp的取值范围。
我们的PWM设置的是7200代表占空⽐100%,假如我们设定kp值为720,那么平衡⼩车在±10°的时候就会满转。
买了这个车子好久了,拿到代码,一头雾水。
所谓的什么用户手册真的是,扯。
没考虑到初学者的感受。
但,问题总要解决,所以用这篇文章来分析一下平衡小车之家出的这个车子吧。
尽管有很多的库函数和宏,其实有很多都是厂商提供的,怎么实现的,大多每个代码段都提供了comment,英文好的话,理解应该不存在问题。
而我们做开发,首要关心的并不是每个模块如何实现,而是应该有几个模块,这些模块是怎么工作的,一个平衡小车能够安稳地在平面上静止与运动,都是通过晶振可以提供一定频率的中断,每一段时间都触发执行了中断服务程序,在此程序中可以获得此刻的欧拉角、温度以及对于平衡小车编码器的数据信息,并且通过PID控制来对小车的步进电机进行控制。
控制部分主要由MPU6050的INT引脚触发5ms定时中断,这个中断是由EXTI控制(具体如何配置要参考MPU6050的INT引脚的特性)。
本车的INT引脚挂载到PA12上,那么他相应的中断服务函数就应该是EXTI15_10_IRQHandler。
接下来我们来分析一下它是如何来控制小车的。
Begining~
基本的平衡控制。
1、 读取编码器的值。
--------------------Encoder_Left=Read_Encoder(2);
Encoder_Right=Read_Encoder(4); 2、 获取欧拉角,即俯仰角,偏航角和横滚角。
------------------Get_Angle(Way_Angle);
3、 平衡、速度PID 控制。
Balance_Pwm =balance(Angle_Balance,Gyro_Balance); Velocity_Pwm=velocity(Encoder_Left,Encoder_Right);
4、 赋值给PWM 寄存器。
Moto1=Balance_Pwm-Velocity_Pwm-Turn_Pwm;
Moto2=Balance_Pwm-Velocity_Pwm+Turn_Pwm;
Set_Pwm(Moto1,Moto2);
平衡+移动控制
刨去超声波,led 灯,按键的读取,新增加了转向环的控制。
Turn_Pwm=turn(Encoder_Left,Encoder_Right,Gyro_Turn);
再剩下的就是对于小车拿起放下的电机控制了。
PID (比例(proportion )、积分(integral )、微分(derivative ))控制器
Pulse Width Modulation 脉冲宽度调制,相应载荷的变化来调制晶体管基极或MOS 管栅极的偏置。