燕山大学课程设计说明书题目:蓝牙智能小车学院(系):电气工程学院年级专业:10级过控2班学号:学生姓名:指导教师:目录摘要................................................................3第一章智能蓝牙小车简介.............................................4第二章系统硬件设计.................................................5第三章系统软件设计................................................8第四章心得与体会..................................................14参考资料...........................................................15摘要本文的主要工作是基于STM32蓝牙智能小车的设计,随着越来越多的高科技产品逐渐融入了日常生活中,步进电机控制系统发生了巨大的变化。单片机、C语言等前言学科的技术日趋成熟与实用化,使得步进电机的控制系统有了新的研究方向与意义。本文描述了一个由STM32微处理器、步进电机、键盘等模块构成的,提供基于STM32的PWM细分技术的步进电机控制系统。该系统采用STM32微处理器为核心,在MDK环境下进行编程,根据键盘的输入,使STM32产生周期性的PWM信号,用此信号对步进电机的速度及转动方向进行控制。结果表明该系统具有结构简单、工作可靠、精度高等特点。关键词:STM32微处理器;蓝牙智能小车;PWM信号;细分技术第4页第一章蓝牙智能小车简介机器人可以分为三部分——传感器部分、控制器部分、执行器部分。控制器部分:接收传感器部分传递过来的信号,并根据事前写入的决策系统(软件程序),来决定机器人对外部信号的反应,将控制信号发给执行器部分。好比人的大脑。执行器部分:驱动机器人做出各种行为,包括发出各种信号(点亮发光二极管、发出声音)的部分,并且可以根据控制器部分的信号调整自己的状态。对机器人小车来说,最基本的就是轮子。这部分就好比人的四肢一样。传感器部分:机器人用来读取各种外部信号的传感器,以及控制机器人行动的各种开关。好比人的眼睛、耳朵等感觉器官。无线部分:用蓝牙从机的TTL接口接收信号反馈给单片机,还可以通过电脑的无线局域网网卡来控制路由器的TTL串口来控制单片机的状态。由于蓝牙模块容易得到且接口方便,电压可以用+5V控制,携带方便,便于在小车上安装。电机驱动:电机驱动需要大电流,较高的电压,考虑到单片机的负载能力,用L298N驱动模块来驱动电机,单片机输出逻辑信号控制L298N模块输出正反向电压,由此控制电机的正反转。第5页第二章系统硬件设计1.小车底盘小车底盘是机器人最重要的载体,相当于人体的驱干,ZK-4WD小车平台采用差速转弯非常灵活可以实现原地打转。小车平台大小刚好,可以承载一些如驱动器,控制器,电池,传感器等。2.驱动器小车直流电机工作电流一般是200-400MA有些更大,如果一个小车是二个轮子,那么总的电流在400-800MA左右,这些电机轮子都是要接受单片机指令执行相应的动作,而市面有的单片机IO口一般只能提供5MA到10MA的电流,直接驱动不了电机,所以需要搞一个驱动模块。放大电流。驱动采用专业的L298N,L293D驱动芯片。第6页3.控制器STM32单片机控制器:这款控制器主控芯片是STC89C52属标准的51核的单片机,也可以用增强型51单片机芯片,STC12C5A60S2内带PWM,AD,1T运行速度(主流),集成USB转串可以直接用USB下载程序。集成数码管,舵机,红外避障,12864,1602,无线模块,等接口,板载输入按键。控制板休积小,非常适用于小车。在不用的时候可作用学习板使用。第7页4.小车所需的能源可以用普通的AA5号电池,但一般采用低内阻的充电电池,充电电池套装。5.蓝牙无线传感器可以用Android智能手机控制小车运行(我们有配套的Android软件),Android手机用内置蓝牙与蓝牙无线模块配对,发出指令,蓝牙无线第8页模块接收其指令。当单片机接收到蓝牙无线模块传来的指令,执行相应解码动作,从而控制小车。第三章系统软件设计一、所包含的头文件:#includestm32f10x.h#includeusart1.h#includetimer4.h#includeadc1.h#includekey.h二、外设的初始化和设置本节按步骤描述了如何初始化和设置任意外设。这里PPP代表任意外设。1、在主应用文件中,声明一个结构PPP_InitTypeDef,例如:PPP_InitTypeDefPPP_InitStructure;这里PPP_InitStructure是一个位于内存中的工作变量,用来初始化一个或者多个外设PPP。2、为变量PPP_InitStructure的各个结构成员填入允许的值。可以采用以下2种方式:a)按照如下程序设置整个结构体PPP_InitStructure.member1=val1;PPP_InitStructure.member2=val2;PPP_InitStructure.memberN=valN;/*whereNisthenumberofthestructuremembers*/第9页以上步骤可以合并在同一行里,用以优化代码大小:PPP_InitTypeDefPPP_InitStructure={val1,val2,..,valN}b)仅设置结构体中的部分成员:这种情况下,用户应当首先调用函数PPP_SturcInit(..)来初始化变量PPP_InitStructure,然后再修改其中需要修改的成员。这样可以保证其他成员的值(多为缺省值)被正确填入。PPP_StructInit(&PPP_InitStructure);PP_InitStructure.memberX=valX;PPP_InitStructure.memberY=valY;/*whereXandYarethememberstheuserwantstoconfigure*/3.调用函数PPP_Init(..)来初始化外设PPP。4.在这一步,外设PPP已被初始化。可以调用函数PPP_Cmd(..)来使能之。PPP_Cmd(PPP,ENABLE);可以通过调用一系列函数来使用外设。每个外设都拥有各自的功能函数。更多细节参阅Section3外设固件概述。注:1.在设置一个外设前,必须调用以下一个函数来使能它的时钟:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx,ENABLE);2.可以调用函数PPP_Deinit(..)来把外设PPP的所有寄存器复位为缺省值:PPP_DeInit(PPP)3.在外设设置完成以后,继续修改它的一些参数,可以参照如下步骤:PPP_InitStucture.memberX=valX;PPP_InitStructure.memberY=valY;/*whereXandYaretheonlymembersthatuserwantstomodify*/PPP_Init(PPP,&PPP_InitStructure);1)此次课设中GPIO的配置voidSTEPMotor_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_12|GPIO_Pin_13;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOB,&GPIO_InitStruct);第10页}选用端口为PB的PB0,PB1,PB12,PB13。频率为50MHz,输出模式为推挽输出。2)主程序#includestm32f10x.h//头文件voidGPIO_Config(void);//声明函数voidUsart_Config(void);//声明函数voiddelay(uint16_tz);//声明函数voidNVIC_Config(void);//声明函数u8Receive;intmain(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1,ENABLE);//打开相应的时钟使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//打开TIM4的时钟使能GPIO_Config();//调用函数Usart_Config();//调用函数GPIO_Config();//调用函数NVIC_Config();//调用函数while(1){}}voiddelay(uint16_tz)//延时函数{uint16_ti=0;while(z--){for(i=0;i1000;i++);//1毫秒第11页}}voidUsart_Config(void)//设置串口{USART_InitTypeDefUSART_InitStruct;//声明结构体USART_InitStruct.USART_BaudRate=9600;//给结构体赋值USART_InitStruct.USART_WordLength=USART_WordLength_8b;USART_InitStruct.USART_StopBits=USART_StopBits_1;USART_InitStruct.USART_Parity=USART_Parity_No;USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_Init(USART1,&USART_InitStruct);//初始化USART_Cmd(USART1,ENABLE);//使能USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中断}voidGPIO_Config(void){GPIO_InitTypeDefGPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Init(GPIOB,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOC,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_All;GPI