单片机控制18路舵机的C程序

发布者:SerendipitySoul最新更新时间:2015-05-19 来源: 51hei关键字:单片机控制  18路舵机  C程序 手机看文章 扫描二维码
随时随地手机看文章
关于本程序:

问:定时器1控制着9路pwm    以前听高手帮我讲解  一般8路之内是合适的 因为好像是把舵机的一个周期分成8分来分别控制  超出8路的话 好像周期就有可能改变

答:是的,每路PWM有大约2.5ms是要独立侵占timer时间的,8*2.5刚好20ms,每路舵机范围我只用到0.7~2.0左右,所以9路之间没有干扰。但是个timer之间有干扰。

问:看到个小bug pwm0到pwm8再到pwm0可能不是20ms的一个周期

答:嘿嘿,我把每路的低电平时间合在一起了,然后看它的汇编代码,修正中断中语句用去的时间,上位机算好,用keil的仿真出来是很准的。 在两个timer没有同时中断的情况下精度为0.5us,一旦同时中断,有一路PWM的误差将达到7、8us。

恩 这个中断程序没有结束另外的中断有发生 就会造成后面的中断打失 所以得用性能好的单片机 哈哈 

注意本程序在编译的时候要选择pdata模式不然会失败这是工程文件下载已经设置好了模式的: http://www.51hei.com/f/duoji_c.rar

程序源码:

/**************************************************************************
文 件 名:pwm_18out.c 
功能描述:利用STC89C52RC做下位机,控制18路舵机PWM
                  双倍速,机器周期0.5us
日    期:2012-3-19
作    者:cazy peach-ATP
备    注: 18路舵机控制下位机
**************************************************************************/
#define uint unsigned int
#define uchar unsigned char 
#include
sbit pwm9=P1^0; 
sbit pwm10=P1^1; 
sbit pwm11=P1^2; 
sbit pwm12=P1^3; 
sbit pwm13=P1^4; 
sbit pwm14=P1^5;
sbit pwm15=P1^6;
sbit pwm16=P1^7; 
sbit pwm17=P0^7; 
sbit pwm0=P2^7;
sbit pwm1=P2^6;
sbit pwm2=P2^5;
sbit pwm3=P2^4;
sbit pwm4=P2^3;
sbit pwm5=P2^2;
sbit pwm6=P2^1;
sbit pwm7=P2^0;
sbit pwm8=P0^6;
//***************************参数申明******************************
//指令格式:两byte为一路PWM,前一个为PWM高电平定时器TH值、后一个为TL的值,由上位机计算所得,共20组。最后两组分别为每9路PWM低电平和。
uint data pwm_val[40]={
 0XF4, 0XF0, 0XF7, 0X9B, 0XF6, 0XAE,
 0XF4, 0XF9, 0XF8, 0X01, 0XF6, 0X8F,
 0XF5, 0X02, 0XF7, 0X2B, 0XF6, 0X9D,
 0XF4, 0XF0, 0XF3, 0X1D, 0XF3, 0X16,
 0XF4, 0XF9, 0XF2, 0X8B, 0XF3, 0XB0,
 0XF5, 0X02, 0XF2, 0XE9, 0XF3, 0X9B,
 0XBB, 0X55, 0XD3, 0X04};
uchar zhilin[61];
uchar *point;
uchar data pwm_select=0;
uchar data pwm_scan=0;       //timer1使用
uchar data pwm_scan1=0;      //timer2使用
uchar data SCI_get=0;
//**************************函数声明****************************
void SCI_INT(void) ;
void timer_INT(void) ;
//***************************主函数*****************************
void main()
{
 uchar j;
 P0=0X00;  
 P1=0x00;
 P2=0X00;
 point=zhilin;
 SCI_INT();
 timer_INT();
 for(j=0;j<61;j++){zhilin[j]=0;}
 while(1)
 {
   for(;;)                                   //指令接收
   {
    if(RI){RI=0;SCI_get=SBUF;*point++=SCI_get;j++;}else{continue;}
    if(SCI_get==0xff){point=zhilin;break;}   //0xff指令结束符
   }
 
   for(j=0;j<21;j++)                         //指令处理
   {                                        
    if(zhilin[j*3]==255){break;}             //判断是否为指令结束符
    pwm_select=zhilin[j*3];
    pwm_val[pwm_select]=zhilin[j*3+1];  
    pwm_val[pwm_select+1]=zhilin[j*3+2];
   }
 }
}[page]
//***************************定时器中断**************************
void timer0() interrupt 1 using 1
{
  if(pwm_scan==1)             //第1路pwm。
  {
   pwm0=1;
   TH0=pwm_val[0];
   TL0=pwm_val[1];
  }
  else if(pwm_scan==2)     //第2路pwm。
  {
   pwm0=0;
   pwm1=1;
   TH0=pwm_val[2];
   TL0=pwm_val[3];
  }
  else if(pwm_scan==3)     //第3路pwm。
  {
   pwm1=0;
   pwm2=1;
   TH0=pwm_val[4];
   TL0=pwm_val[5];
  }
  else if(pwm_scan==4)     //第4路pwm。
  {
   pwm2=0;
   pwm3=1;
   TH0=pwm_val[6];
   TL0=pwm_val[7];
  }
  else if(pwm_scan==5)     //第5路pwm。
  {
   pwm3=0;
   pwm4=1;
   TH0=pwm_val[8];
   TL0=pwm_val[9];
  }
  else if(pwm_scan==6)     //第6路pwm。
  {
   pwm4=0;
   pwm5=1;
   TH0=pwm_val[10];
   TL0=pwm_val[11];
  }
  else if(pwm_scan==7)     //第7路pwm。
  {
   pwm5=0;
   pwm6=1;
   TH0=pwm_val[12];
   TL0=pwm_val[13];
  }
  else if(pwm_scan==8)     //第8路pwm。
  {
   pwm6=0;
   pwm7=1;
   TH0=pwm_val[14];
   TL0=pwm_val[15];
  }
  else if(pwm_scan==9)     //第9路pwm。
  {
   pwm7=0;
   pwm8=1;
   TH0=pwm_val[16];
   TL0=pwm_val[17];
  }
  else if(pwm_scan==10)     //低电平。
  {
   pwm8=0;
   TH0=pwm_val[36];
   TL0=pwm_val[37];
   pwm_scan=0;
  }
  pwm_scan++;
}
void timer1() interrupt 3 using 2
{
  if(pwm_scan1==1)             //第10路pwm。
  {
   pwm9=1;
   TH1=pwm_val[18];
   TL1=pwm_val[19];
  }
  else if(pwm_scan1==2)     //第11路pwm。
  {
   pwm9=0;
   pwm10=1;
   TH1=pwm_val[20];
   TL1=pwm_val[21];
  }
  else if(pwm_scan1==3)     //第12路pwm。
  {
   pwm10=0;
   pwm11=1;
   TH1=pwm_val[22];
   TL1=pwm_val[23];
  }
  else if(pwm_scan1==4)     //第13路pwm。
  {
   pwm11=0;
   pwm12=1;
   TH1=pwm_val[24];
   TL1=pwm_val[25];
  }
  else if(pwm_scan1==5)     //第14路pwm。
  {
   pwm12=0;
   pwm13=1;
   TH1=pwm_val[26];
   TL1=pwm_val[27];
  }
  else if(pwm_scan1==6)     //第15路pwm。
  {
   pwm13=0;
   pwm14=1;
   TH1=pwm_val[28];
   TL1=pwm_val[29];
  }
  else if(pwm_scan1==7)     //第16路pwm。
  {
   pwm14=0;
   pwm15=1;
   TH1=pwm_val[30];
   TL1=pwm_val[31];
  }
  else if(pwm_scan1==8)     //第17路pwm。
  {
   pwm15=0;
   pwm16=1;
   TH1=pwm_val[32];
   TL1=pwm_val[33];
  }
  else if(pwm_scan1==9)     //第18路pwm。
  {
   pwm16=0;
   pwm17=1;
   TH1=pwm_val[34];
   TL1=pwm_val[35];
  }
  else if(pwm_scan1==10)     //低电平。
  {
   pwm17=0;
   TH1=pwm_val[38];
   TL1=pwm_val[39];
   pwm_scan1=0;
  }
  pwm_scan1++;
}
//********************************函数************************
void timer_INT(void)      //timer0、timer1初始化
{
 uchar a,b,c;
 TMOD|=0X11;
 IE|=0X8A;       //EA=1;ET0=1;ET1=1; 
 TH0=256;
 TL0=255;
 TH1=256;
 TL1=255;
 TR0=1;
 for(c=1;c>0;c--)
 { 
  for(b=38;b>0;b--)
  {
   for(a=130;a>0;a--);
  }
 }
 TR1=1;
}

void SCI_INT(void)        //timer2
{
 SCON=0X50;
 T2CON=0X30;
 TL2=RCAP2L=0XB2;  //9600 0XFFB2,  19200 0XFFD9
 TH2=RCAP2H=0XFF;
 PCON=0X00;
 TR2=1;
}

关键字:单片机控制  18路舵机  C程序 引用地址:单片机控制18路舵机的C程序

上一篇:51单片机驱动伺服电机程序
下一篇:舵机速度控制的51单片机程序

推荐阅读最新更新时间:2024-03-16 14:02

单片机控制的动态数据缓存器的DRAM读/写控制过程
  读取一字节数据的程序段如下:      读取数据时,T1先置1,其后的RD信号将行地址送到地址线AB上,并使D。 触发器 锁存Tl,Q,变成低 电平 ,使RAS有效(低电平),实现行选通;再置TO为l,其后的RD信号将列地址送到AB上,并产生CAS信号,使欲读出单元的数据出现在DB上。RD失效的上升沿使CAS失效,同时,D2触发器置1,使D1清零,RAS也失效变为高电平。经过RC延迟放电,使欲读出单元的数据出现在DB上,D2重新清零,Q2又为高电平,恢复初始状态D1、D2均为零。      程序最后送T0、T1低电平,封锁RAS和CAS,防止系统中其他读/写器动作使DRAM产生误动作。      写数据过程与此类似。
[单片机]
<font color='red'>单片机控制</font>的动态数据缓存器的DRAM读/写控制过程
超声波PIC程序
//////////////////////////////////////////////////////////////////////////////// // // PIC16F877 + DYP-ME007 + LCD03 example // Written October 2008 , using HITECH PIC16 compiler // // Note - assumes a 20MHz crystal, which is 5MHz timer clock // A 1:4 prescaler is used to give a 1.25MHz timer count (0.8uS p
[单片机]
AVR单片机综合流水灯C程序
自己焊了块实验板,就是研究了一下AVR单片机,因为前面一年时间里一直苦战51单片机,有了一定的基础,所以看了一下视频,原来 AVR单片机主要有三个寄存器设置IO口,DDR(X)、PORT(X) BIT(X)等寄存器,至于其它的编程思想,我认为和51那些差不多,看来前辈说得对啊, 学会了一种单片机,学其它的很容易入手 ,今天总算得到了验证,于是写出了下面的流水灯程序! #include iom16v.h //AVR单片机头文件包含 #define uchar unsigned char//宏定义 #define uint unsigned int// /*****************************************
[单片机]
51单片机控制直流电机正反转程序
本程序能通过按键控制直流电流的的正反转,按键的端口定义直接看程序的定义部分。 /=========自动调压控制程序========================================= #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit KEY1=P3^3;//高端行程开关自定义 sbit KEY2=P3^4;//低端行程开关自定义 sbit LED1=P1^0;//定义电机正转驱动端口 sbit LED2=P1^1;//定义电机反转驱动端口 //*-----------------------------------------
[单片机]
AVR单片机的T/C2与精确时钟C程序
CodeWizardAVR V1.25.6 Professional Chip type : ATmega48 Clock frequency : 7.372800 MHz Memory model : Small External SRAM size : 0 Data Stack size : 128 计算: 1秒 = 时钟 / ( 分频 * 计数 ) 假设时钟 = 7372800 Hz 那么: 1秒 = 7372800 / ( 分频 * 计数 ) 得: 计数 =7372800/分频 由于分频只有 1/8/32/64/128/256/1024 供我们选择,而计数最高只有8
[单片机]
STM32模拟I2C程序
/******************************************************************************* 测试平台:STM32F103ZET6最小系统 *******************************************************************************/ static void i2cDelay() { volatile int i = 7; while (i) i--; } // SCL高电平期间,SDA出现下降沿为起始信号 static bool i2cStart() { SDA_OUT;
[单片机]
PIC单片机控制8位流水灯C语言程序
/***************************************************** *** 功能:8位流水灯 *** 实验内容:本实验是用二进制写的程序 *****************************************************/ #include pic.h //包含单片机内部资源预定义 __CONFIG(0xFF32); //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡 void delay(); //delay函数申明 /*******************************
[单片机]
一种用单片机控制的光谱数据采集系统
摘要:介绍利用单片机和A/D器件MAX120等构成的光谱信号采集系统,由单片机控制A/D产生不同的采样频率,用于光电倍增管和CCD输出的光谱信号的采集。 关键词:单片机 A/D 信号采集 光谱 概述 在光谱测量中,常用光电倍增管(PMT)和电荷耦合器件(CCD)作为光电转换器。在慢变化、高精度光谱测量中使用PMT;对于闪光灯、荧光和磷光等强度随时间变化时的光谱信号则采用CCD。PMT和CCD输出的信号形式是不同的:光电倍增管输出的是连续的模拟信号;CCD输出的是视频脉冲信号。由于输出信号的不同,相应的信号采集电路也不尽相同。本文所述的系统通过设定控制开关的不同状态,由单片机检测、判断和执行相应的操作,完成对不同形式输入信号
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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