标题:
单片机PWM控制舵机由浅入深各模块源代码(单路与8路)
[打印本页]
作者:
张大哈哈哈
时间:
2018-8-19 16:00
标题:
单片机PWM控制舵机由浅入深各模块源代码(单路与8路)
此为初学者掌握51程序控制舵机的重要程序
0.png
(7.56 KB, 下载次数: 31)
下载附件
2018-8-19 17:30 上传
控制一个普通舵机单片机源程序如下:
/**********************************************************************
该实验例程还是实现一个舵机在两个角度之间摆动。0度和90度
但定时器中断里的处理与前一节有所区别,目的是让大家更好的
理解下一节分时复用思想产生多路PWM 。是一个过渡实验例程。
***********************************************************************/
#include <STC15Fxxxx.H> //STC15系列单片机
void delay(uint16 time); //软件延时函数
void Timer_init(); //定时器初始化函数
void Timer0(uint32 us); //定时器0定时函数
uint16 pwm_valu=500;
sbit pwm1=P0^0; //将舵机插到P0^0口上
void main()
{
P0M1=0;
P0M0=0XFF; //将P2口设置成强推免输出,提高带负载能力
Timer_init(); //定时器初始化
Timer0(31); //通过一个定时值进入定时循环
while(1)
{
pwm_valu=500; //脉宽=500us=0.5ms即0度位置
delay(1000);
pwm_valu=1500; //脉宽=1500us=1.5ms即90度位置
delay(1000); //舵机在两个角度之间摆动
}
}
void delay(uint16 time)
{
uint16 i;
uint16 j;
for(i=0;i<1000;i++)
for(j=0;j<time;j++);
}
void Timer_init()
{
EA=1;
AUXR|=0xC0; //T0,T1工作在1T
TMOD|= 0x11; //T0工作在方式1,16位
ET0 = 1;
}
void Timer0(uint32 us)
{
uint32 valu;
valu=0xffff-us*23; //
TH0=valu>>8;
TL0=(valu<<8)>>8;
TR0 = 1; //T0开始工作
}
void T0zd(void) interrupt 1
{
static uint8 i=1;
switch(i) //
{
case 1:
{
pwm1=1;
Timer0(pwm_valu);//
} break;
case 2:
{
pwm1=0;// pwm1变低
Timer0(2500-pwm_valu);//
} break;
case 3:
{
Timer0(500);//
} break;
case 4:
{
Timer0(2500);//
} break;
case 5:
{
Timer0(2500);//
} break;
case 6:
{
Timer0(2500);//
} break;
case 7:
{
Timer0(2500);//
} break;
case 8:
{
Timer0(2500);//
} break;
case 9:
{
Timer0(2500);//
i=0;
} break;
default:break;
}
i++;
}
复制代码
控制多个普通舵机
单片机源程序如下:
/**********************************************************************
该实验例程是实现8个舵机在两个角度之间摆动。0度和90度
通过该例程,读者要学会 分时复用定时器 ,用1个定时器来产生多路PWM的思想。
***********************************************************************/
#include "STC15Fxxxx.H" //STC12C5A系列单片机
void delay(uint16 time); //软件延时函数
void Timer_init(); //定时器初始化函数
void Timer0(uint32 us); //定时器0定时函数
uint16 pos[2][9]={ //上一节中控制一个舵机这里只需要两个数。
{1500,1500,1500,1500,1500,1500,1500,1500,1500}, //此节扩展成8个舵机,则此处变为两个数组。。
{500,500,500,500,500,500,500,500,500} //数组中的1~8成员代表每一个舵机的两个位置。
};
uint16 pwm[9]={1500,1500,1500,1500,1500,1500,1500,1500,1500}; //定时器取定时值从这里取
sbit pwm16=P5^3;
sbit pwm15=P1^5;
sbit pwm14=P1^6;
sbit pwm13=P1^7;
sbit pwm12=P4^3;
sbit pwm11=P3^2;
sbit pwm10=P3^3;
sbit pwm9=P3^4;
sbit pwm8=P0^5;
sbit pwm7=P0^6;
sbit pwm6=P0^7;
sbit pwm5=P4^6;
sbit pwm4=P4^1;
sbit pwm3=P4^5;
sbit pwm2=P4^4;
sbit pwm1=P2^7;
/**************************************************************************************************
函数名:main()
功能: 入口函数
作者: 许长华
时间: 2012-3-3
备注:
/***************************************************************************************************/
void main()
{
uint8 i=0;
P0M1=0; //设置P口为强推免输出模式,下同
P0M0=0XFF;
P1M1=0;
P1M0=0XFF;
P2M1=0;
P2M0=0XFF;
P3M1=0;
P3M0=0XFF;
P4M1=0;
P4M0=0XFF;
P5M1=0;
P5M0=0XFF;
Timer_init(); //定时器初始化
Timer0(31); //通过一个定时值进入定时循环
while(1)
{
for(i=1;i<9;i++) //pos[0]位置
pwm[i]=pos[0][i];
delay(1000);
for(i=1;i<9;i++) // pos[1]位置
pwm[i]=pos[1][i];
delay(1000); //舵机在两个角度之间摆动
}
}
/**************************************************************************************************
函数名:delay(uint16 time)
功能: 软件延时函数
参数: time 定时值,其大小与延时长短成正比
作者: 许长华
时间: 2012-3-3
备注:
/***************************************************************************************************/
void delay(uint16 time)
{
uint16 i;
uint16 j;
for(i=0;i<2000;i++)
for(j=0;j<time;j++);
}
/**************************************************************************************************
函数名:timer_init()
功能: 定时器初始化函数
/***************************************************************************************************/
void Timer_init()
{
EA=1; //开总中断
AUXR|=0xC0; //T0,T1工作在1T
TMOD|= 0x11; //T0工作在方式1,16位
ET0 = 1; //开定时器0中断
}
/**************************************************************************************************
函数名:timer0(uint32 us)
功能: 定时器0定时函数
/***************************************************************************************************/
void Timer0(uint32 us)
{
uint32 valu;
valu=us*23; //工作在1T,最大定时时间2700us
valu=valu - 120;
valu=0xffff-valu; //
TH0=valu>>8;
TL0=(valu<<8)>>8;
TR0 = 1; //T0开始工作
}
/**************************************************************************************************
函数名:T0zd(void) interrupt 1
功能: 定时器0中断函数
备注: 控制8个舵机
/***************************************************************************************************/
void T0zd(void) interrupt 1
{
static uint8 i=1;
switch(i) //
{
case 1:
{
pwm1=1;
Timer0(pwm[1]); //定时
} break;
case 2:
{
pwm1=0; //pwm1变低
Timer0(2500-pwm[1]);// 定时
} break;
case 3:
{
pwm2=1; //pwm2变高
Timer0(pwm[2]);// 定时时常为pwm[2]
} break;
case 4:
{
pwm2=0; //pwm2变低
Timer0(2500-pwm[2]);// 定时时常为pwm[2]
} break;
case 5:
{
pwm3=1; //pwm3变高
Timer0(pwm[3]);// 定时时常为pwm[3]
} break;
case 6:
{
pwm3=0; //pwm3变低
Timer0(2500-pwm[3]);// 定时
} break;
case 7:
{
pwm4=1; //pwm4变高
Timer0(pwm[4]);// 定时
} break;
case 8:
{
pwm4=0; //pwm4变低
Timer0(2500-pwm[4]);// 定时
} break;
case 9:
{
pwm5=1; //pwm5变高
Timer0(pwm[5]);// 定时
} break;
case 10:
{
pwm5=0; //pwm5变低
Timer0(2500-pwm[5]);// 定时
} break;
case 11:
{
pwm6=1; //pwm6变高
Timer0(pwm[6]);// 定时
} break;
case 12:
{
pwm6=0; //pwm6变低
Timer0(2500-pwm[6]);// 定时
} break;
case 13:
{
pwm7=1; //pwm7变高
Timer0(pwm[7]);// 定时
} break;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
1.普通PWM舵机由浅入深各模块代码.rar
(309.12 KB, 下载次数: 82)
2018-8-19 15:59 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
bemc
时间:
2018-8-19 20:39
不错 有价值的资料 有时间好好研究一下
作者:
jshyda
时间:
2018-8-20 04:11
正在学习如何控制舵的知识,谢LZ!
作者:
bbk215
时间:
2019-3-1 17:20
不错,非常值得学习
作者:
bbk215
时间:
2019-3-1 17:21
可以的,值得学习的资料
作者:
gdatgb
时间:
2019-3-3 15:04
不错,值得学习.谢楼主!
作者:
不三不四
时间:
2019-10-15 18:37
可以的
作者:
tonggin
时间:
2019-10-16 09:31
自学玩舵机的必要参考资料
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1