10166-基于STM32的割草机器人设计与实现(详细设计说明书+原理图工程+源码工程+仿真工程)
·
10166-基于STM32的割草机器人设计与实现(详细设计说明书+原理图工程+源码工程+仿真工程)
本设计目标如下:
1、实现机器人的前后左右控制
2、实现避障功能、加速减速
3、模拟升降装置
4、实现割草控制
5、无线串口控制小车
6、两个电机控制驱动控制四个电机
7、OLED屏幕显示
割草机器人通过红外感应装置和高精度光电二极管识别障碍物,实现避障功能。当单片机获取传感器数据后,通过IO口对驱动模块进行控制,改变四个直流电机的工作状态,GPS定位可以使机器人能在预定区域内工作,无线模块实现远程控制;OLED显示系统状态,电机控制刀具实现割草功能,最终实现割草机器人的路径规划、障碍物躲避。综上可以得出,系统由单片机、按键电路、GPS电路、红外光电传感器、无线传输电路、电机驱动及电机等部分组成.
摘要:
通过按键模拟光学传感器信号,小车能精准识别路径变化并调整方向,OLED屏幕实时呈现系统名称,系统控制状态以及电机控制状态的显示;人为改变控制方式后成功避障后迅速恢复路径。整体测试表明,满足自主避障,升降控制以及割草等设计需求。OELD显示器显示刷新正常且无乱码情况发生。系统功能测试结果如下表7.1
资料包含:电子设计全套资料(精品)
1、原理图工程文件
2、仿真模型工程文件
3、仿真源代码工程文件
4、详细设计说明书-7711字
等等








/* Includes -----------------------------------------------------------------*/
#include "Drv_UserSystem.h"
/* Defines ------------------------------------------------------------------*/
/* Variables Define ---------------------------------------------------------*/
struct ST_Sys_Time stSysTime;
/* Function prototypes ------------------------------------------------------*/
/*******************************************************************************
* 函数名:UserSystemInit
* 描述 :用户配置初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void UserSystemInit(void)
{
SystemClock_Config();//64MHZ
SystickInit();//1ms
User_Uart1_Init();
User_ClockParaInit();
User_LED_Init();
User_Key_Init();
OLED_Init();
User_Moto_Init();
WatchDogInit();
Uart1Prints("欢迎使用除草机器人控制系统\r\n");
}
/*******************************************************************************
* 函数名:SystemClock_Config
* 描述 :系统时钟配置
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void SystemClock_Config(void)
{
/* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSI */
RCC_HSICmd(ENABLE);
/* Wait till HSI is ready */
while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
{}
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
#ifdef STM32F10X_CL
/* Configure PLLs *********************************************************/
/* PLL2 configuration: PLL2CLK = (HSI / 2) * 4 = 16 MHz */
RCC_PREDIV2Config(RCC_PREDIV2_Div2);
RCC_PLL2Config(RCC_PLL2Mul_4);
/* Enable PLL2 */
RCC_PLL2Cmd(ENABLE);
/* Wait till PLL2 is ready */
while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
{}
/* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */
RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
#else
/* PLLCLK = 4MHz * 16 = 64 MHz */
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16); // HSI is divided by 2 to have 4MHz then multiply by 16 to have 164MHz
#endif
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
/*******************************************************************************
* 函数名:SystickInit
* 描述 :滴答定时器时钟初始化
* 输入 :无
* 输出 :无
* 调用 :初始化
* 备注 :1ms
*******************************************************************************/
void SystickInit(void)
{
RCC_ClocksTypeDef RCC_ClockFreq;
//返回用作系统时钟的时钟源
RCC_GetClocksFreq(&RCC_ClockFreq);
if(SysTick_Config((SystemCoreClock) / 1000)) /* setup systick timer for 1ms /1000 interrupts */
{
/* capture error */
while(1);
}
NVIC_SetPriority(SysTick_IRQn, 0x0);
}
/*******************************************************************************
* 函数名:SysTick_Handler
* 描述 :滴答中断服务程序
* 输入 :无
* 输出 :无
* 调用 :1ms
* 备注 :
*******************************************************************************/
void SysTick_Handler(void)
{
TimerIsrHandle();
}
/*******************************************************************************
* 函数名:TimerIsrHandle
* 描述 :定时器时基处理函数
* 输入 :无
* 输出 :无
* 调用 :中断1ms
* 备注 :
*******************************************************************************/
void TimerIsrHandle(void)
{
stSysTime.flg._1ms++;
}
/*******************************************************************************
* 函数名:Time_millis
* 描述 :时基函数
* 输入 :无
* 输出 :帧长
* 调用 :内部调用
* 备注 :
*******************************************************************************/
uint64_t Time_millis(void)
{
return stSysTime.flg._1ms;
}
/*******************************************************************************
* 函数名:User_ClockParaInit
* 描述 :时钟数据初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :
*******************************************************************************/
void User_ClockParaInit(void)
{
stSysTime.flg._1ms = 0;
stSysTime.flg._5ms = 0;
stSysTime.flg._10ms = 0;
stSysTime.flg._50ms = 0;
stSysTime.flg._100ms = 0;
stSysTime.flg._1s = 0;
}
/*******************************************************************************
* 函数名:delay_syms
* 描述 :ms延时函数
* 输入 :uint16_t
* 输出 :void
* 调用 :ms延时调用
* 备注 :
*******************************************************************************/
void delay_syms(uint16_t ms)
{
uint64_t u64_target_time;
u64_target_time = Time_millis() + ms;
while(u64_target_time > Time_millis());
/* reload wdt counter */
IWDG_ReloadCounter();//清开门狗
}
/*******************************************************************************
* 函数名:WatchDogInit
* 描述 :看门狗初始化
* 输入 :void
* 输出 :void
* 调用 :初始化
* 备注 :Tout(ms) = prv/40*rlv 32/40*2499=1999.2ms
*******************************************************************************/
void WatchDogInit(void)
{
/*IWDG初始化*/
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //独立看门狗写使能
IWDG_SetPrescaler(IWDG_Prescaler_256); //设置预分频为16
IWDG_SetReload(2499); //设置重装值为2499,独立看门狗的超时时间为2s
IWDG_ReloadCounter(); //重装计数器,喂狗
IWDG_Enable(); //独立看门狗使能
}
更多推荐



所有评论(0)