资源描述
摘 要
飞思卡尔智能车大赛是面向全国大学生举办的应用型比赛,旨在培养创新精神、协作精神,提高工程实践能力的科技活动。大赛主要是要求小车自主循迹并在最短时间内走完整个赛道。针对小车所安装传感器的不同,大赛分为光电组、电磁组和摄像头组。
本文介绍了本院自动化系第一届大学生智能汽车竟赛的智能车系统。包括总体方案设计、机械结构设计、硬件电路设计、软件设计以及系统的调试与分析。机械结构设计部分主要介绍了对车模的改进,以及舵机随动系统的机械结构。硬件电路设计部分主要介绍了智能车系统的硬件电路设计,包括原理图和PCB设计智能车系统的软、硬件结构及其开发流程。该智能车车模采用学校统一提供的飞思卡尔车模,系统以STM32F103C8T6作为整个系统信息处理和控制命令的核心,使用激光传感器检测道路信息使小车实现自主循迹的功能
关键字:飞思卡尔智能车 STM32F103C8T6 激光传感器
第一章 概述
1.1专业课程设计题目
基于嵌入式STM32的飞思卡尔智能车设计
1.2专业课程设计的目的与内容
1.2.1目的
让学生运用所学的计算机、传感器、电子电路、自动控制等知识,在老师的指导下,结合飞思卡尔智能车的设计独立地开展自动化专业的综合设计与实验,锻炼学生对实际问题的分析和解决能力,提高工程意识,为以后的毕业设计和今后从事相关工作打下一定的基础。
1.2.2内容
本次智能车大赛分为光电组和创新做,我们选择光电组小车完成循迹功能。该智能车车模采用学校统一提供的飞思卡尔车模,系统以STM32F103C8T6作为整个系统信息处理和控制命令的核心,我们对系统进行了创造性的优化:
其一,硬件上采用激光传感器的方案,软件上采用keil开发环境进行调试、算法、弯道预判。
其二,传感器可以随动跟线,提高了检测范围。
其三,独立设计了控制电路板,充分利用STM32单片机现有模块进行编程,同时拨码开关、状态指示灯等方便了算法调试。
1.3方案的研讨与制定
1.3.1传感器选择方案
方案一:选用红外管作为赛道信息采集传感器。
由于识别赛道主要是识别黑白两种不同的颜色,而红外对管恰好就能实现区分黑白的功能,当红外光照在白色KT板上时,由于赛道的漫反射作用,使得一部分红外光能反射回来,让接收管接的输出引脚的电压发生变化,通过采集这个电压的变化情况来区分红外光点的位置情况,以达到区分赛道与底板的作用。
红外管的优点在于价格便宜,耐用;缺点却用很多:1、红外光线在自然环境中,无论是室内还是室外均比较常见,就使得其抗干扰能力不强,容易受环境变化的影响。2、调试不方面,由于红外光是不可见光,调试的时候需要采用比较麻烦的方法来判断光电的位置。3、由于红外管光线的直线性不好,就使得红外传感器所能准确的判断的最远距离比较小,也就是通常所说的前瞻不够远。
方案二:选用激光作为路径识别传感器。
激光传感器的工作原理和红外传感器的工作原理基本相同,也是利用光线在赛道上发生漫反射后接收反射回来的光线来识别赛道的。激光传感器用很多优点:1、激光光束的直线性十分好,发射出去的光线发生散射的程度可以忽略;2、经过调制后的激光受环境其他光线干扰的程度也十分低。3、激光传感器可以让赛车的前瞻达到80CM到100CM左右,为赛车的高速运时所需的准确及时的赛道信息提供了保障。不过激光也用缺点:容易衰减。
最终选择的方案:激光传感器相对于红外传感器有很明显的优势:1、抗干扰能力强;2、前瞻远;3、调试效果直观。而在赛车需要的高速的情况下,看得足够远和准确显得尤为重要,在这样的要求下,激光传感器较于红外传感器有十分明显的优势,所以最终我们选择的是拥有绝对优势的激光传感器作为路径识别传感器。
1.3.2传感器安装方式
方案一:传感器角度和高度不可变化的固定式。
方案二:传感器可以活动的可动式。
传感器可动式主要是依靠舵机带动而活动,也就是最近这两届比赛中开始出现的“摇头”(又称“摆头”)式。通过控制相应的舵机达到控制传感器角度的效果,调节传感器的角度可以让传感器发出的光线始终落在赛道上你想要的位置,这样大大地增加了对赛道信息的准确性和及时性,为赛车速度的提升有很大的帮助,在第六届的竞赛中,我们就能体会到摇头光电车的速度较以往的光电车有了很大的提高。
最终确定的方案:经过各方面的考虑,最终选择单摇头作为传感器的固定方式。安装图如图1-1:
图1-1 传感器安装图
1.4 项目功能模块化设计
(1)MC9S12XS128主控模块:作为整个智能汽车的“大脑”,将采集光电传感器的信号,根据控制算法做出控制决策,驱动直流电机完成对智能汽车的控制。
(2)激光传感器模块:是智能汽车的“眼睛”,可以通过一定的前瞻性,提前感知预测前方的赛道信息,为智能汽车的“大脑”做出决策提供必要的依据和充足的反应时间。
(3)电源模块:为整个系统提供合适而又稳定的电源。
(4)电机驱动模块:驱动直流电机完成智能汽车的加减速控制和转向控制。
(5)舵机控制:一方面,控制传感器检测道路弯道,控制传感器的转向。另一方面,控制小车的整体的转向。
第二章 项目硬件方案
2.1 系统方框图
STM32F103C8T6
最小系统
电机驱动模块
激光传感器
电源模块
舵机控制
图2-1智能车整体框图
整个智能车系统包括:激光传感器、舵机转向控制、电机驱动控制、电源供电模块和STM32F103C8T6。详细如下:
(1)激光传感器:该智能车通过激光传感器对道路信息进行采集。原理:当激光照射到黑线时,黑线将大部分光吸收掉,激光不能反射回来。当激光照射到白色赛道时,由于漫反射作用接收管能够将激光接收回来。由此来对道路信息采集与处理。
(2)舵机控制:本车采用摇头舵机和转向舵机相互协调的方式控制车模在不同的弯道给出合适的转角。摇头舵机作用是追寻赛道,转向舵机根据所采集到的信息给出不同的打角。
(3)电机驱动控制:想要智能车以最快的速度跑完全程则必须对电机有很好的控制策略。我们的控制策略是:直道时以最快速度行驶,入弯时减速,出弯加速。这样小车以最快的速度顺利的跑完全程。
(4)电源模块:电源智能车工作的必要前提,它为各个电路模块提供稳定电源,保证各模块正常工作,这也是智能车设计需要考虑的一个很关键的问题。
(5)MC9S12XS128最小系统:这部分是整车的核心。它主要实现对采集的道路信息进行分析与处理,给舵机和电机不同的占空比来控制小车的转向和加速减速。
2.2 系统器件选型
小车的车模、电机、舵机及电池均由学校统一提供,而单片机和传感器则经过讨论,我们选用了STM32F103C8T6和激光传感器。
2.1.1车膜整体结构
图 2-2 车模实物图
硬件资源:
(1)1个HL-380H车模的基本支架;
(2)1个RS380高速电机;
(3)1个MG995舵机;
(4)1个配套电机齿轮;
(5)1套螺丝包;
(6)轴承若干。
2.2.2 转向舵机的安装
H型前支架配置(适合4.5MM板子)
序号
名称
数量
备注
1
前支架H型
1
大小部件共12个
2
杯式轴承4*11*4
2
3
双通铜柱M3*16
2
4
双通铜柱M3*20
4
5
双通铜柱M4*30
2
6
螺丝M3*8
12+1
7
螺丝M3*12
1+1
8
螺丝M4*12
6+1
9
螺丝M4*25
2+1
10
螺帽M4*12普通
4+1
11
螺帽M4自锁
2+1
12
螺帽M3自锁
1+1
13
舵机MG995
1
14
65mm车轮
2
表 2-1
2.2.3 车轮及底盘调整
540后支架配置
序号
名称
数量
备注
1
540后支架
1
共4个部件
2
540电机
1
检查螺丝是否上在电机上
3
3.17齿轮 11T
1
4
5*120mm光轴
1
检查轴承和光轴是否有配套
5
5*11*4杯式轴承
2
6
5.1mm锁紧扣
3
7
5mm_72齿轮
2
检查齿轮有没有坏齿
8
齿轮插销
1+1
9
5mm联轴器
2
10
机米M3*3
4+1
11
机米M3*6
2+1
短销的1+1 长销的是2+1
12
3mm机米扳手
1
13
M3*25双通铜柱
2
14
M3*30双通铜柱
2
15
M3*12螺丝
2+1
16
M3*8螺丝
8+1
17
M4*6螺丝
2+1
固定轮子在联轴器
18
65mm橡胶轮
2
表 2-2
2.2.4 RS540电机
图2-3 电机实物图
电压
转数(转/分)
电流
3V
8400
1.30A
4.5V
12400
1.47A
6V
16500
1.60A
7.5V
20800
1.70A
表 2-3
2.2.5 电池电源
图 2-4电池实物图
主要参数:
电池厚:15MM 宽:35MM 长:67MM
电池重:70G
持续放电电流:20C
瞬间放电电流:40C
放电终止电压:单体208V
2.2.6 单片机
单片机是系统设计的核心,根据设计要求,本设计采用STM32F103C8T6单片机作为控制器,选择购买单片机最小系统,此系统稳定且非常可靠,所有引脚均引出,能满足设计要求,具体实物如图2-3所示:
图2-3 STM32F103C8T6实物图
2.2.7 激光传感器
针对激光传感器的优点我们选用了12个激光头,对应6个接收管。实物图如图2-4:
图2-4 激光传感器实物图
2.3 系统整体原理图
2.3.1 整体原理综述
整个小车系统由单片机最小系统、电机驱动电路、传感器电路、电源供电电路以及单片机的下载在口构成,总的主控制电路图如下图2-5:
图2-5主控制电路图
2.3.2 各模块原理综述
1.单片机最小系统
单片机最小系统的三要素是:电源、晶振、复位电路构成。如图2-6为单片机最小系统电路图:
图2-6 单片机最小系统
(1)微控制器,STM32F103C8T6微控制单元作为STM32系列的32位单片机,由标准片上外围设备组成,包括32位中央处理器、64KB的Flash存储器、20KB的RAM、两个12位ADC,三个通用16位定时器加一个PWM定时器,以及标准和先进的通讯接口:上两I2CS和SPI接口,三个串行外设接口,一个USB和CAN,组8通道的输入捕捉或输出捕捉的增强型捕捉定时器、两组8通道10路模数转换器、一组8通道脉宽调制模块、一个字节数据链路控制器、29 路独立的数字I/O接口、20路带中断和唤醒功能的数字I/O接口、1个增强型CAN总线接口,同时,单片机内集成了锁相环电路可使能耗和性能适应具体操作的需要。
(2)电源是系统正常工作的保障,关系着小车是否能正常运行。
比赛使用的是统一提供的7.2V,2000MA NI-CD电池供电。而单片机和传感器需要的是3.3V和5V电源,舵机需要7.2V电源,因此我们需要稳压芯片降低电压以提供各个模块使用。
我们常用的集成三端稳压芯片有两种:线性稳压芯片和开关型稳压芯片。线性稳压芯片的特点是反应速度很快、输出纹波小、发热量大、效率低,而开关型稳压型片则功耗小、效率高,单输出纹波大,电路复杂。
经过大量的选型和测试后,我们选择了LM1117和7805。LM1117为低压差线性调节稳压器件,最大输出电流800MA,经过LM1117稳压后,输出3.3V和5V,对单片机和传感器等供电。7805为三端稳压器件,经过7805稳压后,输出7.2V,对舵机供电。2-7图为电源模块基本电路图
图2-7电源模块电路图
(3)晶振
图2-8晶振电路图
(4)复位电路
图2-7复位电路图
2、电机驱动模块
本次选用飞思卡公司的MC33886电机驱动集成芯片它是一种常见的集成H桥式电机驱动芯片,该芯片具有完善的过流、欠压、过温保护等功能具有最大5A的连续工作电流,内部MOSFET导通电阻为120毫欧,使用集成芯片的电路设计简单,可靠性高,由于电机较大,工作电流远不止5A,因此我们采用两片MC3886并联。电路图如2-8:
图2-8电机驱动电路
3、激光传感器
激光发射管发射出去的激光照射到赛道表面时会产生漫反射,这时由漫反射反射回的光束,经过透镜聚焦后聚集在激光接收传感器上,如图2-9所示:
图2-9激光传感器原理图
根据本次比赛寻双线的赛道特点,我们在激光头及激光传感器的布局上选用了“一”字形布局,并且采用了摇头的方法,即用舵机来控制其方向。如图2-10所示:
图2-10激光头分布图
本文使用了12个激光头,6个激光接收管。方案中采用74LS138译码器和三极管驱动,实现分时单独点亮激光管,防止相邻激光头之间的干扰。由于接收管对特定频率范围的光波敏感,故需要将激光的发射频率通过PWM调制到180KHz左右,再经过赛道表面漫反射回来,被接收管收到。电路图2-11如下:
图2-11激光传感器电路图
图2-12激光板
图2-13激光驱动板
4、舵机控制
除了由学校统一给的舵机作为作为控制小车的转向外,我们还增加一个用来控制激光头摆向的舵机,单随动舵机方案是将一个伺服舵机固定在车模上,使其转轴向上。同时将激光传感器安装于舵机上,使其能随舵机轴的转动而左右转动,类似于雷达扫描的工作模式。这种方案下,激光传感器的检测范围是车模前方的一个扇形区域,检测范围大,检测距离远,并且基本不会丢失黑线。采用这种方案的智能车俗称为 “摇头”车。如图2-14舵机安装实物图:
图2-14 舵机安装图
第三章 系统软件方案
3.1 系统I/O分配
对于STM32F103C8T6单片机,PB0接TIM3-CH3,输出PWM波,PB1口接TIM3-CH4,输出反向PWM波, PB8口接前轮打角舵机,PB9接激光排舵机。
3.2主程序及流程图
开始
定时器初始化
小车前进
激光头1、2、3分别发射激光
第一个接收管接收到数据
激光头4、5、6分别发射激光
激光头7、8、9分别发射激光
激光头10、11、12分别发射激光
第二个接收管接收到数据
第三个接收管接收到数据
第四个接收管接收到数据
对应激光发射激光接收管未收到两舵机同时向该方向转动
两个舵机停止转动
退出
图3-1 主程序流程图
3.3主要功能模块程序
3.3.1定时器PWM波初始化
#include<stm32f10x.h>
u8 table[8]={0xff07,0xff0e,0xff15,0xff1c,0xff23,0xff2A,0xff31,0xff38};
u8 flage1,flage2,flage3,flage4,flage5,flage6;
//u16 h,m;
//void TIM3_PWM_Init();
void TIM3_PWM_Confige(void);
void GPIO_Confige(void);
void TIM3_PWM_Confige(void);
static void TIM3_PWM_Mode(void);
//void key(void);
// void saomiao(void);
void delay(u8 z)
{
u16 i,j;
for(i=0;i<z;i++)
for(j=0;j<200;j++);
}
int main(void)
{
u16 h=120,m=120;
//unsigned int kkk,jjj;
u8 i,flage8, flage9;
//CCR3_Val=120;
//CCR4_Val=110;
//u16 flage=0;
//SystemInit();
GPIO_Confige();
TIM3_PWM_Confige();
TIM3_PWM_Mode();
// while(1);
flage8=1;
flage9=1;
while(1)
{
saomiao();
}
}
void TIM3_PWM_Confige(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 ,TIM_CH3->PB0
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 ,TIM_CH3->PB0
//设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
}
static void TIM3_PWM_Mode(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
u16 CCR1_Val = 100;
u16 CCR2_Val = 100;
u16 CCR3_Val = 500;
u16 CCR4_Val = 500; //初始化TIM3
TIM_TimeBaseStructure.TIM_Period = 999; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =0x00E0; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM4
TIM_TimeBaseStructure.TIM_Period = 999; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =0X0402; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC3Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC4Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIM3
TIM_Cmd(TIM4, ENABLE); //使能TIM3
}
3.3.2 I/O模块初始化
void GPIO_Confige(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; //PA口作为激光头的扫描
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure); //PB作为接受
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
//my_gpiof.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
//my_gpiof.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
//my_gpiof.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
//my_gpiof.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
//my_gpiof.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
//my_gpiof.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14; //PA口作为激光头的扫描
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; //PA口作为激光头的扫描
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //开启GPIOA_0引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; //设置该IO口为下拉输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; //开启GPIOC_13引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //设置该IO为上拉输出
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void saomiao(void)
{
u8 i ,flage8=1,flage9=1;
for(i=0;i<8;i++)
{
GPIO_Write(GPIOA,table[i]);
delay();
}
flage1=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
flage2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);
flage3=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12);
flage4=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1);
flage5=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6);
flage6=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15);
delay();
if(flage3==1||flage2==1)
{
if(flage8==1)
{
h=h+10;
}
GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);
//GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);
if(h>160)
{
h=160;
}
m=h;
if(flage6==1||flage4==1)
{
m=h;
flage8=0;
}
}
flage8=1;
if(flage2==1||flage3==1)
{
if(flage8==1)
{
h=h+10;
m=h;
}
GPIO_WriteBit(GPIOB, GPIO_Pin_13, Bit_RESET);
TIM_SetCompare4(TIM4,h);
if(h>160)
{
h=160;
}
if(flage2==1||flage3==1)
{
m=h;
flage8=0;
}
}
if(flage4==1||flage6==1)
{
if(flage9==1)
{
h=h-10;
m=h;
}
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET);
TIM_SetCompare4(TIM4,h);
if(h<90)
{
h=90;
}
if
展开阅读全文