基于stm32的智能小车设计
在输出模式下,该寄存器的值与CNT中的值进行比较,根据结果,实现电平的翻转。至此,我们把用到的几个寄存器都介绍完毕,下面我们就介绍如何通过库函数来配置实现PWM三路输出。
? 开启TIM3时钟以及复用功能输出。使能GPIO和端口复用功能时钟。库函
数使能TIM3、GPIO以及复用功能时钟的方法是: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
? 初始化TIM3,设置TIM3的PSC和ARR。在开启了TIM3的时钟之后,我们
要设置PSC和ARR寄存器的值来控制PWM的输出周期。调用的格式如下: TIM_TimeBaseStructure.TIM_Period=arr; TIM_TimeBaseStructure.TIM_Prescaler=psc; TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
? 设置TIM3_CH1、CH2、CH3的PWM模式,使能TIM3的CH1、CH2、CH3输出。
在库函数中PWM通道设置是通过TIM_OC1Init~TIM_OC4Init来设置的,这里我们需要3路PWM输出,所以我们需要使用函数TIM_OC1Init、TIM_OC2Init、TIM_OC3Init。库函数的调用格式如下: TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC3Init(TIM3, &TIM_OCInitStructure);
? 使能TIM3。完成以上配置后,我们要使能定时器TIM3。库函数调用格式
如下: TIM_Cmd(TIM3, ENABLE);
? 通过修改TIM3_CCRx(x为1,2,3)来控制占空比。库函数格式如下:
- 17 -
基于stm32的智能小车设计
Void TIM_SetComparex(TIM3,uint16_t Compare2);
我们可以知道,通过定时器3控制PWM波的占空比,从而实现速度方面的控制。其中arr和psc可以控制PWM波的周期,TIM3_CCRx可以控制PWM波的占空比。我们只需要调用此函数就可以实现不同的速度控制。
对于运动方向控制的代码我们就以后退为例,由于端口寄存器过于简单,我们不在此介绍端口的寄存器。我们仅介绍如何通过库函数进行端口配置。对各个I/O端口配置的过程相似,我们仅以PD8为例:主要过程如下所示: ? 使能I/O口时钟,调用格式如下所示:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC, ENABLE);
? 初始化I/O参数,调用格式如下所示:
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure); ? 操作I/0口
GPIO_SetBits(GPIOD,GPIO_Pin_8);PD8置1 GPIO_ResetBits(GPIOD,GPIO_Pin_8);PD8置0
我们知道了如何对端口进行操作之后就可以随意的控制小车的运动啦,运动方向的程序设计,其基本函数单元如下所示: void Left_Low(void);…
我们调用这些函数,就可以实现不同运动方向的控制。主要代码详见附录3.
2.3避障模块设计
在人类身体构造系统中,眼睛可以使我们非常方便的采集到外界环境的信息,然后把信息及时的传输到大脑,并对外界环境信息的变化做出相应的处理。而对智能小车来说,避障模块之于小车就相当于眼睛之于人类。避障模块可以采集外部地形数据,然后把所采集的地形数据传输到中央处理模块,从而实现躲避障碍的功能。避障模块所采用的器件在市场中有许多类型,比如红外检测,光位移检测,超声波检测等。本次试验我们使用的是HC-SR04超声波检测,超声波由于具
- 18 -
基于stm32的智能小车设计
有检测能力强,传播路径宽,因此我们决定使用HC-SR04器件。
在使用HC-SR04模块进行超声波测距的同时,我们可以使用舵机进行辅助。舵机的主要作用是改变HC-SR04模块的照射方向,从而控制超声波的发射方向。在程序编写过程中,如果小车前方遇见障碍时,我们可以直接控制舵机的转向,而小车的车身可以保持不变,在测量结束后,小车再做相应的动作。 2.3.1 避障模块器件结构及其原理
HC-SR04超声波测距模块测量范围在2cm-400cm之间,可以实现无接触式测距功能。HC-SR04超声波测距模块由一个超声波发射器、一个超声波接收器和控制电路组成,避障模块的实物结构图如图2.17所示:
图2.17实物正反面结构图
如结构图所示VCC提供5v电源,GND为接地线,TRIG为触发信号线,ECHO为回向信号输出线。基本原理如下:采用IO口TRIG触发测距,给至少10us的高电平信号,在TRIG触发沿到来后,超声波发射器会自动发出8个40KHz的方波,并且检测是否有信号返回,当超声波接收器接收到超声波时,表明有信号返回,通过IO口ECHO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。因此测量距离=(高电平持续时间*340m/s)/2。测量时序图如图2.18所示:
- 19 -
基于stm32的智能小车设计
图2.18 超声波时序图
我们根据时序图,可以编写相应的程序代码。为了防止发射信号对回向信号的影响,我们的测量周期不易过小。并且由于HC-SR04的感应角度不大于15°,所以测距时,为了防止发射信号丢失,我们要求被测物体的面积不应小于0.5平方米,否则可能导致测量结果不准确。
舵机在避障模块的主要作用前面已经提到,本节主要讲解舵机的工作特性。舵机的实物图如图2.19所示:
图2.19 舵机实物图
舵机的工作工作原理是stm32微处理器发出数据给舵机,舵机内部有一个基准电路,它会产生周期为20ms,宽度为1.5ms的基准信号,它将微处理器传输的直流偏置电压与电位器的电压数据进行比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回反馈信号。舵机的转动角度与stm32所提供的PWM信号相关。标准信号PWM周期为20ms,理论上来讲脉宽为1~2ms,实际我们的脉宽为0.5~2.5ms,脉宽与所转的角度一一对应。角度与脉宽的对应图如图2.20所示:
- 20 -

