您的位置 首页 数字

ARM9舵机程序

****************************************************************************************************

/*****************************************************************************************************************************

S3C2440A 具有5 个16 位定时器,每个定时器能够依照中止形式或DMA 形式作业。定时器0,1,2,3 具有PWM 功用。定时器4 是一个内部定时器,不具有对外输出口线。定时器0 还具有死区发生器,一般用于大电流设备。
定时器特性总结如下。
● 5 个16 位定时器能够作业在中止形式或DMA 形式。
● 包含2 个8 位预分频器、2 个4 位分割器。
● 输出波形的占空比可用编程操控(即进行脉宽调制)。
● 具有主动重载形式或单次触发形式。
● 具有死区发生器。

与定时器相关的寄存器有:TCFG0、TCFG1、TCON、TCMPBn、TCNTBn、TCNTOn
定时器的频率由PCLK分频而来,即Ftimer = PCLK / (prescaler+1) / MUX
prescaler坐落TCFG0,MUX坐落TCFG1
TCON操控定时器的运转:是否主动装载定时器初值,是否手动装载,开端/中止 定时器。
TCNTBn放定时器n的初值,装载用
TCMPBn放定时器n的匹配值,用于调至PWM
TCNTOn,只读,用于调查定时器n的初值

编程办法如下:
定时器初始化()
{
设置预分频器prescaler (TCFG0)
设置MUX (TCFG1)
赋初值TCNTB TCNTB = (PCLK / (prescaler+1) / MUX) * 中止时刻距离(单位秒)
TCON: 手动跟新翻开
手动跟新封闭
主动装载(计时器循环计数)
发动定时器
}

中止初始化()
{
铲除SRCPNF、INTPND中的相应中止标志位(能够调用ClearPending函数)
填入中止例程地址于中止向量表 pISR_TIMER1
使能相应中止 rINTMSK
}

中止例程() __irq
{
……中止程序……
铲除SRCPND、INTPND中的相应中止标志位
}

******************************************************************************************************************************/

//以下驱动关于PCLK=50MHZ的开发板能够直接增加到工程中运用,GPG14引脚对应一路舵机,需要的话能够在增加7路

#include “2440addr.h”
#include “def.h”
typedef unsigned int uint32;
#define ClearPending(bit) {rSRCPND |= bit;rINTPND = rINTPND;}//宏界说清零中止标志位
#define RGB(r,g,b) (unsigned int)(r << 16) + (g << 8) + b
extern unsigned int pwm[8];
extern unsigned int *p;//确定指针所指的数组,避免跑偏
void __irq timer0_ISR(void);
void sifuTimer0(unsigned int);
void Task1(void);
void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color);
void BUZZER_PWM_Test( void );
void int_time0_init(void)
{
//Uart_Printf(“Timer0中止试验”);
//p=pwm; //指针初始化
ClearPending(1<<10); //清楚中止标志
pISR_TIMER0=(unsigned)timer0_ISR; //填入中止例程地址于中止向量表
rINTMSK&=~(1<<10); //TIME0开中止
}

void __irq timer0_ISR(void) //定时器中止函数
{
static char n,biaozhi;
static unsigned int hhe,good;
good++;
n++;
switch(n)
{
case 1: sifuTimer0(*p-400); rGPGDAT|=1<<14; break;
case 2: sifuTimer0(2900-*p); rGPGDAT&=~(1<<14);n=0; break;
case 3: sifuTimer0(*(p+1)); break;
case 4: sifuTimer0(2500-*(p+1)); break;
case 5: sifuTimer0(*(p+2)); break;
case 6: sifuTimer0(2500-*(p+2)); break;
case 7: sifuTimer0(*(p+3)); break;
case 8: sifuTimer0(2500-*(p+3)); break;
case 9: sifuTimer0(*(p+4)); break;
case 10: sifuTimer0(2500-*(p+4)); break;
case 11: sifuTimer0(*(p+5)); break;
case 12: sifuTimer0(2500-*(p+5)); break;
case 13: sifuTimer0(*(p+6)); break;
case 14: sifuTimer0(2500-*(p+6)); break;
case 15: sifuTimer0(*(p+7)); break;
case 16: sifuTimer0(2500-*(p+7)); n=0; break;
}
if(good==100)
{
// Task1();
good=0;
}
/*biaozhi?(*p)++:(*p)–;
if(*p>=2050)
biaozhi=0;
else if(*p<=50)
biaozhi=1;*/
ClearPending(1<<10); //清楚中止标志
}

void time0_init(void)
{
rTCFG0 = (rTCFG0 &(~0xFF)) | 24;
rTCFG1 = (rTCFG1 &(~0xF)) | 0;
rTCNTB0 = 1500;
rTCON |= 1<<1; //敞开手动更新,将TCNTB0的值载入定时器0
rTCON &= ~(1<<1); //封闭手动更新(有必要)
rTCON |=0x1<<0; //敞开定时器,封闭主动装载形式
rGPGCON|=1<<28; //舵机输出引脚初始化
rGPGUP=0x00; //舵机输出引脚初始化

//关于中止时刻的设定: TCNTB =(PCLK / (prescaler+1) / MUX) * 中止时刻距离(单位秒)
}
//装载的频率是1MHz
void sifuTimer0(U32 us)
{
rTCON |= 1<<1; //敞开手动更新,将TCNTB0的值载入定时器0
rTCNTB0=us;
rTCON &= ~(1<<1); //封闭更新
}

//***********************************************************************************************************
void Task1(void)
{
static unsigned int task1Cnt=0;
//完成流水灯
if((task1Cnt%5 == 0))
rGPBDAT = 0x1E0; //全灭
else
rGPBDAT = rGPBDAT – (0x10<<(task1Cnt%5));
task1Cnt++;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/255208.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部