基于stm32的智能小车设计
图2.32 stm32外部中断/事件控制器结构图
图中的实线箭头,为外部中断信号的传输路径。 首先外部信号从编号为1的输入线进入。
其次这个外部信号通过编号2的边沿检测电路,这个边沿检测电路受到“上升沿选择寄存器”、“下降沿选择寄存器”的控制,我们可以控制这两个寄存器来选择中断的触发方式。我们可以在程序中进行设置,比如
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;设置为上升沿触发中断 然后该外部信号进入编号为3或门,或门另一端是软件中断寄存器,如果,软件中断/事件寄存器的对应位置1,编号3的输出总是为有效信号1。之后进入“中断挂起请求寄存器”,该寄存器记录了外部信号的电平变化。
最后经过编号为4的与门进入NVIC中断控制器,如果 “中断屏蔽寄存器”的对应位置0,外部的中断请求信号不能传输到NVIC中断控制器,从而实现中断的屏蔽。由于我们采用的是外部信号触发中断,所以我们只需了解外部中断的请求机制,对于事件的中断请求机制,我们在这里不做介绍。 我们以PE1为例,介绍下外部中断的一般步骤。步骤如下: ? 开启I/O的复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
? 初始化I/O为输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOE, &GPIO_InitStructure);
- 10 -
基于stm32的智能小车设计
? 初始化线上中断,设置触发条件
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定时器介绍表
定时器名称 TIM2
定时器配置模式 定时器中断模式
主要功能
通过定时器中断,控制超
声波的扫描周期
TIM3
PWM复用输出模式
控制小车速度及舵机转
向
TIM5
输入捕获模式
采集超声波发射到接受的高电平持续时间t
- 11 -
基于stm32的智能小车设计
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) { farward_Low();delay_ms(10);} }
2.2 电机驱动模块
Stm32对小车的控制,就是对电机的控制,通过控制电机的转向,小车的运动状态就会发生改变。电机驱动模块的主要器件为LM293N,我们下面就详细讲解下电机驱动模块。
- 12 -
基于stm32的智能小车设计
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关断,电机两端为反向电压,电机实现反转或正转制动。
2.2.2 驱动模块电路设计
电机驱动模块的电路原理如图2.10所示:
- 13 -
S4
基于stm32的智能小车设计
图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 -