实验一直流步进电机综合控制系统设计实验.docx
- 文档编号:23588550
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:22
- 大小:632.62KB
实验一直流步进电机综合控制系统设计实验.docx
《实验一直流步进电机综合控制系统设计实验.docx》由会员分享,可在线阅读,更多相关《实验一直流步进电机综合控制系统设计实验.docx(22页珍藏版)》请在冰豆网上搜索。
实验一直流步进电机综合控制系统设计实验
嵌入式综合实验报告
学院:
信息工程学院
专业班级:
中兴通信111班
姓名:
李巧
学号:
6100211199
嵌入式实验报告
学生姓名:
李巧学号:
6100211199专业班级:
中兴通信111班
实验类型:
□验证■综合□设计□创新实验日期:
2013年3月19日实验成绩:
实验一直流、步进电机综合控制系统设计实验
1、实验项目名称
直流、步进电机综合控制系统设计
2、实验目的
1、实现四个LED灯按照十六进制的规则依次亮灭;
2、在超级终端上输入两个两位数,实现两位数的加减乘除并显示运算结果;
3、显示当前的年月日、星期、时分秒;
4、实现步进电机的调速和正反转;可用旋转按钮W1或按键控制调速,在超级终端和数码管上同步显示其正反转和转速信息;
5、实现直流电机的调速和正反转;可用旋转按钮W2或按键控制调速,在超级终端和数码管上同步显示其正反转和转速信息;
6、利用IIC通信,实现EEPROM的读写;在超级终端上显示地址和数据。
三、实验基本原理
1、S3C2410A具有117个通用I/O口,分为A—H等8个端口,由于每个I/O口都有第2功能,甚至第3功能,所以需要通过设置GPxCON寄存器来选择GPx口I/O口功能,其中x可以为A、B、C、D、E、F、G表示相应的I/O端口。
当I/O口设置为GPIO输出模式(Output模式)时,可以通过写GPxDAT控制相应I/O口输出高电平或低电平,GPxDAT为1的位对应I/O输出高电平,为0的位对应输出低电平。
2、工程模板中包含有串口软件包UART.C,用户可以调用相应的接口函数进行串口数据发送和接收,串口的波特率需要在config.h文件中进行设置,本实验使用默认的115200波特率。
设置UCON0寄存器时,要设置串口工作模式为查询模式,即UCON[3:
0]应为0101b。
3、LED_OnebyOne:
实现四个LED灯按照十六进制的规则依次亮灭;由实验箱的硬件结构电路原理图可知:
LED1的亮灭由GPE11控制,LED2的亮灭由GPE12控制,LED3的亮灭由GPH4控制,LED4的亮灭由GPH6控制。
使用以下几条语句控制LED灯按照十六进制的规则依次亮灭:
voidLED_DispNum(uint32dat)
{
dat=dat&0x0000000F;//参数过滤
//控制LED4、LED3显示(d3、d2位)
if(dat&0x08)rGPHDAT=rGPHDAT|(0x01<<6);
elserGPHDAT=rGPHDAT&(~(0x01<<6));
if(dat&0x04)rGPHDAT=rGPHDAT|(0x01<<4);
elserGPHDAT=rGPHDAT&(~(0x01<<4));
//控制LED2、LED1显示(d1、d0位)
rGPEDAT=(rGPEDAT&(~(0x03<<11)))|((dat&0x03)<<11);
}
4、Addsubmuldiv_Test:
对串口进行初始化,首先设置相应的I/O为TXD0、RXD0功能引脚,然后通过ULCON0寄存器设置串口数据格式,通过UCON0寄存器设置串口工作模式,最后通过UBRDIV0来设置通讯波特率。
在UART通讯试验的基础上,用C编程实现实现两位数的加减乘除,然后将运算过程及结果显示在超级终端上。
a=UART_GetKey();
UART_SendByte(a);
b=UART_GetKey();
UART_SendByte(b);
c=UART_GetKey();
UART_SendByte(c);
d=UART_GetKey();
UART_SendByte(d);
5、RTC能够提供时分秒,年月日的计时功能,还具备定时报警功
RTC单元使用后备电池供电,独立的时钟源(32.768khz)。
读取RTC需要先对其进行设置。
对其相关的有RTCCON,BCDYEAR,BCDMON,BCDDATE,BCDHOUR,BCDMON,BCDSECORD,BCDDAY.寄存器。
如下面的代码
x=UART_GetKey();y=UART_GetKey();//接收字符
UART_SendByte(x);UART_SendByte(y);//发送字符
rBCDYEAR=(x-0x30)*16+(y-0x30);//设置年
rBCDMON=(x-0x30)*16+(y-0x30);//设置月
rBCDDATE=(x-0x30)*16+(y-0x30);//设置日
rBCDDAY=x-0x30;//设置星期
rBCDHOUR=(x-0x30)*16+(y-0x30);//设置时
rBCDMIN=(x-0x30)*16+(y-0x30);//设置分
rBCDSEC=(x-0x30)*16+(y-0x30);//设置秒
6、步进电机是将电脉冲转化为角位移的数据控制电机,电机步距18度,四相控制(AB-BC-CD-DA-AB)[正转](AB-DA-CD-BC-AB)[反转]。
GPIOSET(MOTOA);GPIOSET(MOTOB);
DelayNS(dly);
GPIOCLR(MOTOA);GPIOCLR(MOTOB);
GPIOSET(MOTOB);GPIOSET(MOTOC);
DelayNS(dly);
GPIOCLR(MOTOB);GPIOCLR(MOTOC);
GPIOSET(MOTOC);GPIOSET(MOTOD);
DelayNS(dly);
GPIOCLR(MOTOC);GPIOCLR(MOTOD);
GPIOSET(MOTOD);GPIOSET(MOTOA);
DelayNS(dly);
GPIOCLR(MOTOD);GPIOCLR(MOTOA);
7、直流电机的控制相对较为简单。
调节PWM的分频,占空比等改变PWM的输出,最终实现电机的调速。
根据电路图可以,当TOUT0为低电平的时候,电机反转或者停机;当TOUT0为高电平的时候,电机反转,正转,停机。
//设置GPH9为GPIO输出模式
rGPHCON=(rGPHCON&(~(0x03<<18)))|(0x01<<18);//GPH9口
rGPHDAT=rGPHDAT|(1<<9);//输出0电平
rGPHUP=rGPHUP|(1<<9);//设置GPH9为GPIO输出模式
rGPHCON=(rGPHCON&(~(0x03<<18)))|(0x01<<18);//GPH9口
rGPHDAT=rGPHDAT|(1<<9);//输出0电平
rGPHUP=rGPHUP|(1<<9);
adc0=ReadAdc(0);
vin0=adc0/4;//160
if(vin0>254)vin0=254;
rTCMPB0=vin0;
8、S3C2410A具有一个硬件I/O接口,可以配置为主发送、主接收、从发送和从接收等4种工作模式。
I/O接口包含4个寄存器,控制寄存器IICCON用于设置IIC总线时钟和中断(标志)使能,还有一位中断标志位;状态寄存器IICSTAT除了指示当前IIC总线状态外,还有2位IIC操作模式控制位和总线启动/结束控制位;数据寄存器IICDS用来发送数据或接收数据;从机地址寄存器IICADD用来保存S3C2410A作从机时的器件地址。
对IIC接口进行初始化时,首先要设置相应的I/O为IICSDA、IICSCL功能引脚,然后通过对IICCON寄存器来设置IIC总线时钟,并使能IIC中断(标志),通过IICSTAT寄存器来设置IIC接口为主发送模式。
9、外部中断:
设置GPF4引脚为外部中断EINT4功能,下降沿触发方式。
初始化S3C2410A中断控制器,设置EINT4为IRQ中断,并使能中断允许。
初始化完成后,等待外部中断产生。
4、主要仪器设备及耗材
1、硬件:
PC机一台,MagicARM2410教学实验开发平台一套
2、软件:
Windows98/XP/2000系统,ADS1.2集成开发环境
五、实验步骤
1、安装WigglerJTAG仿真器并打开;
2、运行超级终端,新建一个连接;
2、启动ADS1.2,建立工程,在src组中的main.c中编写主程序代码;
3、选用DebugRel生成目标,编译链接工程,选择【Debug】,进行JTAG仿真;
4、按照超级终端上的提示信息操作;
5、根据实验箱及超级终端上的反馈结果调试程序。
六、实验数据及处理结果
1、选择Debug进行JTAG仿真后进入选择操作情况界面选择
2.
在选择操作情况界面选择4,可看到实验箱上4个LED灯按16进制数闪亮,最左边的灯为最低位,最右边的灯为最高位。
(选择123功能时依次实现全亮、全灭、流水灯)
3.输入6,可观察到能实现两位数的加减乘除。
a.两位数相加
b.两位数相减
C.两个数相乘
d.两个数相除
对于加法,两个两位数的和最多是三位,设置三个加法子函数分别显示和的百位、十位和个位;对于减法,两个两位数的差最多两位,所以设置两个减法子函数分别显示差的十位和个位,在做减法之前,先判断被减数和减数的大小,当减数大的时候在差的最前面添加一个负号;对于乘法,两个两位数的积最多是四位,因此设置四个乘法子函数分别显示乘积的千位、百位、十位和个位;对于除法,两个两位数相除最多产生两位数的商和两位数的余数,因此设置四个除法子函数,其中两个分别显示商的十位和个位,另外两个显示余数的十位和个位。
4.按下按键7,显示如下
5.输入8,观察步进电机的转动情况.
6.输入9,观察直流电机的转动情况
7.输入b,观察LED的动态变化情况
附录:
实验主程序
**Modifiedby:
**Modifieddate:
**Version:
**Description:
*******************************************************************************
#include"config.h"
#include"main.h"
//功能测试选择数组
charselect_test[][50]=
{
"\n\nPleaseinput1~10toselecttest:
\n",
"1LED_DispAllOn\n",
"2LED_DispAllOff\n",
"3LED_OnebyOne\n",
"4LED_DispNume\n",
"5EINT_Test\n",
"6Addsubmuldiv_Test\n",
"7Dateweektime_Display\n",
"8StepMOTO_Test\n",
"9DCMOTO_Test\n",
"Pleaseinputanumyouwanttotest:
"
};
/******************************************************************************
**Functionname:
DelayNS
**Descriptions:
长软件延时。
**延时时间与系统时钟有关。
**Input:
dly延时参数,值越大,延时越久
**-------------------------------------------------------------------------------------------------------
**Modifiedby:
**ModifiedDate:
**------------------------------------------------------------------------------------------------------
******************************************************************************/
voidDelayNS(uint32dly)
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
//串口接收字符临时变量
/*********************************************************************************************************
**Functionname:
fun_tes
**Descriptions:
**Input:
无
**Output:
**Createdby:
**CreatedDate:
**-------------------------------------------------------------------------------------------------------
**Modifiedby:
**ModifiedDate:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
voidfun_test(void)
{
inti=0;
for(i=0;i<14;i++)
UART_SendStr(select_test[i]);
}
/*********************************************************************************************************
**Functionname:
main
**Descriptions:
主函数
**Input:
无
**Output:
向系统返回1
**-------------------------------------------------------------------------------------------------------
**Modifiedby:
**ModifiedDate:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
intmain(void)
{
uint8g_getch;
inti=0;
UART_Select(0);//选择UART0
UART_Init();//UART0初始化
LED_init();//LED相关初始化
EINT_init();//外部中断初始化
while
(1)
{
fun_test();
switch(g_getch=UART_GetKey())
{
case'1':
{
UART_SendByte(g_getch);
UART_SendStr("\n");
LED_DispAllOn();//LED灯全亮
DelayNS(10);
UART_SendStr("\nTestLED_DispAllOnisOver!
\n");
break;
}
case'2':
{
UART_SendByte(g_getch);
UART_SendStr("\n");
LED_DispAllOff();//LED灯全灭
DelayNS(10);
UART_SendStr("\nTestLED_DispAllOffisOver!
\n");
break;
}
case'3':
{
UART_SendByte(g_getch);
UART_SendStr("\n");
for(;;)//死循环,当检测到按下‘Esc’键时退出
{
LED_onebyone();//流水灯
if(UART_GetFlag()==0x1B)//检测是否按下'Esc'键
break;
}
LED_DispAllOff();
UART_SendStr("\nTestLED_OnebyOneisOver!
\n");
break;
}
case'4':
{
UART_SendByte(g_getch);
UART_SendStr("\n");
for(i=0;i<16;i++)
{
LED_DispNum(i);//以二进制形式显示十六进制
DelayNS(5);
if(i==15)
i=0;
if(UART_GetFlag()==0x1B)//检测是否按下'Esc'键
break;
}
LED_DispAllOff();
UART_SendStr("\nTestLED_DispNumtestisOver!
\n");
break;
}
case'5':
{
UART_SendByte(g_getch);
UART_SendStr("\n");
IRQEnable();//外部中断测试
UART_SendStr("youcaninput'Esc'keytoexitEINT_Test\n");
while
(1)
{
if((UART_GetFlag())==0x1B)//按ESC键退出中断
{
IRQDisable();//失能中断
LED_DispAllOff();//关闭LED灯
rGPHDAT=rGPHDAT&BEEP_MASK;//关闭蜂鸣器
UART_SendStr("\nTestEINT_TestisOver!
\n");
break;
}
}
break;
}
case'6':
{
UART_SendByte(g_getch);
UART_SendStr("\n");
Addsubmuldiv();//加减乘除测试模块
UART_SendStr("\nTestAddsubmuldiv_TestisOver!
\n");
break;
}
case'7':
{
UART_SendByte(g_getch);
UART_SendStr("\n");
DateWeekTime_Test();
UART_SendStr("\nTestDateWeekTime_TestisOver!
\n");
break;
}
case'8':
{
UART_SendByte(g_getch);
UART_SendStr("\n");
StepMOTO_Test();
UART_SendStr("\nTestStepMOTO_TestisOver!
\n");
break;
}
case'9':
{
UART_SendByte(g_getch);
UART_SendStr("\n");
DCMOTO_Test();
UART_SendStr("\nTestDCMOTO_TestisOver!
\n");
break;
}
default:
break;
}
}
return0;
}
7、实验总结
第一次遇到综合实验,刚开始不知道怎么将各种基础功能整合到一起,通过观察前面基础实验的主程序发现,src文件夹中包含了主程序中调用的各子函数的定义,理论上讲只要在src文件夹中包含所需要的功能函数,然后在主程序中利用C语言调用这些函数就可以实现所需要的功能。
于是,我查找各种资料找到了所要的功能函数,并在主函数中进行整合调用,发现程序编译的时候出现好多未定义的错误,我这才意识到功能函数里出现的非关键字符在主程序中都要先进行声明和定义,其次,功能函数里涉及到的寄存器要在主函数里进行初始化操作,为了改掉错误,我上网查看了调用我所需要的各功能函数的相关主函数的编写程序,并结合翻阅用户手册,逐步完善了对各函数的定义和初始化操作,经过不断修改和调试,终于可以成功执行程序完成相应功能,下面就针对一些主要功能谈谈自己的心得体会:
1、掌握了GPxCON寄存器控制LED灯显示的原理。
在相应的GPxDAT位写1时,LED灯亮,写0时LED灯灭。
2、实现流水灯功能时,注意调整延时函数的延时时间,刚开始由于灯闪烁的太快以至于肉眼看到有四只灯同时亮,修改了延时程序后,增加延时时间后,就能很清楚观察到现象。
3、在进行两位数的加减乘除测试时,首先应注意的是从键盘输入的数字、字符是以ASCII码的形式存储的,是一位一位操作的。
输入一位数据后,应将其转换为十进制的数据(减去0x30),然后将其组合为两位数(i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 直流 步进 电机 综合 控制系统 设计