用Pic单片机控制8路MG995舵机(servo motor)的实现方法

发布者:机器人总动员最新更新时间:2016-09-08 来源: eefocus关键字:Pic单片机  MG995舵机 手机看文章 扫描二维码
随时随地手机看文章
 一个PIC16F877A单片机有1个16位定时器TIMER1,我们用来控制8个舵机(即顺序脉冲输出),这样一个单片机就可以控制8个舵机。用8个IO口来控制舵机,舵机控制的信号周期为20mS,而正脉冲最大只有2.5mS,这样有17.5mS是空的。可以采用这种方法:在RD0口输出一个0.5~2.5mS的脉冲,控制一号舵机。完成后,用端口RD1口输出另外一个脉冲,控制2号舵机,就这样下去.....在一号舵机需要第二个脉冲之前,可以输出 20/2.5=8个脉冲,可以用来控制8个舵机,当然,需要用8个IO口。但是一般来说不可能正好有8个2.5mS的脉冲来填满20mS,这样就需要对输出脉冲的总宽度进行累加补偿,然后再用低电平填满20mS中剩下的时间。一个周期让timer1工作8~9次,前8次每次根据不同舵机的脉宽要求进行定时,每次都对不同的IO口输出脉冲.第九个定时是用来填满20mS的剩余时间的. 每个口在输完脉冲后,置0 ,然后单片机就不用管他,可以进行下一个IO口的脉冲输出了. 这样一个单片机顺序对8个IO口进行脉冲输出.  虽然每个舵机的脉冲时间有一点延迟,但是不超过20mS,这对于舵机这种低速运行器件来说是完全感觉不出来的。仿真如下图:

8路MG995舵机控制 - proteus261040013 - Preservation........

下面就用这种方法进行编程。
#include
unsigned char servo_angle_H[8];
unsigned char servo_angle_L[8];

unsigned char compensate_TL;
unsigned char compensate_TH;
 
unsigned char p;

 
void set_servo  (unsigned char angle0,unsigned char angle1,
    unsigned char angle2,unsigned char angle3,
    unsigned char angle4,unsigned char angle5,
    unsigned char angle6,unsigned char angle7)
{
unsigned int temp,temp0,value[8];
unsigned char i;

for(i=0;i<8;i++){
  servo_angle_H[i]=64468/256;
  servo_angle_L[i]=64468%256; 
}
   
  compensate_TL=50268%256;   
  compensate_TH=50268/256;    

 temp = angle0+angle1+angle2+angle3+angle4+angle5+angle6+angle7;
value[0]=65068-(100*angle0)/9;
value[1]=65068-(100*angle1)/9;
value[2]=65068-(100*angle2)/9;
value[3]=65068-(100*angle3)/9;
value[4]=65068-(100*angle4)/9;
value[5]=65068-(100*angle5)/9;
value[6]=65068-(100*angle6)/9;
value[7]=65068-(100*angle7)/9;
for(i=0;i<8;i++){
  servo_angle_H[i]=value[i]/256; 
  servo_angle_L[i]=value[i]%256;

 

  temp0=46068+(100*temp)/9;   
  compensate_TL=temp0%256;   
  compensate_TH=temp0/256;
 

}
//主程序***********************************************************************
void main(void) 
{unsigned int a;unsigned int b;
 INTCON=0;
 GIE=1;//  ;打开总中断
 PEIE=1;//  ;打开外部中断使能位
 TMR1IE=1;//  ;打开TMR1中断
 
 TRISD=0X00;
 PORTD= 0X00;//脉冲波形起始状态 
 T1CON=0x01;//设置TMR1的控制字 
 
 TMR1IF=0;  

unsigned char i;


set_servo  (13,34,56,87,80,123,156,13);
while(1){; }
 
}
//中断服务程序*************************************************************
void  interrupt timer1(void)  
{
 TMR1IF=~TMR1IF;
 
switch(p){
 case 0: TMR1L=servo_angle_L[p];TMR1H=servo_angle_H[p];PORTD=0X01;
 break;
 case 1: TMR1L=servo_angle_L[p];TMR1H=servo_angle_H[p];PORTD=0B00000010;
 break;
 case 2: TMR1L=servo_angle_L[p];TMR1H=servo_angle_H[p];PORTD=0B00000100;
 break;
 case 3: TMR1L=servo_angle_L[p];TMR1H=servo_angle_H[p];PORTD=0B00001000;
 break; 
 case 4: TMR1L=servo_angle_L[p];TMR1H=servo_angle_H[p];PORTD=0B00010000;
 break;
 case 5: TMR1L=servo_angle_L[p];TMR1H=servo_angle_H[p];PORTD=0B00100000;
 break;
 case 6: TMR1L=servo_angle_L[p];TMR1H=servo_angle_H[p];PORTD=0B01000000;
 break;
 case 7: TMR1L=servo_angle_L[p];TMR1H=servo_angle_H[p];PORTD=0B10000000;
 break;
 default:TMR1L=compensate_TL;TMR1H=compensate_TH;PORTD=0B00000000;p=0;
 break;
  }
 p++;
}

关键字:Pic单片机  MG995舵机 引用地址:用Pic单片机控制8路MG995舵机(servo motor)的实现方法

上一篇:基于PIC的LIN总线设计
下一篇:PIC单片机+LCD+DS1302+AD程序

推荐阅读最新更新时间:2024-03-16 15:09

基于FPGA的微流芯片电泳控制系统设计
   1 概 述   微型全分析系统的概念由Manz于20世纪90年代初提出,是集进样、样品处理、分离检测为一体的微型检测和分析系统。微流控芯片是其主要部件,采用微电子机械系统技术集成了微管道、微电极等多种功能元器件。微流控芯片的电泳技术是指以电场方式驱动样品在芯片的微管道中流动,然后再通过光电倍增管(Photo Multiplier Tube,PMT)将被测试样品所产生的微弱信号转换为电信号,并对该信号进行采集与处理。与常规毛细管电泳系统相比,该技术具有分离时间短、系统体积小、集成度高等优点,被广泛应用于药品筛选以及I临床诊断中。聚合酶链式反应(Palymerase Chain Reaction,PCR)是一项在短时间内体外大
[嵌入式]
基于FPGA的微流<font color='red'>控</font>芯片电泳控制系统设计
PIC单片机-PICC介绍
目录: 一、如何从汇编转向PICC 二、浅谈PICC 的位操作 三、PICC 之延时函数和循环体优化 五、在PICC 中使用常数指针 六、PICC 关于unsigned 和 signed 的几个关键问题 七、用PICC 写高效的位移操作 八、C 程序优化 九、关于PIC的C语言中嵌入汇编语言 十、PICC中实现C语言与汇编语言混合编程 ---------------------------------------------------------------------------------------------------------------- 一、如何从汇编转向PICC
[单片机]
pic单片机红外夜视仪设计
随着汽车市场的快速发展和安防意识的日益强化,人们对汽车安全保障技术的要求越来越高,而现有汽车照明系统在雪夜、雪天或大雾等能见度较低情况下视距不远、效果不佳的弊病成为汽车行驶的安全隐患之一。更严重的是在夜晚行车时,驾驶员通常会被对方车辆的灯光干扰出现盲区,容易发生车祸。夜视系统却可以在黑暗中帮助驾驶员导航,使驾驶员在有灯光和黑暗两种情况下都能看清驾驶环境。因此开发一种结构简单、性能稳定、可靠性好、适用性强的汽车红外夜视系统,具有重要的市场应用前景。 该部分核心是PIC16F877A单片机。它是由美国Microchip公司生产的8位单片机,具有独特的RISC结构,数据总线和指令总线分离的哈佛总线结构。它连接各个终端设备,响应主控机
[单片机]
<font color='red'>pic单片机</font>红外夜视仪设计
PIC单片机数码管计数器示例程序
P IC   单片机   数码管 计数器示例程序 ;**************************************************   __CONFIG 3F39H;设置配置位中振荡方式为XT,其它全部禁止或关闭 ;************************************************ PCL       EQU    02H  ;定义程序计数器低字节寄存器地址 STATUS    EQU    03H  ;定义状态寄存器地址 PORTA     EQU    05H  ;定义RA口数据寄存器地址 PORTB     EQU    06H  ;定义RB口数据寄存器地址 PORTC  
[单片机]
PIC单片机一个实用的按键处理程序
程序实现功能: 按键 调光,按键带蜂鸣器响声。 #include pic.h __CONFIG(0X034); #define KEY RC5 #define LED RC2 int b; void key(unsigned *p) { static bit valid=0; static bit finish=0; if(valid==0) { if(KEY==0) { if(finish==0) { finish=1; RC0=1;// 蜂鸣器 接这里 b=50; while(b--); RC0=0; if(*p 251)
[单片机]
专栏 | 坤维高精度微小量程六维联合加载标定检测系统投入使用
坤维科技 为微小量程六维力传感器研发的 六维联合加载标定检测系统KC650A 于2023年1月9日正式投入使用。 KC650A 主要用于 0~30N 测量范围的六维力传感器标定和检测 ,主要服务于芯片制造、精密装配、3C检测、手术机器人、诊疗设备及科学实验等对六维力传感器有 小量程、高精度 需求的行业。 KC650A 可按任意比例对被标定或检测的传感器同时精准施加正交三方向力和三方向力矩。因此可以根据不同传感器器结构和特性优化标定样本空间和检测样本空间,利用 KC650A 充分激发传感器的非线性力学行为特征,从而获得最优的解耦算法,最终达到 高效、高精准度 的测量效果。
[机器人]
可变形的妙鼠标
据外媒报道,美国专利和商标局正式公布了一系列为苹果公司新授予的71项专利。其中一项涉及到一个新的苹果鼠标设计——可变形的妙控鼠标。 除了苹果为其设计的特定功能外,新的形状变换设计还可以通过调整鼠标的宽度和高度,为用户提供不同大小的调整,使其能够根据自己的喜好对其进行修改。另外这样的设计也可以使鼠标变薄,使其比普通的圆形鼠标更便于携带。 据获悉,苹果每周都会提交大量专利申请,但专利申请的存在表明了公司研发团队感兴趣的领域,它并不保证所描述的概念会出现在未来的产品或服务中。至于未来苹果是否能将这一专利变成现实,我们拭目以待。
[物联网]
可变形的妙<font color='red'>控</font>鼠标
PIC单片机A/D转换数据存储效率的提升
  本文提出一种数据打包的方法, 使得相同的数据量占用较少的存储空间, 并可提高传输效率。   引言   在由单片机和PC 机构成的检测系统中, 通常会由多个单片机采集数据并将经过A/D 转换的数据通过串口送往上位PC 机进行数据处理。PIC 单片机A/D 转换后的结果大多是8 位或10 位的, 8 位的A/D转换不涉及该问题。以10 位的数据为例, 在单片机内进行存储时需要占用2 个8 位的字节, 低8 位和高2位分别存储在2 个字节中, 但是用于存储高位数据的8 位宽的RAM 单元中仅有2 位是有效数据。   单片机的存储空间有限, 以PIC16F877 单片机为例, RAM 数据存储器按功能分为通用寄存器和特殊功能寄存
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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