导航:首页 > 编程语言 > 舵机控制编程入门

舵机控制编程入门

发布时间:2023-08-05 14:04:41

❶ 急求51单片机控制舵机C语言程序,舵机可以根据设定旋转任意角度!急求啊,大神帮帮忙!非常感谢!

#include<reg52.h>typedef unsigned int uint;typedef unsigned char uchar;sbit pwm=P0^3;//输出PWM信号uchar count=0;uint pwm_value=1500;//初值为1.5msuint 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;//定时1.5MS,这时舵机处于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);}}}

❷ 那位大神给段c语言控制舵机从0~180持续来回转动的程序,不胜感激

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的值,舵机角度随之改变。参数参照以上1.2点。
TL TH
_____ ____
_________| |_________| | _________|
4. 电路原理很简单,接好电源,地,信号线。
信号线接到单片机或者其他能输出PWM的控制脚。

❸ 如何用51单片机控制舵机的单片机程序是怎么写的希望你也能给我发一个编写程序和电路图

单片机系统实现对舵机输出转角的控制,必须首先完成两项任务:首先,产生基本的PWM周期信号,即产生20ms的周期信号;其次,调整脉宽,即单片机调节PWM信号的占空比。单片机能使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将PWM信号输出到舵机。
发一个自己原来写的简单的。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,jd;
sbit pwm=P1^0;
sbit jia=P3^2;
sbit jian=P3^3;
uchar code table[10] = {0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
//延时函数
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);

}
//定时器初始化
void Time0_init()
{
TMOD=0x01; //定时器0工作方式1
IE=0x82;
TH0=0xfe;
TL0=0x33; //11.0592MHZ晶振,0.5ms
TR0=1;
}
//定时器0中断程序
void Time0() interrupt 1
{
TH0=0xfe;
TL0=0x33;
if(count<jd) //判断0.5ms次数是否小于角度标识
pwm=1; //是,pwm输出高电平
else
pwm=0; //否,输出低电平
count=count+1;
count=count%40; //次数始终保持为40,即保持周期为20ms
}
//按键扫描
void keyscan()
{
if(jia==0)
{
delay(10);
if(jia==0)
{
jd++; //角度增加 1
count=0; //按键按下则20ms周期重新开始计时
if(jd==6)
jd=5; //已经是180度,保持
while(jia==0);
}
}
if(jian==0)
{
delay(10);
if(jian==0)
{
jd--;
count=0;
if(jd==0)
jd=1; //已经0度,保持
while(jian==0);
}
}
}
//数码管显示
void display()
{
uchar ,shi,ge ;
switch(jd)
{
case 1:
=0;
shi=0;
ge=0;
break;
case 2:
=0;
shi=4;
ge=5;
break;
case 3:
=0;
shi=9;
ge=0;
break;
case 4:
=1;
shi=3;
ge=5;
break;
case 5:
=1;
shi=8;
ge=0;
break;
}
P0=table[];
P2=1;
delay(5);
P0=table[shi];
P2=2;
delay(5);
P0=table[ge];
P2=3;
delay(5);
}
void main()
{
//jd=1;
count=0;
Time0_init();
while(1)
{
keyscan();
display();
}
}
电路图很简单的,几个按键,再在单片机最小系统上接出一个信号线,再给舵机供上电就可以了。

❹ 跪求51单片机控制舵机程序(切记,单片机,不要弄个C来忽悠啊)

我现在也在做舵机控制,这是控制一个舵机的程序,可以参考!
通过按键,改变单片机输出脉冲宽度1ms~2ms,使舵机在-90°~+90°间转动

ORG 0000H
AJMP MAIN ;转主程序
ORG 000BH
AJMP INTT0 ;转定时中断子程序

MAIN: MOV SP,#80H
SETB EA ;开总中断
SETB ET0 ;允许T0中断
CLR P3.7 ;脉冲波形起始状态
MOV TMOD,#01H ;定时,方式0
MOV 30H,#2EH ;舵机0 位,1.5ms定时初始值,TL0值存30H
MOV 31H,#0FAH ;TH0值存31H
MOV 32H,#0B2H ;18.5ms定时初始值,TL0值存32H
MOV 33H,#0B7H ;TH0存33H
CLR F0 ;清标志位
SETB TR0 ;启动T0

K1: JB P1.4,K2 ;右转键未按下,转K2,判左转键
ACALL D10MS ;按下,延时,防抖
JNB P1.4,$ ;等待释放
ACALL D10MS
MOV A,30H
CJNE A,#3AH,K10 ;判断是否到90°
AJMP K2 ;到90°,不改变定时时间常数,转K2
K10: CLR C ;未到90°,清进位位,下条指令为带进位减,必须先清进位
SUBB A,#20 ;减小时间常数,即加大高电平脉冲宽度,每次0.02ms递增,舵机转动3.6°
JNC K11
DEC 31H ;借位
K11: MOV 30H,A
CLR C
MOV A,32H
ADD A,#20 ;加大时间常数,即减小低电平脉冲宽度
JNC K12
INC 33H
K12: MOV 32H,A

K2: JB P1.5,K3
ACALL D10MS
JNB P1.5,$
ACALL D10MS
MOV A,30H
CJNE A,#22H,K20
AJMP K3
K20: CLR C
ADD A,#20
JNC K21
INC 31H
K21: MOV 30H,A
CLR C
MOV A,32H
SUBB A,#20
JNC K22
DEC 33H
K22: MOV 32H,A
CLR C

K3: JB P1.6,K1 ;判断电机回0 键是否按下
ACALL D10MS
JNB P1.6,$
ACALL D10MS
MOV 30H,#2EH ;舵机0 位,脉宽1.5ms
MOV 31H,#0FAH
MOV 32H,#0B2H
MOV 33H,#0B7H
AJMP K1

INTT0: CPL F0 ;中断服务程序
CPL P3.7 ;输出高、低电平脉冲
JB F0,HIGH1
LOW0: MOV TL0,32H ;低电平脉冲定时常数
MOV TH0,33H
RETI
HIGH1: MOV TL0,30H ;高电平脉冲定时常数
MOV TH0,31H
RETI
D10MS: MOV R2,#20
MOV R1,#250
DJNZ R1,$
DJNZ R2,$-4
RET

END

❺ 怎么用51单片机控制舵机

操作步骤:
1 单片机,舵机,电源共地;
2 用两个稳压芯片进行供电,将电源分开来;
3 舵机信号端没有直接连接单片机IO口,我串了一个10K的电阻,也就是这一步之后就可以控制舵机。

❻ 求一个PWM单片机简单控制舵机程序

以前帮人解决的;
/**舵机控制——火柴天堂作品-20120314**/
/**50Hz舵机,0.5ms-2.5ms 对应 0-180°(-90°~90°)**/
/**51系列单片机,晶振12MHz,P1.0输出50Hz PWM调制方波(即周期20ms)驱动舵机,方波由T0定时器产生
P11-P17,7个光电检测,P11-130.5°,P12-108°,P13-99°,P14-90°,P15-81°,P16-72°,P17-49.5°,优先级高-低:P14→P11/P17→P12/P16→P13/P15 **/
#include"reg52.h" //包含52系列头文件
#define uchar unsigned char //定义 无符号字符型
#define uint unsigned int //定义 无符号整型
//#define TRUE 1 //定义 逻辑真
//#define FALSE 0 //定义 逻辑假

//最小角度4.5°,时间应该为2ms×4.5°/180°=50us,故定时器T0定时时间为 50us
#define th0 0xce //50us for Model2 at 12HMz Fosc
#define DutyDeno 40 //定义 占空比分母(舵机转动范围) 为:180°/4.5°=40
#define SteeringBasic 10 //舵机基准角 0.5ms, 0.5ms/50us=10
#define SteerineSigne 400 //舵机信号 20ms, 20ms/50us=400
uchar code SteeringList[8]={0,29,24,22,20,18,16,11}; //P11-P17光电检测对应舵机转角列表,单位4.5°,第一个元素为空

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; //定义 占空比分子(舵机转角) 变量,单位4.5°

void Timer0() interrupt 1 //定时器T0 中断 函数
{
static uint ty_time=0; //定义静态变量,作为 占空比 输出时间的参考值(50us)
ty_time=++ty_time%SteerineSigne; //该句等效于:ty_time++;ty_time%=SteerineSigne;
if(ty_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,即舵机转角加4.5°,到180°后,再加归零
DutyNume=SteeringList[PhotoSwitchScan()];
}

void main() //主函数
{
TimerInit(); //调用 定时器初始化 函数
while(1) //循环系统
{
PhotoSwitchResp(); //调用 光电开关响应 函数
}
}

❼ 汽车如何编程

Define Class 环奇小大脚 As 舵机控制
Name = "环奇小大脚"
Procere Init()
This.COM口 = 9
This.速率 = 115200
Return DoDefault()
Endproc
Procere 定义油门曲线()
If Not DoDefault() Then
Return .F.
Endif
*-- 油门
Insert Into 油门曲线 (通道, 位置, 脉冲宽度) Values (0, -1, 1700) && 油门 - 倒车最大
Insert Into 油门曲线 (通道, 位置, 脉冲宽度) Values (0, 0, 1500) && 油门 - 中点
Insert Into 油门曲线 (通道, 位置, 脉冲宽度) Values (0, 0.05, 1450) && 油门 - 不动的
Insert Into 油门曲线 (通道, 位置, 脉冲宽度) Values (0, 1, 1350) && 油门 - 最大
*-- 方向舵
Insert Into 油门曲线 (通道, 位置, 脉冲宽度) Values (1, -1, 1450) && 方向舵 - 最左
Insert Into 油门曲线 (通道, 位置, 脉冲宽度) Values (1, 0, 1370) && 方向舵 - 中点
Insert Into 油门曲线 (通道, 位置, 脉冲宽度) Values (1, 1, 1250) && 方向舵 - 最右
Return .T.
Endproc
Enddefine

Define Class 舵机控制 As Form
Name = "舵机控制"
COM口 = 0
速率 = 115200
Procere Init()
This.定义油门曲线()
Return This.连接舵机控制板()
Endproc
Procere Destory()
*-- 释放串口。
If Type("This.舵机控制板") = "O" Then
If This.舵机控制板.PortOpen Then
This.舵机控制板.PortOpen = .F.
Endif
Endif
Return .T.
Endproc
Procere 定义油门曲线()
*-- 创建油门曲线临时表
Create Cursor 油门曲线 (通道 Integer, 位置 N(6, 4), 脉冲宽度 N(4))
Return .T.
Endproc
Procere 连接舵机控制板()
*-- 没有“舵机控制板”就创建一个。
If Type("This.舵机控制板") <> "O" Then
This.AddObject("舵机控制板", "Olecontrol", "MSCommlib.MSComm")
Endif
*-- 打开串口。
If This.舵机控制板.PortOpen Then
This.舵机控制板.PortOpen = .F.
Endif
This.舵机控制板.CommPort = This.COM口
This.舵机控制板.Settings = Textmerge("<<This.速率>>,n,8,1")
If Not This.舵机控制板.PortOpen Then
This.舵机控制板.PortOpen = .T.
Endif
Return This.舵机控制板.PortOpen
Endproc
Procere 发送指令(通道, 位置)
Local 下限位置, 下限脉冲宽度, 上限位置, 上限脉冲宽度, 当前脉冲宽度, 串口指令代码
m.下限位置 = -1
m.下限脉冲宽度 = 500
m.上限位置 = 1
m.上限脉冲宽度 = 2500
m.当前脉冲宽度 = 1500
m.串口指令代码 = ""
*-- 1 找到当前位置最近的2个曲线值,如果找不到就取默认值 -1, 500 及 1, 2500。
*-- 2 生成指令。
*-- 3 发送给串口。
*-- 1
Select Top 1 * From 油门曲线 Where 通道 = m.通道 And 位置 = m.位置 Order By 位置 Desc Into Cursor curTemp
If Reccount("curTemp") > 0 Then
m.当前脉冲宽度 = curTemp.脉冲宽度
Else
Select Top 1 * From 油门曲线 Where 通道 = m.通道 And 位置 < m.位置 Order By 位置 Desc Into Cursor curTemp
If Reccount("curTemp") > 0 Then
m.下限位置 = curTemp.位置
m.下限脉冲宽度 = curTemp.脉冲宽度
Endif
Select Top 1 * From 油门曲线 Where 通道 = m.通道 And 位置 > m.位置 Order By 位置 Into Cursor curTemp
If Reccount("curTemp") > 0 Then
m.上限位置 = curTemp.位置
m.上限脉冲宽度 = curTemp.脉冲宽度
Endif
m.当前脉冲宽度 = Int((m.上限脉冲宽度 - m.下限脉冲宽度) / (m.上限位置 - m.下限位置) * (m.位置 - m.下限位置) + m.下限脉冲宽度)
Endif
*-- 2
m.串口指令代码 = Textmerge("#<<m.通道>>P<<m.当前脉冲宽度>>")
Debugout m.串口指令代码
*-- 3
This.舵机控制板.OutBufferCount = 0
This.舵机控制板.Output = 串口指令代码 + Chr(13)
Endproc
Enddefine

阅读全文

与舵机控制编程入门相关的资料

热点内容
程序员主动离职和被裁员哪个好 浏览:790
360命令行 浏览:726
程序员骗色 浏览:668
cisco2950重启命令 浏览:459
加密货币区块链可以增发吗 浏览:290
黄龙公式源码 浏览:773
linux系统ftp服务器 浏览:321
山西配电服务器机柜云主机 浏览:452
量化选股模型公式源码 浏览:9
龙卡购车分期怎么绑app 浏览:779
python读取bios信息 浏览:113
程序员老爸初体验 浏览:729
aes加密后长什么样子 浏览:978
语言有编译器吗 浏览:31
解压声控怎么调大音量 浏览:216
缠论中的高精度画笔源码 浏览:824
通用计算型云服务器 浏览:620
程序员手机分享 浏览:296
pdfsmart 浏览:425
nginx部署php 浏览:666