ARM实训报告
淮安信息职业技术学院(计算机与通信工程学院)
步进电机实训报告
一、 实训目的
1、了解步进电机的结果以及工作原理
2、掌握步进电机控制系统的设计方法及其调试方法
二、 实训设备
1、硬件:教学实验箱,pc机
2、软件:pc机操作系统Windows XP,ADT IDE集成开发环境
三、 实验内容
1、编写程序实现对步进电机的驱动
2、编写程序实现对步进电机的速度调整
四、 实训原理
1、 步进电机
步进电机是将电脉冲信号转换成角位移或线位移的开环控件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机就转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点,使得在速度、位置等控制领域使用步进电机来控制变得非常简单。
步进电机是一种能够将电脉冲信号转换成角位移或线位移的机电元件,它实际上是一种单相或多相同步电动机。单相步进电动机有单路电脉冲驱动,输出功率一般很小,其用途为微小功率驱动。多相步进电动机有多相方波脉冲驱动,用途很广。使用多相步进电动机时,单路电脉冲信号可先通过脉冲分配器转换为多相脉冲信号,在经功率放大后分别送入步进电动机各相绕组。每输入一个脉冲到脉冲分配器,电动机各相的通电状态就发生变化,转子会转过一定的角度(称为步距角)。正常情况下,步进电机转过的总角度和输入的脉冲数成正比;连续输入一定频率的脉冲时,电动机的转速与输入脉冲的频率保持严格的对应关系,不受电压波动和负载变化的影响。由于步进电动机能直接接收数字量的输入,所以特别适合于微机控制。此实训中用到的其他知识如下:
常用的步进电机
q 反应式步进电动机(VR):结构简单,生产成本低,步 距角可以做的相当小,但动态性能相对较差。
q 永磁式步进电动机(PM):出力大,动态性能好;但步距角一般比较大。
q 混合步进电动机(HB):综合了反映式和永磁式两者的 优点,步距角小,出力大,动态性能好,是性能较好的一类步进电动机。
半步模式
脉冲信号图:
脉冲分配信号:
整步模式
脉冲信号图:
脉冲分配信号:
步进电机驱动电路:
2、嵌入式GUI
图形用户系统是由显示模型接口程序、窗口模型接口程序和用户模型接口程序共同组成的。
3、触摸屏
触摸屏相关寄存器初始化;
void Touch_Init(void)
{
rADCDLY = (50000); // ADC Start or Interval Delay rADCTSC=(0<<8)|(1<<7)|(1<<6)|(0<<5)|(1<<4)|(0<<3)|(0<<2)|(3);
//tark Down,YM:GND,YP:AIN5,XM:Hi-z,XP:AIN7,XP pullup
// En,Normal,Waiting
//设置成为等待中断模式,disable int
rADCCON = (1<<14)|(39<<6)|(0<<3)|(0<<2)|(0<<1)|(0);
}
触摸屏控制器初始化,及其中断初始化
Touch_Init(),TouchINT_Init()
中断服务程序
Touch_ISR
坐标转换为像素坐标,保存状态坐标,(窗体事件调用处理)
GUI_TOUCH_Exec()
五、 实训流程
显示界面
主要程序的流程图
六、实训步骤
(一) 先选择一张图片作为界面的背景,然后利用画图软件使其转化 为 “.C”文件,并添加到此项目的文件夹中;
(二) 在背景图片上添加功能按钮,共有六个,分别开始、停止、正转、反转、加速、减速;
(三) 编写界面上的显示姓名、学号
(四) 分别编写能够控制步进电机正转、反转、加速、减速四个功能 的代码;
(五) 调试运行。
七、实训主要程序
#include"gui.h"
#include "FRAMEWIN.h"
#include "button"
#include "teeth"//头文件
extern GUI_CONST_STORAGE GUI_BITMAP bm789;//图片
int fan=0;//定义变量
#define GUI_ID_OK1 0x801
#define GUI_ID_OK2 0x802
#define GUI_ID_OK3 0x803
#define GUI_ID_OK4 0x804
#define GUI_ID_OK5 0x805
unsigned char tab[]={0x05,0x09,0x0a,0x06};//正转脉冲
unsigned char tab1[]={0x06,0x0a,0x09,0x05};//反转脉冲
unsigned char row=0;
void _cbControl(WM_MESSAGE *pMsg)
{
int NCode, Id;
switch (pMsg->MsgId)
{
case WM_NOTIFY_PARENT:
Id = WM_GetId(pMsg->hWinSrc);
NCode = pMsg->Data.v;
switch (NCode)
{
case WM_NOTIFICATION_RELEASED:
if(Id == GUI_ID_OK)
{
fan=0;
//GUI_DEBUG_LOG("开始\n");//测试
}
if(Id == GUI_ID_OK1)
{
fan=1;
//GUI_DEBUG_LOG("停止\n");
}
if(Id == GUI_ID_OK2)
{
fan=2;
//GUI_DEBUG_LOG("正转\n");
}
if(Id == GUI_ID_OK3)
{
fan=3;
//GUI_DEBUG_LOG("反转\n");
}
if(Id == GUI_ID_OK4)
{
fan=4;
//GUI_DEBUG_LOG("加速\n");
}
if(Id == GUI_ID_OK5)
{
fan=5;
//GUI_DEBUG_LOG("减速\n");
}
break;
}
break;
}
WM_DefaultProc(pMsg);
}
void delay(int t)
{
int i,j;
for(i=t;i>0;i--)
for(j=100000;j>0;j--);
}
void Main(void *pdata)
{
char k;
WM_HWIN hf;
BUTTON_Handle hb,hb1,hb2,hb3,hb4,hb5,hb6;//定义
TEXT_Handle hb0;
Target_Init();
GUI_Init();//驱动初始化
GUI_DrawBitmap(&bm789,0,0);//画图
hf=WM_CreateWindowAsChild(0,0,640,480,WM_HBKWIN,WM_CF_SHOW,&_cbControl,0);
//(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, const char * s, int Align);
hb0=TEXT_CreateAsChild(0,10,640,30,hf,GUI_ID_OK,
WM_CF_SHOW,0,TEXT_CF_HCENTER);
hb1= TEXT_CreateAsChild(0,40,640,60,hf,GUI_ID_OK,
WM_CF_SHOW,0,TEXT_CF_HCENTER);
TEXT_SetText(hb0," 远程控制电机 ");
TEXT_SetFont(hb0,&GUI_FontHZ_Song_16);
TEXT_SetTextColor(hb0,GUI_YELLOW);
TEXT_SetText(hb1," 35011203 刘娜 35011109 李佳");
TEXT_SetFont(hb1,&GUI_FontHZ_Song_16);
TEXT_SetTextColor(hb1,GUI_YELLOW);
hb= BUTTON_CreateAsChild(240,200,80,30,hf,GUI_ID_OK,WM_CF_SHOW);
BUTTON_SetFont (hb,&GUI_FontHZ_Song_16);
BUTTON_SetText(hb,"开 始");
hb1= BUTTON_CreateAsChild (340, 200, 80, 30, hf, GUI_ID_OK1, WM_CF_SHOW);
BUTTON_SetFont(hb1,&GUI_FontHZ_Song_16);
BUTTON_SetText(hb1,"停 止");
hb2= BUTTON_CreateAsChild(290,250,80,30,hf,GUI_ID_OK1,WM_CF_SHOW);
BUTTON_SetFont(hb2,&GUI_FontHZ_Song_16);
BUTTON_SetText(hb2,"正 转");
hb3= BUTTON_CreateAsChild(290,300,80, 30,hf,GUI_ID_OK1,WM_CF_SHOW);
BUTTON_SetFont(hb3,&GUI_FontHZ_Song_16);
BUTTON_SetText(hb3,"反 转");
hb4= BUTTON_CreateAsChild(290,350,80,30,hf,GUI_ID_OK1,WM_CF_SHOW);
BUTTON_SetFont(hb4,&GUI_FontHZ_Song_16);
BUTTON_SetText(hb4,"加 速");
hb5= BUTTON_CreateAsChild(290,400,80,30,hf,GUI_ID_OK1,WM_CF_SHOW);
BUTTON_SetFont(hb5,&GUI_FontHZ_Song_16);
BUTTON_SetText(hb5,"减 速");
while(1)
{
switch(fan)
{
case 0://开始 设置为正转
if(row==4) row=0;
(*(volatile unsigned char *)0x28000006)=tab[row++];
if(row==4) row=0;
delay(10);break;
case 1://停止
break;
case 2://正转
if(row==4) row=0;
(*(volatile unsigned char *)0x28000006)=tab[row++];
if(row==4) row=0;
delay(10);break;
case 3: //反转
if(row==4)row=0;
(*(volatile unsigned char *)0x28000006)=tab1[row++];
if(row==4)row=0;
delay(10);break;
case 4://正转减速
if(row==4) row=0;
(*(volatile unsigned char *)0x28000006)=tab[row++];
if(row==4) row=0;
delay(30);break;
case 5://反转加速
if(row==4)row=0;
(*(volatile unsigned char *)0x28000006)=tab1[row++];
if(row==4)row=0;
delay(7);break;
default: break;
}
GUI_Exec();
}
}
八、调试过程
1、delay(m)中m太小,延迟时间不够,导致步进电机运行时不确定,有时很慢,有时很快眼睛看不清楚;
2、调试时出现许多错误,原因是引用的头文件没加;
3、有时候忘记定义变量,编译时也会出现错误;
4、BUTTON_SetFont(hb1,&GUI_FontHZ_Song_16);字体不对应的错误
九、实训小结
通过这一周的实训,给我感觉很充实,学到了比平时更多的东西,也觉得时间过的太快了,一下就过去,回顾这一周,给我很大的启发。 我们本来是要做贪吃蛇这个小游戏的,从网上找了许多的资料,也分析了贪吃蛇这个游戏的运行过程,可惜不会将代码转化成ARM环境能够运行的代码,所以就改做控制步进电机的实验了。做完步进电机这个实训任务,使我对课本上关于步进电机的结构的知识有了更加深刻的理解,而且对其用法掌握得更加熟练。在实训的过程中,不断地发现问题,并想办法解决,因此提高了我自己解决问题的能力。在编写程序方面,我对ARM编程结构和技巧也有了深刻的理解和领会。还有让我明白了流程图的重要性,以前在编程的时候,我一般不写流程图,直接开始写程序,这样出现了不该出现的问题。但这次实训过程中,根据老师的提示我试着先画出流程图然后按照流程图编写程序,结果错误少了很多,即使有错误只要根据流程图一查就知道错在哪里,这让我节省了大量的时间和精力。所以我认识到,以后要编写程序时,先写流程图是很有必要的。不仅节约时间,而且能够使代码的结构很清晰。
总体来说我感觉这一周的时训我收获很多,以前在调试代码
时一出现错误就很烦躁,,有时候被些问题困惑了很久,后来老
师叫我们如何改错,我才恍然大悟,原来只要换个方式思考问题就能想到很好的方法,并且在改错中学到了许多。非常感谢老师的帮助。