图1  系统设计图
3
第  38  卷                      数字技术与应用    www.szjsyyy
4
#define  KEY0  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8) //KEY0为PA8上按键的值
键盘扫描函数u8 KEY_Scan(void)的程序设计思路如图4所示:
3.3 中断技术
STM32的每一个GPIO引脚都可以作为外部中断的中断输入口,都能配置成一个外部中断触发源。STM32把同一个序号的引脚组成一组,每组对应一个外部中断/事件源(即中断线)EXTIx(x:0~15),将众多中断触发源分成16组。本系统软件设计中,加速、减速、停止按键设置为中断源,即PA10、PA11、PA12引脚对应3个外部中断源,分别对应的中断线是EXTIx10~EXTIx12。
外部中断配置函数void exit_config(void)中主要代码如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //使能复用时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource10);//设置PA10~PA12为中断源
EXTI_Init(&EXTI_InitStructure);//外部中断初始化NVIC_Init(&NVIC_InitStructure);//中断优先级初始化在中断服务函数中,中断线EXTIx15~EXTIx10共用一个外部中断通道E XT I 15_10_I R Q n,同时也共用一个中断服务函数EXTI15_10_IRQHandler()。在中断服务函数中,判定是什么中断源。如果是停止中断,就不再加载脉冲;如果是加速中断,则减少加载的脉冲延时;如果是减速中断,则增加脉冲延时。
3.4 延时设计
STM32中有很多定时器,本文中的延时设计采用其中的滴答定时器(SysTick)。它是一个24位的系统节拍定时器,具有自动重装载和溢出中断功能,所有基于Cortex-M3的芯片都可以由此获得一定的时间间隔[2]。使用SysTick编写的代码移植到Cortex-M3内核的不同器件时,代码不需要进行修改。
滴答定时器初始化函数void delay_init( )主要设置如下:SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟作为SysTick时钟源
fac_us=SystemCoreClock/8000000;//72M/8000000=9,每微秒需要9个SysTick时钟周期
fac_ms=(u16)fac_us*1000; //每毫秒需要9000个SysTick时钟周期
Design of  Stepper Motor Motion Controller Based on STM32
XIONG Fang, LI Ai-min
(Department of  Electronic Information and Technology, Sichuan Modern Vocational College, Chengdu  Sichuan  610207)
Abstract:This paper is based on STM32F103R6, a 32-bit microcontroller with the kernel of Arm Cortex-M3, and it aims to control the stepper motor's states: the forward, reverse, acceleration, deceleration and stop. The relevant design utilizes the resources and technologies of STM32's GPIO port, interrupt and timer to make the hardware and software processing. The Keil software simulation and experiments verify that the design scheme is stable and feasible while operation indexes of the system also meet the design requirements.
Key words:STM32; stepper motor; motion control
写出微秒级、毫秒级延时函数,获得不同的延时,改变步进电机的速度。微秒级延时函数void delay_us(u32 nus)主要程序如下:
SysTick->LOAD=nus*fac_us;//设置重装载值SysTick->VAL=0x00; //当前数值寄存器清零
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//使能滴答定时器
do
{temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));//等待定时时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;//关闭使能
3.5 系统程序设计
系统程序主要包括各部分的初始化函数和电机正反转、停止状
态的选择。
int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);delay_init(); //初始化延时MOTOR_Init();//初始化电机KEY_Init();//初始化按键
exit_config();//初始化外部中断while(1)
{key=KEY_Scan();//键盘扫描switch(key)
case STEP_F:STEP_MOTOR_RUN(0);break;//正转case STEP_R:STEP_MOTOR_RUN(1);break;//反转case STEP_S:break;//停止  }}
四川现代3.6 步进电机加减速控制
为了克服步进电机失步和过冲现象,应采用与电机控制相适应的控制算法,即在启动和停止时实行加减速控制[3]。其实质是在速度变化过程中控制发送脉冲的频率实现速度的加减速。通常加减速算法主要有梯形曲线、指数曲线和S型曲线。
4 结语
本文针对步进电机,选用STM32F103R6芯片进行控制。利用了STM32的GPIO口、定时器、中断等资源和技术来完成,通过Keil软件进行仿真和在开发板上进行实验,实现了步进电机正转、反转、停止、加速、减速的运动控制。程序中如果加入S速度曲线或其它优化算法,可以减少步进电机启动和停止过程中的振动和失步现象,提高电机控制精度和平稳度。该设计简易、低成本、低功耗,便于应用。参考文献
[1] 周建寅,谢超,姜婷婷.基于STM32步进电机控制器的设计研究[J].现代商贸工业,2019(35):215-216.
[2] 王秋云,汪文,徐嘉琦,等.基于STM32的步进电机驱动控制器设计[J].山西电子技术,2020(1):7-9.
[3] 邱文轩,赵天宝.两相混合式步进电机调速与测试系统设计[J].电子世界,2019,564(6):201-202.
图4  键盘扫描程序流程图
Copyright©博看网 www.bookan. All Rights Reserved.