51单片机按键控制舵机问题

51单片机按键控制舵机问题,第1张

/舵机控制——火柴天堂作品-20120314/

/50Hz舵机,05ms-25ms 对应 0-180°(-90°~90°)/

/51系列单片机,晶振12MHz,P10输出50Hz PWM调制方波(即周期20ms)驱动舵机,方波由T0定时器产生

P11-P17,7个光电检测,P11-1305°,P12-108°,P13-99°,P14-90°,P15-81°,P16-72°,P17-495°,优先级高-低:P14→P11/P17→P12/P16→P13/P15 /

#include"reg52h" //包含52系列头文件

#define uchar unsigned char //定义 无符号字符型

#define uint unsigned int //定义 无符号整型

//#define TRUE 1 //定义 逻辑真

//#define FALSE 0 //定义 逻辑假

//最小角度45°,时间应该为2ms×45°/180°=50us,故定时器T0定时时间为 50us

#define th0 0xce //50us for Model2 at 12HMz Fosc

#define DutyDeno 40 //定义 占空比分母(舵机转动范围) 为:180°/45°=40

#define SteeringBasic 10 //舵机基准角 05ms, 05ms/50us=10

#define SteerineSigne 400 //舵机信号 20ms, 20ms/50us=400

uchar code SteeringList[8]={0,29,24,22,20,18,16,11}; //P11-P17光电检测对应舵机转角列表,单位45°,第一个元素为空

sbit PS1=P1^0; //定义 光电开关1 接口

sbit PS2=P1^1; //定义 光电开关2 接口

sbit PS3=P1^2; //定义 光电开关3 接口

sbit PS4=P1^3; //定义 光电开关4 接口

sbit PS5=P1^4; //定义 光电开关5 接口

sbit PS6=P1^5; //定义 光电开关6 接口

sbit PS7=P1^6; //定义 光电开关7 接口

sbit Steering=P1^7; //定义 舵机输出 接口

#define PS1_Value 1 //定义 光电开关1 值

#define PS2_Value 2 //定义 光电开关2 值

#define PS3_Value 3 //定义 光电开关3 值

#define PS4_Value 4 //定义 光电开关4 值

#define PS5_Value 5 //定义 光电开关5 值

#define PS6_Value 6 //定义 光电开关6 值

#define PS7_Value 7 //定义 光电开关7 值

uchar DutyNume; //定义 占空比分子(舵机转角) 变量,单位45°

void Timer0() interrupt 1 //定时器T0 中断 函数

{

static uint duty_time=0; //定义静态变量,作为 占空比 输出时间的参考值(50us)

duty_time=++duty_time%SteerineSigne; //该句等效于:duty_time++;duty_time%=SteerineSigne;

if(duty_time<DutyNume+SteeringBasic) Steering=1; //若计时时间小于 占空比分子,则输出应为 高电平

else Steering=0; //若计时时间大于 占空比分子,则输出应为 低电平

}

void TimerInit() //定时器初始化 函数

{

TMOD=0x02; //T0 8位自重装定时器

EA=1; //允许系统中断

ET0=1; //允许T0中断

TH0=th0;

TL0=th0; //50us 初值

TR0=1; //T0开始计时

}

uchar PhotoSwitchScan() //光电开关扫描 函数

{

if(!PS4) return PS4_Value; //返回光电开关对应值

if(!PS1) return PS1_Value;

if(!PS7) return PS7_Value;

if(!PS2) return PS2_Value;

if(!PS6) return PS6_Value;

if(!PS3) return PS3_Value;

if(!PS5) return PS5_Value; //返回光电开关对应值

return PS4_Value; //其它情况,均保持跟最高级别一致

}

void PhotoSwitchResp() //光电开关响应 函数

{

//uchar PS_value=PhotoSwitchScan(); //扫描光电开关

//if(PS_value)DutyNume=SteeringList[PS_value]; //占空比分子 加1,即舵机转角加45°,到180°后,再加归零

DutyNume=SteeringList[PhotoSwitchScan()];

}

void main() //主函数

{

TimerInit(); //调用 定时器初始化 函数

while(1) //循环系统

{

PhotoSwitchResp(); //调用 光电开关响应 函数

}

}

看你产生PWM波的方式

用两个定时器,定时器0定时20ms,定时器1定时15至25ms可调

定时器0每次中断,打开定时器1,并在某个引脚输出高电平,定时器1中断时再将这个引脚置低电平,这样就 产生了PWM波

定义一个变量,主程序检测按键,根据按键按下次数改变变量的值,再根据变量值决定定时器1的初值,即可改变PWM占空比,从而改变舵机角度

当然你要计算出舵机每转一度,PWM波的占空比应该变化多少。

//12MHz

#include <reg51h>

void InitTimer0(void)

{

TMOD = 0x01;

TH0 = 0x0B1;

TL0 = 0x0E0;

EA = 1;

ET0 = 1;

TR0 = 1;

}

void delay(void) //误差 0us 延时1ms 此处可以修改高电平周期

//修改此处的延时可以更改舵机转的角度 ,45度具体是多少 你可以试试

{

unsigned char a,b,c;

for(c=1;c>0;c--)

for(b=142;b>0;b--)

for(a=2;a>0;a--);

}

void main(void)

{

InitTimer0();

P1_2=0;

while(1);

}

void Timer0Interrupt(void) interrupt 1

{

//20ms中断

TH0 = 0x0B1;

TL0 = 0x0E0;

P1_2=1;

delay();

P1_2=0;

}

180度舵机是一特殊的机器人专用舵机。你所说的0-180度,在专业玩家里不这样说的,而是说成±90度。即顺时针90度,逆时针90度。

你可以自己写一个的。这种舵机比较特殊,但是只要满足一下PWM就可以实现了:

1 周期T=20ms(即50HZ),占空比500us-2500us。

2 500us舵机逆时针转90度,2500us舵机顺时针转90读。 (其中0度是1500us)

3 即: TL+TH=20ms 改变TH的值,舵机角度随之改变。参数参照以上12点。

TL TH

_____ ____

_________| |_________| | _________|

4 电路原理很简单,接好电源,地,信号线。

信号线接到单片机或者其他能输出PWM的控制脚。

#include<reg52h>typedef unsigned int uint;typedef unsigned char uchar;sbit pwm=P0^3;//输出PWM信号uchar count=0;uint pwm_value=1500;//初值为15msuint value[]={1500,1000,1500,2000,1500};//void delay_ms(uint x){uint i;while(x--)for(i=0;i<125;i++);}void InitTimer(void){TMOD=0x11;//开定时器0,1TH0=-20000/256;//定时20MS,20MS为一个周期TL0=-20000%256;TH1=-1500/256;//定时15MS,这时舵机处于0度TL1=-1500%256;EA=1;//开总断TR0=1;//开定时器0ET0=1;TR1=1;//开定时器1ET1=1;}void timer0(void) interrupt 1//定时器0中断函数{pwm=1;TH0=-20000/256;TL0=-20000%256;TR1=1;count++;}void timer1(void) interrupt 3//定时器1中断函数{pwm=0;TH1=-pwm_value/256;TL1=-pwm_value%256;TR1=0;}void main(void)//主函数{uchar i;InitTimer();pwm_value=1500;while(1){for(i=0;i<5;i++){pwm_value=value[i];//通过数组就可以改变舵机的转角度delay_ms(1000);}}}

以上就是关于51单片机按键控制舵机问题全部的内容,包括:51单片机按键控制舵机问题、51单片机里如何控制舵机按键 *** 作转动的角度为1度、单片机控制舵机程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9657163.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存