找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4954|回复: 17
打印 上一主题 下一主题
收起左侧

单片机怎么控制舵机这样旋转啊?

  [复制链接]
回帖奖励 200 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:421090 发表于 2018-11-5 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
可以通过程序来这样控制嘛?我按一个键位,舵机转动90度然后转回去。我按第二个键位舵机来回转动90度(5次)。可以通过一个舵机来控制吗?如果不可以那么分开用一个单片机控制两个舵机可以做到嘛?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:421090 发表于 2018-11-5 15:36 | 只看该作者
如果能有大佬写程序的话可以在加黑币。本人穷逼只能送黑币希望有大佬帮帮忙。
回复

使用道具 举报

板凳
ID:228467 发表于 2018-11-5 22:02 | 只看该作者
可以实现的,51单片机和STM32都可以的
回复

使用道具 举报

地板
ID:421482 发表于 2018-11-6 08:54 | 只看该作者
电机 加驱动模块 加单片机就可以了
回复

使用道具 举报

5#
ID:246251 发表于 2018-11-6 10:22 | 只看该作者
pwm控制
回复

使用道具 举报

6#
ID:394504 发表于 2018-11-7 18:13 | 只看该作者
单片机是不能直接接在电机上的 所以要加驱动模块隔离 两个按键 直接判断是哪个按键按下再给接驱动的io输出是转一次 还是5次的的程序不就好了吗
回复

使用道具 举报

7#
ID:422557 发表于 2018-11-7 20:00 | 只看该作者
脉宽调频控制
回复

使用道具 举报

8#
ID:422604 发表于 2018-11-7 20:53 | 只看该作者
pwm脉冲带宽调制,用stm32,杜洋教程有详细介绍
回复

使用道具 举报

9#
ID:422604 发表于 2018-11-7 20:56 | 只看该作者
b站中杜洋教程有stm32,pwm控制的详细介绍视频以及工程
回复

使用道具 举报

10#
ID:419294 发表于 2018-11-8 13:03 | 只看该作者
#include <reg52.h>
unsigned char count;      //0.5ms次数标识
sbit pwm =P0^1 ;          //PWM信号输出
sbit jia =P1^2;           //角度增加按键检测IO口
sbit jan =P1^1;           //角度减少按键检测IO口
unsigned char jd;         //角度标识
void delay(unsigned char i)//延时
{
  unsigned char j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
void Time0_Init()          //定时器初始化
{
TMOD = 0x01;           //定时器0工作在方式1   
IE   = 0x82;
TH0  = 0xfe;
TL0  = 0x33;     //11.0592MZ晶振,0.5ms
    TR0=1;                 //定时器开始
}
void Time0_Int() interrupt 1 //中断程序
{
TH0  = 0xfe;             //重新赋值
TL0  = 0x33;
    if(count< jd)              //判断0.5ms次数是否小于角度标识
      pwm=1;                  //确实小于,PWM输出高电平
    else
      pwm=0;                  //大于则输出低电平
    count=(count+1);          //0.5ms次数加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(jan==0)                //角度减小按键是否按下
  {
    delay(10);
    if(jan==0)
     {
      jd--;                 //角度标识减1
      count=0;
      if(jd==0)
        jd=1;               //已经是0度,则保持
      while(jan==0);
     }
  }
}
void main()
{
jd=3;
count=0;
Time0_Init();            
while(1)
{
  keyscan();               //按键扫描
  
}
}
回复

使用道具 举报

11#
ID:423083 发表于 2018-11-8 16:26 | 只看该作者
可以啊,舵机转动的角度是跟pwm波的占空比对应的
回复

使用道具 举报

12#
ID:423225 发表于 2018-11-8 20:26 | 只看该作者
程序控制的吧
回复

使用道具 举报

13#
ID:423287 发表于 2018-11-8 21:45 | 只看该作者
操作步骤: 1 单片机,舵机,电源共地; 2 用两个稳压芯片进行供电,将电源分开来; 3 舵机信号端没有直接连接单片机IO口,我串了一个10K的电阻,也就是这一步之后就可以控制舵机。
回复

使用道具 举报

14#
ID:423287 发表于 2018-11-8 21:46 | 只看该作者
#include<REG52.H>
#define OUT P0
#define CON P2
#define ms0_5Con  461
#define ms2_5Con  2304
typedef unsigned char unit8;
typedef unsigned short unit_16;

sbit servo0=OUT^0;
sbit servo1=OUT^1;
sbit servo2=OUT^2;
sbit servo3=OUT^3;
sbit servo4=OUT^4;
sbit servo5=OUT^5;
sbit servo6=OUT^6;
sbit servo7=OUT^7;

sbit KEY1=CON^0;
sbit KEY2=CON^1;

unit_16 pwm[8]={1382,1382,1382,1382,1382,1382,1382,1382}; //??90?,(???1382.4,???1382)  

void Inter_Form()
{
        TMOD|=0x01;
        TH0  =0xf7;
        TL0  =0x00;
        TR0  =1;
        ET0  =1;
        EA   =1;
}

void delay(unit8 x)
{
        unit8 i=0;
        while(x--)
        {
                for(i=0;i<125;i++);
        }
}
/*------------------------?????--------------------------*/
/*unit_16 Transform(uchar val)
{
//0?=0.5ms, 45?=1ms, 90?=1.5ms, 135?=2ms, 180?=2.5ms
//2.5 ms??? F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)
//return (unit_16)(((float)(2/180)*X+0.5)/1000*11059200/12);
unit_16 a = (val+46)*10;
if(a<ms0_5Con)
a=ms0_5Con;
if(a>ms2_5Con)
a=ms2_5Con;
return a;
}  */

/*-------------------------???---------------------------*/  

void Steering_UP(unit8 val)
{
if(pwm[val]>ms2_5Con)
pwm[val]=ms2_5Con;
pwm[val]=pwm[val]+10;
}

void Steering_Down(unit8 val)
{
if(pwm[val]<ms0_5Con)
pwm[val]=ms0_5Con;
pwm[val]=pwm[val]-10;
}

void main(void)
{
Inter_Form();
while(1)
{
if(!KEY1)
   {
   delay(2);
   if(!KEY1)
   Steering_UP(0);
   }
   else if(!KEY2)
   {
        delay(2);
   if(!KEY2)
   Steering_Down(0);
   }                 
}
}

/*------------------------??????--------------------------*/
void SteeringGear() interrupt 1
{
        static unit8 pwm_flag=0;
switch(pwm_flag)
{
case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
case 13: servo6=1; TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
case 14: servo6=0; TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
case 15: servo7=1; TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
case 16: servo7=0; TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
default:TH0=0xff; TL0=0x80; pwm_flag=0;
}
pwm_flag++;
回复

使用道具 举报

15#
ID:423287 发表于 2018-11-8 21:47 | 只看该作者
操作步骤:
1 单片机,舵机,电源共地;
2 用两个稳压芯片进行供电,将电源分开来;
3 舵机信号端没有直接连接单片机IO口,我串了一个10K的电阻,也就是这一步之后就可以控制舵机
回复

使用道具 举报

16#
ID:422661 发表于 2018-11-17 12:34 | 只看该作者
回复

使用道具 举报

17#
ID:428557 发表于 2018-11-18 20:35 | 只看该作者
[图片][图片] 一个就能做到
回复

使用道具 举报

18#
ID:429166 发表于 2018-11-19 17:57 | 只看该作者
可以通过代买来实现的,可以通过一个舵机来实现的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表