基于stm32的智能小车设计
,ENABLE); ? 初始化I/O为输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOE, &GPIO_InitStructure); ? 初始化线上中断,设置触发条件
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource1); EXTI_InitStructure.EXTI_Line=EXTI_Line1;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); ? 配置中断分组NVIC,并使能中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x06;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); ? 编写中断服务函数
void EXTI1_IRQHandler(void){}主要代码详见附录2. 2.1.5 stm32定时/计数器介绍
Stm32系列的单片机一般包含8个计数/定时器,TIM1、TIM8分别为高级控制定时器,TIM2~TIM5为通用定时器,TIM6以及TIM7为基本定时器。对于定时器的详细内容,我们不在这里一一介绍。
然后我们介绍一下本实验采用了那些定时器,以及这些定时器所要完成的功能有哪些。本实验所采用的定时器以及功能如下表所示:
表2-2定时器介绍表
定时器名称
定时器配置模式
- 11 -
主要功能
基于stm32的智能小车设计
TIM2 定时器中断模式 通过定时器中断,控制超
声波的扫描周期
TIM3 PWM复用输出模式 控制小车速度及舵机转
向
TIM5 输入捕获模式 采集超声波发射到接受的高电平持续时间t
2.1.6 主程序设计流程图
在本节实验中,循迹模块以及避障模块都是采用中断方式进行工作的,因此其主程序流程图如下图所示:
开始系统初始化前进 图1.2 主程序流程图
根据程序设计图,主程序设计如下: int main(void) {
u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态 u16 TIM5CH1_CAPTURE_VAL; //输入捕获值 delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED_Init();
GPIO_Configuration(); //端口初始化 EXTIX_Init(); //扫描轨迹
TIM2_Int_Init(4999,7199); //控制超声波扫描周期 TIM3_PWM_Init(1999,719); //控制舵机方向
TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 while(1)
- 12 -
基于stm32的智能小车设计
{ farward_Low();delay_ms(10);} }
2.2 电机驱动模块
Stm32对小车的控制,就是对电机的控制,通过控制电机的转向,小车的运动状态就会发生改变。电机驱动模块的主要器件为LM293N,我们下面就详细讲解下电机驱动模块。
2.2.1 驱动模块结构及其原理
电机驱动模块的实物图如图2.8所示:
图2.8 驱动电路实物图
电机驱动模块的主要器件是芯片LM293D,内部原理图如图2.9所示:
K1
K4
K3
K2
图2.9 电机驱动内部原理图
全桥式驱动电路的4只开关管都工作在斩波状态,如图1.2所示,K1、K2为一组,K3、K4 为另一组,两组的状态互补,一组导通则另一组必定关断。当K1、K2导通时,K3、K4关断,电机两端加正向电压,电机实现正转或反转制动;当K3、K4导通时,K1、K2关断,电机两端为反向电压,电机实现反转或正转制动。
- 13 -
基于stm32的智能小车设计
2.2.2 驱动模块电路设计
电机驱动模块的电路原理如图2.10所示:
图2.10 驱动模块电路原理图
表2-2是各个端口状态与运动方向的关系,其关系如下表所示:
表2-2 端口与运动方向关系表
电机M1 停止 正转 反转 -
IN1 0 1 0 1
IN2 0 0 1 1
电机M2 停止 正转 反转 -
IN3 0 1 0 1
IN4 0 0 1 1
2.2.3驱动软件程序设计
车轮电机的动作由GPIO口的输出实现,本节主要配置运动方向和运动速度,对于运动速度的控制,我们必须使用PWM,通过改变PWM的占空比来调节速度的大小,其主要代码设计如下所示:
void TIM3_PWM_Init(u16 arr,u16 psc){ ….}
要想使stm32的通用定时器TIMx产生PWM输出,需要用到的寄存器有:预分频寄存器(TIMx_PSC)、自动重装载寄存器(TIMx_ARR)、捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。我们先介绍这几个寄存器,然后介绍如何使用库函数产生PWM输出。下面我们就简单介绍下这些寄存器:
首先是预分频寄存器(TIMx_PSC),该寄存器可以用设置对时钟进行分频,然后在提供给计数器作为计数器的时钟。该寄存器的各位功能如图所示:
- 14 -
基于stm32的智能小车设计
图2.11 TIMx_PSC寄存器各位描述
接下来介绍自动重装载寄存器(TIMx_ARR),该寄存器的各位描述如下图所示:
图2.12TIMx_ARR寄存器各位描述
通过设置这两个寄存器,我们就可以算出PWM的输出周期,计算公式为: Tout=((arr+1)*(psc+1))/Tclk。其中Tclk为系统时钟周期。
其次我们介绍捕获/比较模式寄存器(TIMx_CCMR1/2),总共有两个,TIMx_CCMR1和
TIMx_CCMR2,TIMx_CCMR1控制通道CH1和CH2,TIMx_CCMR2控制CH3和CH4。因为这2个寄存器差不多,我们仅以通道CH1为例,介绍其中的TIMx_CCMR1为例,该寄存器的各位描述如下图所示:
图2.13TIMx_CCMR1/2寄存器各位描述
这里我们只介绍该寄存器的OCxM位,我们就以TIMx_CCMR1中的OC1M(控制通道CH1)为例,该位功能如下图所示:
- 15 -