1、确认舵机的控制方式:舵机的控制方式有多种,如PWM、串口等。要实现按键控制舵机旋转,需要先确定舵机的控制方式,并选用相应的控制模块。
2、连接舵机控制模块:将舵机控制模块与上位机通过串口或其他通讯方式连接,确保上位机可以与舵机控制模块进行通讯。
3、编写控制程序:使用编程软件编写控制程序,实现按键控制舵机旋转的功能。具体实现方式可以根据舵机控制模块的说明文档和编程手册进行编写。
4、设置按键功能:在上位机软件中设置按键功能,使按键触发相应的控制程序,实现控制舵机旋转的功能。具体实现方式可以根据上位机软件的说明文档和使用手册进行设置。
#include<reg52h>
#define uint unsigned int
#define uchar unsigned char
uchar k; //k表示总时间 因为定时器中断要用到k,所以放在程序头
sbit PWM1=P1^0;
sbit key1=P3^7; //舵机启动开关
void init()
{
TMOD=0X01;
TH0=(65536-92)/256;
TL0=(65536-92)%256;
EA=1;
ET0=1;
TR0=1;
}
void jiman20() //51模拟PWM波函数
{
static uchar flag=0,j=0; //flag当做PWM高电平变宽/变窄的标志;
//j表示高电平持续的时间;k表示总时间因为重复调用该函数
if(k==200) //第一步:判断计时满20ms
{
k=0; //k归零
if(flag==0) //标志为0时,高电平标志增加
j++;
else //标志为1时,高电平标志减小
j--;
if(j>=25) //当j=25时,高电平持续时间为25ms,此时角度为180
flag=1; //必须改变宽/窄标志。
if(j<=0) //当j=0时,高电平持续时间为0ms,此时角度为0
flag=0; //必须改变宽/窄标志。
}
if(k<j) //第二步:在20ms判断结束的基础上,输出PWM
PWM1=1; //因为每20ms,k就归0所以能通过判断k<j,输出高电平
else PWM1=0;
}
void main()
{
uint i=60000;
init();
while(i--) //一开机就让舵机有一个转动
{
jiman20();
}
while(1)
{
while(key1==0) //当开关打开,启动定时器,进入转动程序并循环
{
TR0=1;
jiman20();
}
TR0=0; //当开关关闭,关闭定时器,舵机保持最末时刻状
}
}
void timer() interrupt 1 //定时器计时01ms,即模拟PWM是以01s为分度,
//高电平逐渐增加/减少
{
TR0=0;
TH0=(65536-92)/256;
TL0=(65536-92)%256;
TR0=1;
k++;
}
实测能用,不谢!
//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;
}
//配置 回中
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO| RCC_APB2Periph_GPIOA
| RCC_APB2Periph_TIM1, ENABLE);
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/ TIM pin configuration /
GPIO_InitStructureGPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureGPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/ Time base configuration /
TIM_TimeBaseStructureTIM_Period =19999;
TIM_TimeBaseStructureTIM_Prescaler = 71;
TIM_TimeBaseStructureTIM_ClockDivision = 0;
TIM_TimeBaseStructureTIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/ TIM1 PWM1 Mode configuration: Channel 1,2/
TIM_OCInitStructureTIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructureTIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructureTIM_Pulse = 1499;
TIM_OCInitStructureTIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
}
//改变角度500——-90,2500——90
TIM_SetCompare1(TIM1, Compare1);
TIM_SetCompare2(TIM1, Compare1);
因为舵机中有电位器,输出15ms宽度的脉冲宽度是正90度,所以你可以写一个for循环,然后引进一个参数,不停地改变05ms到25ms之间的脉冲宽度就行了。(用延迟函数可以调整速度)希望能帮到你!
我现在也在做舵机控制,这是控制一个舵机的程序,可以参考!
通过按键,改变单片机输出脉冲宽度1ms~2ms,使舵机在-90°~+90°间转动
ORG 0000H
AJMP MAIN ;转主程序
ORG 000BH
AJMP INTT0 ;转定时中断子程序
MAIN: MOV SP,#80H
SETB EA ;开总中断
SETB ET0 ;允许T0中断
CLR P37 ;脉冲波形起始状态
MOV TMOD,#01H ;定时,方式0
MOV 30H,#2EH ;舵机0 位,15ms定时初始值,TL0值存30H
MOV 31H,#0FAH ;TH0值存31H
MOV 32H,#0B2H ;185ms定时初始值,TL0值存32H
MOV 33H,#0B7H ;TH0存33H
CLR F0 ;清标志位
SETB TR0 ;启动T0
K1: JB P14,K2 ;右转键未按下,转K2,判左转键
ACALL D10MS ;按下,延时,防抖
JNB P14,$ ;等待释放
ACALL D10MS
MOV A,30H
CJNE A,#3AH,K10 ;判断是否到90°
AJMP K2 ;到90°,不改变定时时间常数,转K2
K10: CLR C ;未到90°,清进位位,下条指令为带进位减,必须先清进位
SUBB A,#20 ;减小时间常数,即加大高电平脉冲宽度,每次002ms递增,舵机转动36°
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 P15,K3
ACALL D10MS
JNB P15,$
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 P16,K1 ;判断电机回0 键是否按下
ACALL D10MS
JNB P16,$
ACALL D10MS
MOV 30H,#2EH ;舵机0 位,脉宽15ms
MOV 31H,#0FAH
MOV 32H,#0B2H
MOV 33H,#0B7H
AJMP K1
INTT0: CPL F0 ;中断服务程序
CPL P37 ;输出高、低电平脉冲
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单片机控制舵机的程序 我用的郭天祥书上的程序 舵机内部只响一下 也不转、单片机控制舵机程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)