ARM9舵机程序详解

发布者:vettykatty最新更新时间:2021-02-05 来源: eefocus关键字:ARM9  舵机程序  定时器 手机看文章 扫描二维码
随时随地手机看文章

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

定时器特性总结如下。

● 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中断实验n");

//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++;

}


关键字:ARM9  舵机程序  定时器 引用地址:ARM9舵机程序详解

上一篇:ARM SDT汇编格式与GNU汇编格式的移植
下一篇:基于ARM+DSP的嵌入式四轴运动控制器设计

推荐阅读最新更新时间:2024-11-11 23:44

PIC单片机原理
据统计,我国的单片机年容量已达1-3亿片,且每年以大约16%的速度增长,但相对 于世界市场我国的占有率还不到1%。这说明单片机应用在我国才刚刚起步,有着广阔的前景。培养单片机应用人才,特别是在工程技术人员中普及单片机知识有着重要的现实意义。 当今单片机厂商琳琅满目,产品性能各异。针对具体情况,我们应选何种型号呢?首先,我们来弄清两个概念:集中指令集(CISC)和精简指令集(RISC)。采用CISC结构的单片机数据线和指令线分时复用,即所谓冯.诺伊曼结构。它的指令丰富,功能较强,但取指令和取数据不能同时进行,速度受限,价格亦高。采用RISC结构的单片机数据线和指令线分离,即所谓哈佛结构。这使得取指令和取数据可同时进行,且由于一般指
[单片机]
51单片机 定时器0中断实现1秒LED流水灯
使用定时器0中断实现LED1秒的流水灯 #include reg52.h typedef unsigned int u16; typedef unsigned char u8; u8 code LED ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; u16 time,i; void timer0init() { TMOD=0x01; ET0=1; EA=1; TR0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; } void main() { timer0init(); wh
[单片机]
MSP432笔记——TIM定时器中断
使用driverlib库函数 以TA3为例 前期配置 时钟源 信号源 电压等级 flash //Flash FlashCtl_setWaitState(FLASH_BANK0,1); FlashCtl_setWaitState(FLASH_BANK1,1); //PCM state PCM_setPowerState(PCM_AM_LDO_VCORE1); //CS configure CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48); 配置定时器 Config 参数配置结构体 config 开始定时器 start 使能定时器中断 (清空标志位、打开
[单片机]
单片机汇编实验二:定时器实验
实验要求: 由AT89S52内部定时器0,按方式1工作,即作为16位定时器使用每0.05秒T1溢出中断一次。P1口的P1.0~P1.8分别接8个发光二极管。要求编写程序模拟一时序控制装置。开机后第一秒钟L1,L8亮,第二秒钟L2,L7亮,第三秒钟L3,L6亮,第四秒L4,L5亮,第五秒L3,L6亮,第六秒L2,L7亮,第七秒L1,L8亮,第八秒L1,L3,L5,L7亮,第九秒L2,L4,L6,L8亮,第十秒全亮,第十一秒全灭。然后再从头循环。 //This is the second program of the homework; //Name: WQ DATE: 201326 //In this program we used
[单片机]
STM32f103 定时器配置和中断处理函数
// IAR 7.1 定时器中断时间依赖系统外部时钟 #include stm32_timer.h uint8_t tick = 0; void stm32_timer_init(void) { uint16_t PrescalerValue = 0; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* Compute the prescaler value */ PrescalerValue = (uint16_t) (SystemCoreClock / COUNT_CLK) - 1;
[单片机]
基于stm32通用定时器设置的学习心得
stm32 单片机的定时器资源相当丰富,它的定时器分为高级控制定时器、通用定时器和基本定时器,具体这些定时器资源在哪个系列的片子有就得看不同的片子的手册了。他们具体有什么区别,我也是刚接触这个,看他的数据手册介绍也是茫然,主要是刚开始摸,那些功能都没用到,反正用做定时作用的话哪种定时器都行。在这我就把我自己配置通用定时器的方法及心得简短做个总结,以防以后忘记了。我配置的是定时器2(TIM2)。 通用 定时器 的时钟可来自于外部或内部,选用默认即是采用内部的。通用定时器的时钟来源为APB1总线,所以首先,得将APB1外设时钟打开。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENAB
[单片机]
基于stm32通用<font color='red'>定时器</font>设置的学习心得
TimerCommand.h头文件下载-AVR定时器命令通用头文件
/***************************************************************************** 文件名称:TimerCommand.h 文件标识:_TIMERCOMMAND_H_ 摘 要:AVR定时器命令通用头文件 当前版本:V1.0 *****************************************************************************/ #ifndef _TIMERCOMMAND_H_ #define _TIMERCOMMAND_H_ #define Timer0Config(MODE,
[单片机]
STM32 系统时钟和SysTick定时器
1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL (1)HSI是高速内部时钟,RC振荡器,频率为8MHz; (2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz; (3)LSI是低速内部时钟,RC振荡器,频率为40KHz; (4)LSE是低速外部时钟,接频率为32.768KHz的石英晶体; (5)PLL为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL的输入可以接HSI/2、HSE或者HSE/2。倍频可选择为2 – 16倍,但是其输出频率最大不得超过72MHz。 其中,40kHz的LSI供独
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved