基于arm的步进电机控制系统开发学位论文Word下载.docx
《基于arm的步进电机控制系统开发学位论文Word下载.docx》由会员分享,可在线阅读,更多相关《基于arm的步进电机控制系统开发学位论文Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
因此步进电动机是一种把脉冲变为角度位移(或直线位移)的执行元件。
它有两个工作:
其一是传递转矩,其二是传递信息。
步进电动机的转子为多极分布,定子上嵌有多相星形连接的控制绕组,由专门电源输入电脉冲信号,每输入一个脉冲信号,步进电动机的转子就前进一步。
由于输入的是脉冲信号,输出的角位移是断续的,所以又称为脉冲电动机。
随着数字控制系统的发展,步进电动机的应用将逐渐扩大。
步进电动机的种类很多,按结构可分为反应式和激励式两种;
按相数分则可分为单相、两相和多相三种。
摘要
嵌入式系统(Embeddedsystem)是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,根据英国电器工程师协会的定义,嵌入式系统为控制,监视或辅助设备,机器或用于工厂运作的设备。
与个人计算机这样的通用计算机系统不同,嵌入式系统通常执行的是带有特定要求的预先定义的任务。
嵌入式系统的核心是由一个或几个预先编程好以用来执行少数几项任务的微处理器或者单片机组成,与通用计算机能够运行用户选择的软件不同,嵌入式系统上的软件通常是暂时不变的,所以经常称为“固件”。
本文的主要工作是基于STM32步进电机控制系统的设计,随着越来越多的高科技产品逐渐融入到日常生活中,步进电机控制系统发生了巨大的变化。
单片机,C语言等前沿学科的技术日趋成熟与实用化,使得步进电机的控制系统有了新的研究方向与意义。
本文描述了一个由STM32微处理器,步进电机,键盘等模块构成的,该系统采用STM32微处理器为核心,在MDK的环境下进行编程,根据键盘上不同按键的按下产生信号,用此信号对步进电机的速度,启停及转动方向进行控制,并通过LED显示出数据。
关键词:
嵌入式STM32步进电机
1系统的总体设计方案
1.1步进电机单八拍通电方式的工作原理
设A相首先通电,转子齿与定子A、A′对齐。
然后在A相继续通电的情况下接通B相。
这时定子B、B′极对转子齿2、4产生磁拉力,使转子顺时针方向转动,但是A、A′极继续拉住齿1、3,因此,转子转到两个磁拉力平衡为止。
这时转子顺时针转过了11.25°
。
接着A相断电,B相继续通电。
这时转子齿2、4和定子B、B′极对齐,转子的位置又转过11.25°
这样,如果按A→B→C→D→A…的顺序轮流通电,则转子便顺时针方向一步一步地转动,步距角11.25°
电流换接八次,磁场旋转一周,转子前进了一个齿距角。
如果按D→C→B→A…的顺序通电,则电机转子逆时针方向转动。
这种通电方式称为四拍方式。
图1
1.2总体设计思路
本文主要利用STM32芯片对步进电机的启停.正反转及转速的控制,通过对该芯片的GPIO口进行设置,使其与辅助按键相对应,步进电机还需要加外部驱动电路对其进行驱动,从而实现按按键来控制电机的转速。
图2
2GPIO的设置
2.1GPIO口的应用
函数GPIO_Init的具体实现在库文件“stm32f10x_gpio.c”中,其作用是定义各个通用IO端口的模式,对应到外设的输入/输出功能有以下三种情况:
(1)外设对应的引脚为输入:
则根据外围电路的配置可以选择浮空输入.带上拉输入或带下拉输入。
(2)ADC对应的引脚:
配置引脚为模拟输入。
(3)外设对应的引脚为输出:
需要根据外围电路的配置选择对应的引脚为复用功能的推挽输出或复用功能的开漏输出。
如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。
将引脚配置成复用输出功能后,如果外设没有被激活,它的输出将不确定。
2.2STM32中GPIO的功能
(1)最基本的功能是可以驱动LED.产生PWM.驱动蜂鸣器等。
(2)具有单独的位设置或位清楚,编程简单。
(3)具有外部中断/唤醒能力,端口配置成输入模式时,具有外部中断能力。
(4)具有复用功能,复用功能的端口兼有I/O功能等。
(5)GPIO口的配置具有锁定机制,当配置好GPIO口后,在一个端口位上执行了锁定,可以通过程序锁住配置组合,在下一次复位之前,将不能再更改端口位的配置。
2.3GPIO端口的配置
步进电机有四相,分别定义为A.B.C.D,它们均为高电平无效,低电平有效,在不同时刻送入对应电平,使四个相以A_B_C_D的顺序供电,实现步进电机的正转,以D_C_B_A的顺序供电实现反转。
各个按键对应的GPIO口如下图所示,其中S1为启动,S2为停止,S3为正转,S4为反转,S5为加速,S6为减速。
图3
下面是GPIO口的端口配置程序
#include"
key_led.h"
*函数名:
LED_GPIO_Config
*描述:
配置LED端口为推挽输出
*输入:
无
*输出:
voidLED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDefGPIO_InitStructure;
/*开启GPIOC的外设时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
/*选择要控制的GPIOC引脚*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz*/
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
/*调用库函数,初始化GPIOC*/
GPIO_Init(GPIOC,&
GPIO_InitStructure);
}
KEY_GPIO_Config
配置按键端口为下拉输入
voidKEY_GPIO_Config(void)
{
/*开启GPIOA的外设时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/*选择要控制的GPIOA引脚*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
/*调用库函数,初始化GPIOA*/
GPIO_Init(GPIOA,&
/*开启GPIOD的外设时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
/*选择要控制的GPIOD引脚*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
/*调用库函数,初始化GPIOD*/
GPIO_Init(GPIOD,&
#ifndef__KEY_LED_H
#define__KEY_LED_H
stm32f10x.h"
/******************************************************/
//LED宏定义
#defineA_OFFGPIO_ResetBits(GPIOC,GPIO_Pin_12)
#defineA_ONGPIO_SetBits(GPIOC,GPIO_Pin_12)
#defineB_OFFGPIO_ResetBits(GPIOC,GPIO_Pin_13)
#defineB_ONGPIO_SetBits(GPIOC,GPIO_Pin_13)
#defineC_OFFGPIO_ResetBits(GPIOC,GPIO_Pin_14)
#defineC_ONGPIO_SetBits(GPIOC,GPIO_Pin_14)
#defineD_OFFGPIO_ResetBits(GPIOC,GPIO_Pin_15)
#defineD_ONGPIO_SetBits(GPIOC,GPIO_Pin_15)
//KEY宏定义
#defineKEY1_VALUEGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
#defineKEY2_VALUEGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)
#defineKEY3_VALUEGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
#defineKEY4_VALUEGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)
#defineKEY5_VALUEGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)
#defineKEY6_VALUEGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
voidLED_GPIO_Config(void);
voidKEY_GPIO_Config(void);
#endif/*__KEY_LED2_H*/
3系统的延时函数
delay.h"
*函数名:
Delay_nus(int16)
微秒级延时n<
32767
#include"
voidDelay_nus(u16n)
{
u16j;
while(n--)
{
j=8;
while(j--);
}
Delay_nms(int16)
毫秒级延时n<
voidDelay_nms(u16n)
{if(KEY2_VALUE==0)
n=n-100;
if(KEY3_VALUE==0)
n=n+100;
while(n>
0)
{n--;
Delay_nus(1100);
4电机的驱动电路
由于信号实验板上的电源较弱,带动不了电机,因此需加驱动电路。
本驱动电路采用四个S8050三极管对信号进行放大,获取相应的驱动信号对步进电机进行驱动。
图4
参考文献
[1]梅遂生、杨家德.光电子技术—信息装备的新秀[M].北京:
国防工业出版社.1999年.88-102
[2]陆坤、奚大顺、李之权等.电子设计技术[M].四川:
电子科技大学出版社.1997年.682-688,838-941
[3]谢自美、阎树兰、赵云娣等.电子线路设计·
实验·
测试(第二版)[M].湖北:
华中理工大学出版社.2000年.293-300
[4]杨邦文.新型实用电路制作200例[M].北京:
人民邮电出版社.1998年.175-288
[5]宋春荣、刘芳芳、杨礼成等.通用集成电路速查手册[M].山东:
山东科学技术出版社.1995年.30-107
[6]赵俊超.集成电路设计VHDL教程(第一版)[M].北京:
北京希望电子出版社.2002年
[7]潘松、黄继业等.EDA技术实用教程(第一版)[M].科学出版社2002年10月
[8]张金泉一种新型民用防火防盗报警器的研制.燕山大学学报,2000,24
(1):
71-73
[9]邓凯.智能化住宅安防系统的应用.冶金矿山设计与建设,2000,32(3):
47-48
[10]吕俊芳,潘军,陈巍.光电感烟火灾探测器的电路设计.航空计测技术,1999
[11]王殊,窦征.一氧化碳、光电感烟和感温三复合火灾探测器.消防技术产品信息,2000,
[12]多传感元件火灾探测技术.消防技术与产品信息,1997,
(1):
42-44
[13]尹长松.光散射在烟尘探测中的应用.光散射学报,1996,8
(1):
42-45
[14]国家标准局.点型感烟火灾探测器技术要求及实验方法(GB4715-84).1985
[15]张毅刚,彭喜源,谭晓的.MCS-51单片机应用设计.第二版.哈尔滨:
哈尔滨工业大学出版社,1997:
8-22
[16]杨峰,柳永胜,殷小贡.新型DTMF信号收/发芯片MT8888及其应用.现代电子1998,(9):
1-4
[17]龙可微.X25045芯片及其应用.电子技术应用,1999,(9):
70-72
附录
1.主程序
/*类型声明------------------------------------------------------------------*/
/*宏定义--------------------------------------------------------------------*/
/*变量----------------------------------------------------------------------*/
voidLED_INVERTED_ORDER(void);
voidLED_IS_TURN(void);
/*函数声明------------------------------------------------------------------*/
/*函数功能------------------------------------------------------------------*/
*@函数名称main
*@函数说明主函数
*@输入参数无
*@输出参数无
*@返回参数无
u16sj=0;
u8zheng=2;
u16qiting=100;
intmain(void)
LED_GPIO_Config();
KEY_GPIO_Config();
A_OFF;
B_OFF;
C_OFF;
D_OFF;
qiting=2;
zheng=2;
sj=100;
while
(1)
if(KEY1_VALUE==0)
{
qiting=1;
}
while(qiting==1)
if(KEY2_VALUE==0)
{qiting=0;
if(KEY3_VALUE==0)
{zheng=1;
}
if(zheng==1)
{sj=1000;
LED_IS_TURN();
}
if(KEY4_VALUE==0)
{zheng=0;
}
if(zheng==0)
LED_INVERTED_ORDER();
}
}}
LED_IS_TURN
LED1-LED2-LED3-LED1正转
*/
voidLED_IS_TURN(void)
{
while(zheng==1)
{if(KEY2_VALUE==0)
{zheng=3;
if(KEY4_VALUE==0)
if(KEY5_VALUE==0)
{
sj=sj-100;
}
if(KEY6_VALUE==0)
sj=sj+10;
A_ON;
Delay_nms(sj);
A_OFF;
B_ON;
B_OFF;
C_ON;
C_OFF;
D_ON;
D_OFF;
}
LED_INVERTED_ORDER
LED3-LED2-LED1-LED3正转
voidLED_INVERTED_ORDER(void)
{while(zheng==0)
if(KEY2_VALUE==0)
{zheng=3;
if(KEY3_VALUE==0)
{zheng=1;
if(KEY5_VALUE==0)
if(KEY6_VALUE==0)
sj=sj+100;
Delay_nms(sj);
2.总体原理图