您的位置 首页 传感器

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

关于本程序:问:定时器1控制着9路pwm以前听高手帮我讲解一般8路之内是合适的因为好像是把舵机的一个周期分成8分来分别控制超出8路

关于本程序:

问:定时器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低电平和。
uintdatapwm_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运用
uchardataSCI_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];
}
}
}

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部