资源描述
《嵌入式系统》课程设计报告
(基于ARM的步进电机控制系统)
院 系: 机电学院
学生姓名:
专 业: 应用电子技术教育
班 级:
指导教师: 田丰庆 付广春
完成时间: 2013年3月28日
目录
前言 ·························································1
摘要 ························································1
1 系统总体方案设计···········································2
1.1步进电机单八拍通电方式工作原理 ·····················2
1.2总体设计思路········································3
2 GPIO口的设置···············································3
2.1 GPIO端口的应用·····································3
2.2 STM32中GPIO端口的功能·····························4
2.3 GPIO端口的配置 ····································4
3 系统的延时函数 ············································错误!未定义书签。
4 电机的驱动电路 ···········································8
参考文献 ·····················································9
附录1 主程序 ··············································10
附录2 总体原理图···········································13
前言
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
摘要
嵌入式系统(Embedded system)是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,根据英国电器工程师协会的定义,嵌入式系统为控制,监视或辅助设备,机器或用于工厂运作的设备。与个人计算机这样的通用计算机系统不同,嵌入式系统通常执行的是带有特定要求的预先定义的任务。嵌入式系统的核心是由一个或几个预先编程好以用来执行少数几项任务的微处理器或者单片机组成,与通用计算机能够运行用户选择的软件不同,嵌入式系统上的软件通常是暂时不变的,所以经常称为“固件”。
本文的主要工作是基于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
2 GPIO的设置
2.1 GPIO口的应用
函数GPIO_Init的具体实现在库文件“stm32f10x_gpio.c”中,其作用是定义各个通用IO端口的模式,对应到外设的输入/输出功能有以下三种情况:
(1) 外设对应的引脚为输入:则根据外围电路的配置可以选择浮空输入.带上拉输入或带下拉输入。
(2) ADC对应的引脚:配置引脚为模拟输入。
(3) 外设对应的引脚为输出:需要根据外围电路的配置选择对应的引脚为复用功能的推挽输出或复用功能的开漏输出。如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。将引脚配置成复用输出功能后,如果外设没有被激活,它的输出将不确定。
2.2 STM32中GPIO 的功能
(1)最基本的功能是可以驱动LED.产生PWM.驱动蜂鸣器等。
(2)具有单独的位设置或位清楚,编程简单。
(3)具有外部中断/唤醒能力,端口配置成输入模式时,具有外部中断能力。
(4)具有复用功能,复用功能的端口兼有I/O功能等。
(5)GPIO 口的配置具有锁定机制,当配置好GPIO口后,在一个端口位上执行了锁定,可以通过程序锁住配置组合,在下一次复位之前,将不能再更改端口位的配置。
2.3 GPIO端口的配置
步进电机有四相,分别定义为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端口为推挽输出
* 输入 :无
* 输出 :无
void LED_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_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
* 描述 :配置按键端口为下拉输入
* 输入 :无
* 输出 :无
void KEY_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启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;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIOA*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*开启GPIOD的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE);
/*选择要控制的GPIOD引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIOD*/
GPIO_Init(GPIOD, &GPIO_InitStructure);
#ifndef __KEY_LED_H
#define __KEY_LED_H
#ifndef __KEY_LED_H
#define __KEY_LED_H
#include "stm32f10x.h"
/******************************************************/
// LED宏定义
#define A_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_12)
#define A_ON GPIO_SetBits(GPIOC,GPIO_Pin_12)
#define B_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_13)
#define B_ON GPIO_SetBits(GPIOC,GPIO_Pin_13)
#define C_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_14)
#define C_ON GPIO_SetBits(GPIOC,GPIO_Pin_14)
#define D_OFF GPIO_ResetBits(GPIOC,GPIO_Pin_15)
#define D_ON GPIO_SetBits(GPIOC,GPIO_Pin_15)
/******************************************************/
// KEY宏定义
#define KEY1_VALUE GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)
#define KEY2_VALUE GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)
#define KEY3_VALUE GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
#define KEY4_VALUE GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)
#define KEY5_VALUE GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5)
#define KEY6_VALUE GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
/******************************************************/
void LED_GPIO_Config(void);
void KEY_GPIO_Config(void);
#endif /* __KEY_LED2_H */
3 系统的延时函数
#include "delay.h"
* 函数名:Delay_nus(int16)
* 描述 :微秒级延时 n<32767
* 输入 :无
* 输出 :无
#include "key_led.h"
void Delay_nus(u16 n)
{
u16 j;
while(n--)
{
j=8;
while(j--);
}
}
* 函数名:Delay_nms(int16)
* 描述 :毫秒级延时 n<32767
* 输入 :无
* 输出 :无
void Delay_nms(u16 n)
{ 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.主程序
#include "stm32f10x.h"
#include "key_led.h"
#include "delay.h"
/* 类型声明 ------------------------------------------------------------------*/
/* 宏定义 --------------------------------------------------------------------*/
/* 变量 ----------------------------------------------------------------------*/
void LED_INVERTED_ORDER(void);
void LED_IS_TURN(void);
/* 函数声明 ------------------------------------------------------------------*/
/* 函数功能 ------------------------------------------------------------------*/
* @函数名称 main
* @函数说明 主函数
* @输入参数 无
* @输出参数 无
* @返回参数 无
u16 sj=0;
u8 zheng=2;
u16 qiting=100;
int main(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)
{ sj=1000;
LED_INVERTED_ORDER();
}
} }
}
* 函数名:LED_IS_TURN
* 描述 :LED1-LED2-LED3-LED1正转
* 输入 :无
* 输出 :无
*/
void LED_IS_TURN(void)
{
while(zheng==1)
{ if(KEY2_VALUE==0)
{ zheng=3; }
if(KEY4_VALUE==0)
{ zheng=0; }
if(KEY5_VALUE==0)
{
sj=sj-100;
}
if(KEY6_VALUE==0)
sj=sj+10;
A_ON;
Delay_nms(sj);
A_OFF;
Delay_nms(sj);
B_ON;
Delay_nms(sj);
B_OFF;
Delay_nms(sj);
C_ON;
Delay_nms(sj);
C_OFF;
Delay_nms(sj);
D_ON;
Delay_nms(sj);
D_OFF;
Delay_nms(sj);
}
}
* 函数名:LED_INVERTED_ORDER
* 描述 :LED3-LED2-LED1-LED3正转
* 输入 :无
* 输出 :无
void LED_INVERTED_ORDER(void)
{ while(zheng==0)
{
if(KEY2_VALUE==0)
{ zheng=3; }
if(KEY3_VALUE==0)
{ zheng=1; }
if(KEY5_VALUE==0)
{
sj=sj-100;
}
if(KEY6_VALUE==0)
{
sj=sj+100;
}
D_ON;
Delay_nms(sj);
D_OFF;
Delay_nms(sj);
C_ON;
Delay_nms(sj);
C_OFF;
Delay_nms(sj);
B_ON;
Delay_nms(sj);
B_OFF;
Delay_nms(sj);
A_ON;
Delay_nms(sj);
A_OFF;
Delay_nms(sj);
}
}
2.总体原理图
13
展开阅读全文