基于S3C2410X PWM步进电机控制设计Word文件下载.docx
《基于S3C2410X PWM步进电机控制设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于S3C2410X PWM步进电机控制设计Word文件下载.docx(40页珍藏版)》请在冰点文库上搜索。
EmbestIDEforARM集成开发环境,windowsxp。
1.2S3C2410X处理器介绍
1.2.12410体系结构:
S3C2410X处理器是SAMSUNG公司给予ARM公司的ARM920T处器核,采用0.18um制造工艺的32位微处理器,以其低功耗、简介及全静态设计尤其适合于成本及功耗敏感的嵌入式应用。
采用ARM新设计的AMBA总线体系结构。
用于支持和嵌入式和一般嵌入式应用的集成系统16/32-BitRISC体系结构,ARM920TCPU内核增强的ARM体系MMU,可支持WinCE、EPOC32和Linux操作系统指令Cache和数据,写缓冲器和物理地址TAGARM减少了主存宽带和延迟对性能的影响,ARM920TCPU核支持ARM调试体系结构内部高级微处理器总线体系(AMBA)。
体系结构图如下:
图1.1S3C2410X处理器体系结构方框图
1.2.22410实验箱底板规格:
◆大电流5V供电,提供更加优质的供电,防止电源断电而引的BUG;
◆LCD显示
-板上LCD接口集成4线电阻式触摸屏接口,可以直接连接4线电阻式触摸屏,
-支持黑白、4级灰度、16级灰度、256色、4096色STN液晶屏,
尺寸从3.5寸到12.1寸,屏幕分辨率可以达到1024X768象素
◆1个100M以太网RJ-45接口
◆1个USBSlaveB型接口(支持USB1.1协议)
◆1路立体声音频输出接口,1路音频输入接口
◆板载AD转换测试
◆板载PWM功能测试(控制直流电机调速)
◆板载44PinIDE接口
◆板载实时时钟电池
◆系统复位开关和指示灯
◆两路DA
◆8个数码管
◆8个LED灯
◆1个VGA接口
◆1个直流电机
◆1个步进电机
图1.2实验系统硬件平台
1.3系统结构
图1.3嵌入式系统组成框图
2详细设计
2.1PWM介绍
2.1.1PWM定时器概述
S3C2410X有5个16位定时器,其中定时器0、1、2、3具有脉冲宽度调制(PWM)功能,定时器4具有内部定时左右,但是没有输出引脚。
定时器0具有死区生成器,可以控制大电流设备。
定时器T0、T1共用一个8bit预分频器,定时器T2、T3、T4共用另一个8bit预分频器,每个定时器都有一个时钟分频器,信号分频输出有5种模式。
每个定时器模块都从时钟分频器接收它自己的时钟信号,时钟分频器接收的时钟信号来自于8bit预分频器。
可编程8bit预分频器根据存储在TCFG0和TCFG1中的数据对PCLK进行分频。
每一个定时器都有一个自己的用定时器时钟驱动的16位减法计数器。
当减法计数器减到0时,就会产生一个定时器中断来通知CPU定时器操作下次操作。
当定时器减法计数器减到0时,相应的TCNTBN的值被自动重载到减法计数器中继续下次操作。
然而,如果定时器停止了,比如在运行时,通过清除TCON中定时器使能位来中止定时器的运行,TCNTBN的值不会被重载到减法计数器中。
2.1.2S3C2410X定时器特性
(1)5个16位定时器。
(2)2个8bit预分频器和2个4bit分频器。
(3)可编程PWM输出占空比。
(4)自动重载模式,或者单个脉冲输出模式。
(5)具有死区生成器。
(6)自动重载与双缓冲。
S3C2410X具有双缓冲功能,能在不中止当前定时器运行的情况下,重载下次定时器运行参数,所以尽管新的定时器的值被设置好了,但是当前操作仍能成功完成。
定时器值可以写入定时器计数缓冲寄存器,当前的计数器的值可以从定时器计数观察寄存器独读出。
读出的TCNTBn值并不是当前的计数器值,而是下次重载的计数器值。
当TCNTBn=0时,自动重载操作把TCNTBn的值装入TCNTn,只有当自动重载允许并且TCNTn=0时,才会自动重载。
如果TCNTn=0,自动重载禁止,则定时器停止运行。
图2.1双缓冲功能举例
图2.2死区功能允许波形图
2.1.3PWM定时器操作示例
定时器操作实例如图2.2所示.
图2.3定时器操作示例
<
1>
允许自动重载功能,TCNTBN=(50+110),TCMPBN=110.置位手动更新位,配置倒相位,手动更新位被设置后,TCNTBN和TCMPBN的值被自动装入TCNTN和TCMPN。
之后设置TCNTBN和TCMPBN分别为80(40+40)和40.
2>
启动定时器清零手动更新位,取消倒相位功能,允许自动重载,定时器开始启动减法计数。
3>
当TCNTTN和TCMPN的值相等时,TOUT输出电平由低变高。
4>
当TCNTN=0时,产生中断,并在下一个时钟到来时把TCNTBN的值装入暂存器中。
5>
在中断服务子程序中,把TCNTBN和TCMPBN分别装入80(20+60)和60.
6>
当TCNTBN和TCMPN的值相等时,TOUT输出电平由低到高。
7>
当TCNTN=0时,把TCNTN和TCMPBN的值分别自动装入TCNTN和TCMPBN,并触发中断。
8>
在中断子服务子程序中,禁止自动重载和中断请求来中止定时器运行。
9>
当TCNTN和TCMPBN的值相等的时候,TOUT输出电平由低变高。
10>
尽管TCNTN=0,但是定时器停止运行,也不再发生自动重载操作,因为定时器自动重载功能被禁止。
11>
不再产生新的中断。
2.1.4PWM定时器寄存器
1)定时器寄配置存器0(TCFG0,地址:
0x51000000)
定时器配置寄存器0如表2.1所示。
表2.1定时器配置寄存器0(TCFG0)
TCFG0
位
描述
初始化状态
保留
[31:
24]
--
0x00
死区长度
[23:
16]
8bit控制死区的长度
预分频器1
[15:
8]
8bit数据等于定时器2、3、4的预分频值
预分频器0
[7:
0]
8bit数据等于定时器0的预分频值
定时器输入时钟频率(TCLK)=PCLK/(预分频值+1)/分频器分频值
预分频值=0~255。
分频器的分频值为2、4、8、16。
PWM输出时钟频率=
定时器输入时钟频率(TCLK)/定时器计数缓冲寄存器(TCNTBn)
PWM输出信号占空比=
定时器比较缓冲寄存器值(TCMPBn)/定时器计数缓冲寄存器(TCNTBn)
2)定时器配置寄存器1(TCFG1,地址:
0x51000004)
定时器配置寄存器1如表2.2所示。
表2.2定时器配置寄存器1(TCFG1)
TCFG1
初始化状态
保留
00000000
DMA模式选择
20]
DMA请求选择
0000=无DMA通道选择
0001=定时器0DMA方式
0010=定时器1DMA方式
0011=定时器2DMA方式
0100=定时器3DMA方式
0101=定时器4DMA方式
0110=定时器5DMA方式
0000
多路开关4选择
[19:
定时器4多路输入选择
0000=1/20001=1/4
0010=1/80011=1/16
01XX=外部时钟1
多路开关3选择
[15:
12]
定时器3多路输入选择
多路开关2选择
[11:
定时器2多路输入选择
多路开关1选择
[7:
4]
01XX=外部时钟0
多路开关0选择
[3:
3)定时器控制寄存器(TCON,地址:
0x51000008)
定时器控制寄存器如表2.3所示
表2.3定时器控制寄存器(TCON)
TCON
定时器4自动重载on/off
[22]
0=定时器4运行1次
1=自动重载模式
定时器4手动更新位(*)
[21]
0=无操作,1=更新TCNTB4
定时器4启动位
[19]
0=无操作,1=启动定时器4
定时器3自动重载on/off
[18]
0=定时器3运行1次
定时器3输出倒相位
[17]
0=倒相关闭,1=TOUT3倒相
定时器3手动更新位(*)
[16]
0=无操作,1=更新TCNTB3
定时器3启动位
[15]
0=无操作,1=启动定时器3
定时器2自动重载on/off
[14]
0=定时器2运行1次
定时器2输出倒相位
[13]
0=倒相关闭,1=TOUT2倒相
定时器2手动更新位(*)
[12]
0=无操作,1=更新TCNTB2
定时器2启动位
[11]
0=无操作,1=启动定时器2
定时器1自动重载on/off
[10]
0=定时器1运行1次
定时器1输出倒相位
[9]
0=倒相关闭,1=TOUT1倒相
定时器1手动更新位(*)
[8]
0=无操作,1=更新TCNTB1
定时器1启动位
[7]
0=无操作,1=启动定时器1
[6:
5]
死区功能允许
[4]
0=禁止,1=允许
定时器0自动重载on/off
[3]
定时器0输出倒相位
[2]
0=倒相关闭,1=TOUT0倒相
定时器0手动更新位(*)
[1]
0=无操作,1=更新TCNTB0
定时器0启动位
[0]
0=无操作,1=启动定时器0
4)定时器减法缓冲寄存器(TCNTBn)/比较缓冲寄存器(TCMPBn)
定时器减法缓冲寄存器(TCNTBn)/比较缓冲寄存器(TCMPBn)如表3.2所示。
表2.4定时器减法缓冲寄存器(TCNTBn)/比较缓冲寄存器(TCMPBn)
寄存器
R/W
复位值
TCNTBn
定时器n减法缓冲寄存器
0x00000000
TCMPBn
定时器n比较缓冲寄存器
TCNTBn[15:
0]:
设置减法缓冲寄存器的值
TCMPBn[15:
0]:
设置比较缓冲寄存器的值
5)定时器观察寄存器(TCNTOn,地址:
0x5100000C~0x5100003C)
定时器观察寄存器如表2.3所示。
表2.5定时器观察寄存器
地址
TCNTB0
0x5100000C
TCMPB0
0x51000010
TCNTO0
0X51000014
TCNTB1
0x51000018
TCMPB1
0x5100001C
TCNTO1
0X51000020
TCNTB2
0x51000024
TCMPB2
0x51000028
TCNTO2
0X5100002c
TCNTB3
0x51000030
TCMPB3
0x51000034
TCNTO3
0X51000038
TCNTB4
0x5100003C
TCNTO4
0X51000040
2.2基于S3C2410XPWM步进电机的硬件设计
2.2.1系统设计要求与方案确定
1.系统设计要求
<
以S3C2410X为核心,设计一个PWM步进电机控制系统。
通过按键控制PWM的占空比。
2.设计方案确定
硬件电路由4部分组成,即按键电路、时钟电路、复位电路、步进电机驱动电路。
2.2.2PWM步进电机的驱动电路原理
步进电机是一种将电脉冲化为角位移的执行机构。
通俗点讲,当步进电驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度。
可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;
同时还可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
本实验使用的电机驱动器是日本东芝公司的TA8435芯片,该芯片的功能如下:
(1)双向正弦曲线步进电机驱动器;
(2)输出电流平均值为1.5A,峰值为2.5A;
(3)PWM输入源;
(4)高电压Bi-CMOS处理技术;
(5)电机可双向转动;
(6)HZIP-25P封装;
(7)RESET端输入阻抗100kohm;
(8)输出电机控制电流正负2mA。
引脚功能如表2.6所示。
表2.6TA8435引脚功能
引脚
符号
功能描述
1
SG
信号地
2
RESET
低电平有效
3
ENABLE
低电平选通
4
OSC
由外部电容计算晶振频率
5
CW/CCW
顺时针方向/逆时针方向转动选择
6
CK2
时钟输入
7
CK1
8
M1
激励控制输入
9
M2
10
REF
IN输入参考电压
11
MO
监听输出
12
NC
未连接
13
VCC
逻辑电源
14
15
VMB
输出电压
16
B
输出B
17
PG-B
电源地
18
NFB
B通道输出电流检测
19
20
A
输出A
NFA符号
21
NFA
A通道输出电流检测
22
PG-A
23
24
VMA
输出电源
25
本实验用到的控制引脚有EN、CW/CCW、M2,机体链接电路如图2.4所示。
图2.4电机驱动和S3C2410X电路连接图
OUT1与OUT2、OUT3与OUT4连到电机的控制端,如图2.5所示。
2.3基于S3C2410XPWM步进电机的软件设计
2.3.1程序流程图
程序流程图如图2.6所示。
2.3.2应用程序设计
应用程序设计部分代码如下:
PWM-TEST.C
#include"
44b.h"
#include”def.h”
/*函数声明*/
voidtimer0_int(void)__attribute__((interrupt("
IRQ"
)));
voidtimer1_int(void)__attribute__((interrupt("
/*globalvariablees*/
intcTemp;
intcEnChange0,cEnChange1;
/*************************************************************
*定时器0函数
**************************************************************/
voidtimer0_int(void)
{
ClearPending(BIT_TIMER0);
//清除挂起标志位
if(cEnChange0)
{
switch(cTemp)
case'
1'
:
rTCNTB0=792;
rTCMPB0=396;
uart_printf("
\nYouselected1\n"
);
break;
2'
rTCMPB0=264;
\nYouselected2\n"
3'
rTCNTB0=396;
rTCMPB0=132;
\nYouselected3\n"
4'
rTCMPB0=198;
\nYouselected4\n"
default:
break;
}
cEnChange0=0;
}
/********************************************
*定时器1函数
*********************************************/
voidtimer1_int(void)
ClearPending(BIT_TIMER1);
if(cEnChange1)
5'
rTCNTB1=792;
rTCMPB1=396;
\nYouselected5\n"
6'
rTCMPB1=264;
\nYouselected6\n"
7'
rTCNTB1=396;
rTCMPB1=132;
\nYouselected7\n"
8'
rTCMPB1=198;
\nYouselected8\n"
cEnChange1=0;
/*********************************************
*初始化PWM定时器0
voidtimer0_init(void)
rGPBCON=rGPBCON&
0xFFFFF0|(1<
3);
/*****设置中断处理程序******/
pISR_TIMER0=(unsigned)timer0_int;
pISR_TIMER1=(unsigned)timer1_int;
rTCFG0=(39<
8)|(39);
//预分频器0/1=39,39
rTCFG1=(3<
4)|3;
rTCON=0;
/**********************************************
*PWM测试函数
***********************************************/
voidpwm_test(void)
uart_printf("
\nPWMTestExample,%dtimes\n"
g_nTimeout);
PressSB1203tochangethedirectionofthemotor\n"
//初始化定时器0
timer_init();
ClearPending(BIT_TIMER0);
ClearPending(BIT_TIMER1);
/*******初始化PWM定时器0寄存器*******/
rTCNTB0=792;
rTCMPB0=396;
rTCNTB1=792;
rTCMPB1=396;
rTCON|=(1<
10)|(1<
9)|(1<
2)|(1<
1);
//手动更新
delay(10);
rTCON&
=~((1<
1));
//自动重装
rINTMSK&
=~(BIT_TIMER0|BIT_TIMER1);
11)|(1<
3)|(1<
8)|1;
//启动定时器,自动重装
g_nKeyPress=1;
while(1