毕设仿真分享 STM32单片机+MPU6050传感器平衡车

一、简介

此系统主要由STM32、MPU6050传感器模块组成的平衡车。

二、原理图

三、部分代码



    /*
     * 硬件连接:------------------------
     *          | PA9  - USART1(Tx)      |
     *          | PA10 - USART1(Rx)      |
     *           ------------------------
     * 库版本  :ST3.5.0
    
    **********************************************************************************/	
    #include "usart1.h"
    #include "misc.h"
    #include 
    /*
     * 函数名:USART1_Config
     * 描述  :USART1 GPIO 配置,工作模式配置
     * 输入  :无
     * 输出  : 无
     * 调用  :外部调用
     */
    void USART1_Config(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	
    	/* config USART1 clock */
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
    	
    	/* USART1 GPIO config */
    	/* Configure USART1 Tx (PA.09) as alternate function push-pull */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO;_InitStructure);    
    	/* Configure USART1 Rx (PA.10) as input floating */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    	GPIO_Init(GPIOA, &GPIO;_InitStructure);
    	
    	/* USART1 mode config */
    	USART_InitStructure.USART_BaudRate = 115200;
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;
    	USART_InitStructure.USART_Parity = USART_Parity_No ;
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    	USART_Init(USART1, &USART;_InitStructure);
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    	
    	USART_Cmd(USART1, ENABLE);
    }


    void NVIC_Configuration(void)
    {
    	NVIC_InitTypeDef NVIC_InitStructure; 
    	/* Configure the NVIC Preemption Priority Bits */  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    	
    	/* Enable the USARTy Interrupt */
    	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;	 
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC;_InitStructure);
    }
    
    /*发送字符*/
    int fputc(int ch, FILE *f)
    {
    	/* 将Printf内容发往串口 */
    	USART_SendData(USART1, (unsigned char) ch);
    	while (!(USART1->SR & USART_FLAG_TXE));
    	
    	return (ch);
    }


    /*
     * 函数名:itoa
     * 描述  :将整形数据转换成字符串
     * 输入  :-radix =10 表示10进制,其他结果为0
     *         -value 要转换的整形数
     *         -buf 转换后的字符串
     *         -radix = 10
     * 输出  :无
     * 返回  :无
     * 调用  :被USART1_printf()调用
     */
    static char *itoa(int value, char *string, int radix)
    {
    	int     i, d;
    	int     flag = 0;
    	char    *ptr = string;
    	
    	/* This implementation only works for decimal numbers. */
    	if (radix != 10)
    	{
    	    *ptr = 0;
    	    return string;
    	}
    	
    	if (!value)
    	{
    	    *ptr++ = 0x30;
    	    *ptr = 0;
    	    return string;
    	}
    	
    	/* if this is a negative value insert the minus sign. */
    	if (value < 0)
    	{
    	    *ptr++ = '-';
    	
    	    /* Make the value positive. */
    	    value *= -1;
    	}
    	
    	for (i = 10000; i > 0; i /= 10)
    	{
    	    d = value / i;
    	
    	    if (d || flag)
    	    {
    	        *ptr++ = (char)(d + 0x30);
    	        value -= (d * i);
    	        flag = 1;
    	    }
    	}
    	
    	/* Null terminate the string. */
    	*ptr = 0;
    	
    	return string;
    
    } /* NCL_Itoa */
    
    /*
     * 函数名:USART1_printf
     * 描述  :格式化输出,类似于C库中的printf,但这里没有用到C库
     * 输入  :-USARTx 串口通道,这里只用到了串口1,即USART1
     *		     -Data   要发送到串口的内容的指针
     *			   -...    其他参数
     * 输出  :无
     * 返回  :无 
     * 调用  :外部调用
     *         典型应用USART1_printf( USART1, "\r\n this is a demo \r\n" );
     *            		 USART1_printf( USART1, "\r\n %d \r\n", i );
     *            		 USART1_printf( USART1, "\r\n %s \r\n", j );
     */
    void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
    {
    	const char *s;
    	int d;   
    	char buf[16];
    	
    	va_list ap;
    	va_start(ap, Data);
    	
    	while ( *Data != 0)     // 判断是否到达字符串结束符
    	{				                          
    		if ( *Data == 0x5c )  //'\'
    	{									  
    	switch ( *++Data )
    	{
    		case 'r':							          //回车符
    			USART_SendData(USARTx, 0x0d);
    			Data ++;
    		break;
    		
    		case 'n':							          //换行符
    			USART_SendData(USARTx, 0x0a);	
    			Data ++;
    		break;
    		
    		default:
    			Data ++;
    		break;
    	}			 
    	}
    	else if ( *Data == '%')
    	{									  //
    	switch ( *++Data )
    	{				
    		case 's':										  //字符串
    			s = va_arg(ap, const char *);
    	for ( ; *s; s++) 
    	{
    		USART_SendData(USARTx,*s);
    		while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
    	}
    		Data++;
    		break;
    	
    	case 'd':										//十进制
    	d = va_arg(ap, int);
    	itoa(d, buf, 10);
    	for (s = buf; *s; s++) 
    	{
    		USART_SendData(USARTx,*s);
    		while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
    	}
    	Data++;
    	break;
    		 default:
    				Data++;
    		    break;
    	}		 
    	} /* end of else if */
    	else USART_SendData(USARTx, *Data++);
    	while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
    	}
    }
    /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/


项目获取:

https://gitee.com/feifei1122/simulation-project

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的平衡位置环代码示例,结合了STM32F103芯片和MPU6050传感器。请注意,这只是一个示例代码,你需要根据自己的具体硬件连接和需求进行适当的修改。 ```c #include <stdio.h> #include "stm32f10x.h" #include "MPU6050.h" // 定义电机驱动引脚 #define MOTOR1_PIN1 GPIO_Pin_0 #define MOTOR1_PIN2 GPIO_Pin_1 #define MOTOR2_PIN1 GPIO_Pin_2 #define MOTOR2_PIN2 GPIO_Pin_3 // 定义电机PWM输出通道 #define MOTOR1_PWM_CH TIM_Channel_1 #define MOTOR2_PWM_CH TIM_Channel_2 // 定义PID参数 #define KP 1.0f #define KI 0.0f #define KD 0.0f // 定义控制周期 #define CONTROL_PERIOD_MS 10 // 定义角度目标值和速度目标值 #define TARGET_ANGLE 0.0f #define TARGET_SPEED 0.0f // 定义PID控制器变量 float errorSum = 0.0f; float lastError = 0.0f; // 初始化MPU6050传感器 void MPU6050_Init(void) { // 进行MPU6050初始化的相关操作 } // 获取当前角度值 float MPU6050_GetAngle(void) { // 获取MPU6050的角度值 } // 控制电机PWM占空比 void SetMotorPWM(uint16_t pwm1, uint16_t pwm2) { // 设置电机PWM输出占空比 } // PID控制器 void PID_Controller(void) { float currentAngle = MPU6050_GetAngle(); float error = TARGET_ANGLE - currentAngle; float output; // PID控制算法 output = KP * error + KI * errorSum + KD * (error - lastError); // 更新误差和上一次误差值 errorSum += error; lastError = error; // 限制输出范围 if (output > 100.0f) output = 100.0f; else if (output < -100.0f) output = -100.0f; // 设置电机PWM占空比 uint16_t motor1PWM = (uint16_t)(TARGET_SPEED + output); uint16_t motor2PWM = (uint16_t)(TARGET_SPEED - output); SetMotorPWM(motor1PWM, motor2PWM); } int main(void) { // 初始化相关硬件 MPU6050_Init(); // 初始化PID控制器相关变量 while (1) { // 执行PID控制 PID_Controller(); // 延时控制周期 delay_ms(CONTROL_PERIOD_MS); } } ``` 请注意,此示例代码仅提供了一个基本的框架,你需要根据自己的具体硬件连接和需求进行适当的修改和调整。同时,还需要根据你的电机驱动方式和硬件连接,使用相应的库函数进行PWM输出和延时操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值