图3.1 IAR EWARM主界面
3.2 程序设计思路及部分模块程序
3.2.1 程序设计思路
整个小车控制系统的程序设计采用模块化的编程思想,整个主程序的流程图如图3.2。
18
图3.2 主程序流程图
根据图3.2,程序主要包括程序初始化、按键扫描子程序、自由行走模式子程序、循迹模式子程序、LCD显示子程序。
程序初始化,包括对STM32F103系统模块、液晶显示模块、PWM波输出模块、电机驱动模块的初始化,然后编写各子模块的实现程序。 3.2.2 按键子程序
系统初始化完成后,进入键盘扫描子程序,其程序流程图如图3.3。
19
开 始 是否自由行走模式 N0 转换为循迹模式 YES 自由行走模式 N0 是否开始执行 YES 设置执行标志 PWM波占空比YES 是否加速 N0 增10/300 YES 是否减速 PWM波占空比减10/300 N0 占空比是否超出范围 YES N0 PWM波输出调节 维持原始PWM波输出 退出 图3.3 键盘扫描子程序流程图
20
由上章键盘扩展电路设计可知,启动/停止由1键控制切换,在程序中通过判断标志变量值来切换;自由行走模式和循迹模式单独按键控制;按小车加速和减速键,对小车速度进行相应调节。
本设计中小车运动方向转变时,速度未做单独处理,因此要求小车的运动速度不宜过快,否则方向不易控制。通过对PWM波占空比范围的控制限定小车的速度范围,占空比一般在150/300以下,因此本次设计中占空比范围设定为40/300-160/300。通过对定时器配置,产生时钟频率为10KHZ,周期为2.99ms的PWM波,由加速/减速键步进调节占空比参数TIM4_CCRx值,实现对小车运行速度的控制。具体定时器配置[10]以TIM3通道3为例程序如下:
void PWM_Channel _ configuration(u16 CCR_Val) {
u16 CCR3_Val=CCR_Val;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能 TIM_OCInitStructure.TIM_Pulse = CCR3_Val; //设置占空比=CCR_Val/(TIM_Period +1) TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //比较输出极性 TIM_OC3Init(TIM3, &TIM_OCInitStructure); //配置通道3
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能 TIM3在 CCR3上的预装载寄存器
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIM3在 ARR 上的预装载寄存器 TIM_Cmd(TIM3, ENABLE); }
3.2.3 循迹子程序
循迹模式键按下,小车进入循迹模式,其流程图如图3.4。
21
图3.4 循迹子流程图
将小车置于黑迹上,进入循迹模式,主控芯片控制红外探测器使能,此时左右红外探测器均未检测到出界,小车开始向前行走,此后根据左右探测器的检测信号对小车的运动状态进行相应调整,使小车按设定的轨迹行走,实现简单的循迹功能。
3.2.4 自由行走子程序
自由行走模式键按下,小车进入自由行走模式,其子程序流程图如图3.5。
22