找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5901|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)怎么控制舵機(jī)這樣旋轉(zhuǎn)。

  [復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 200 黑幣 回復(fù)本帖可獲得 10 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:421090 發(fā)表于 2018-11-5 15:35 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
可以通過程序來這樣控制嘛?我按一個(gè)鍵位,舵機(jī)轉(zhuǎn)動(dòng)90度然后轉(zhuǎn)回去。我按第二個(gè)鍵位舵機(jī)來回轉(zhuǎn)動(dòng)90度(5次)?梢酝ㄟ^一個(gè)舵機(jī)來控制嗎?如果不可以那么分開用一個(gè)單片機(jī)控制兩個(gè)舵機(jī)可以做到嘛?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:421090 發(fā)表于 2018-11-5 15:36 | 只看該作者
如果能有大佬寫程序的話可以在加黑幣。本人窮逼只能送黑幣希望有大佬幫幫忙。
回復(fù)

使用道具 舉報(bào)

板凳
ID:228467 發(fā)表于 2018-11-5 22:02 | 只看該作者
可以實(shí)現(xiàn)的,51單片機(jī)和STM32都可以的
回復(fù)

使用道具 舉報(bào)

地板
ID:421482 發(fā)表于 2018-11-6 08:54 | 只看該作者
電機(jī) 加驅(qū)動(dòng)模塊 加單片機(jī)就可以了
回復(fù)

使用道具 舉報(bào)

5#
ID:246251 發(fā)表于 2018-11-6 10:22 | 只看該作者
pwm控制
回復(fù)

使用道具 舉報(bào)

6#
ID:394504 發(fā)表于 2018-11-7 18:13 | 只看該作者
單片機(jī)是不能直接接在電機(jī)上的 所以要加驅(qū)動(dòng)模塊隔離 兩個(gè)按鍵 直接判斷是哪個(gè)按鍵按下再給接驅(qū)動(dòng)的io輸出是轉(zhuǎn)一次 還是5次的的程序不就好了嗎
回復(fù)

使用道具 舉報(bào)

7#
ID:422557 發(fā)表于 2018-11-7 20:00 | 只看該作者
脈寬調(diào)頻控制
回復(fù)

使用道具 舉報(bào)

8#
ID:422604 發(fā)表于 2018-11-7 20:53 | 只看該作者
pwm脈沖帶寬調(diào)制,用stm32,杜洋教程有詳細(xì)介紹
回復(fù)

使用道具 舉報(bào)

9#
ID:422604 發(fā)表于 2018-11-7 20:56 | 只看該作者
b站中杜洋教程有stm32,pwm控制的詳細(xì)介紹視頻以及工程
回復(fù)

使用道具 舉報(bào)

10#
ID:419294 發(fā)表于 2018-11-8 13:03 | 只看該作者
#include <reg52.h>
unsigned char count;      //0.5ms次數(shù)標(biāo)識(shí)
sbit pwm =P0^1 ;          //PWM信號(hào)輸出
sbit jia =P1^2;           //角度增加按鍵檢測(cè)IO口
sbit jan =P1^1;           //角度減少按鍵檢測(cè)IO口
unsigned char jd;         //角度標(biāo)識(shí)
void delay(unsigned char i)//延時(shí)
{
  unsigned char j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
void Time0_Init()          //定時(shí)器初始化
{
TMOD = 0x01;           //定時(shí)器0工作在方式1   
IE   = 0x82;
TH0  = 0xfe;
TL0  = 0x33;     //11.0592MZ晶振,0.5ms
    TR0=1;                 //定時(shí)器開始
}
void Time0_Int() interrupt 1 //中斷程序
{
TH0  = 0xfe;             //重新賦值
TL0  = 0x33;
    if(count< jd)              //判斷0.5ms次數(shù)是否小于角度標(biāo)識(shí)
      pwm=1;                  //確實(shí)小于,PWM輸出高電平
    else
      pwm=0;                  //大于則輸出低電平
    count=(count+1);          //0.5ms次數(shù)加1
    count=count%40;     //次數(shù)始終保持為40 即保持周期為20ms
}
void keyscan()              //按鍵掃描
{
   if(jia==0)               //角度增加按鍵是否按下
  {
    delay(10);              //按下延時(shí),消抖
    if(jia==0)              //確實(shí)按下
     {
      jd++;                 //角度標(biāo)識(shí)加1
      count=0;              //按鍵按下 則20ms周期從新開始
      if(jd==6)
        jd=5;               //已經(jīng)是180度,則保持
      while(jia==0);        //等待按鍵放開
     }
  }
  if(jan==0)                //角度減小按鍵是否按下
  {
    delay(10);
    if(jan==0)
     {
      jd--;                 //角度標(biāo)識(shí)減1
      count=0;
      if(jd==0)
        jd=1;               //已經(jīng)是0度,則保持
      while(jan==0);
     }
  }
}
void main()
{
jd=3;
count=0;
Time0_Init();            
while(1)
{
  keyscan();               //按鍵掃描
  
}
}
回復(fù)

使用道具 舉報(bào)

11#
ID:423083 發(fā)表于 2018-11-8 16:26 | 只看該作者
可以啊,舵機(jī)轉(zhuǎn)動(dòng)的角度是跟pwm波的占空比對(duì)應(yīng)的
回復(fù)

使用道具 舉報(bào)

12#
ID:423225 發(fā)表于 2018-11-8 20:26 | 只看該作者
程序控制的吧
回復(fù)

使用道具 舉報(bào)

13#
ID:423287 發(fā)表于 2018-11-8 21:45 | 只看該作者
操作步驟: 1 單片機(jī),舵機(jī),電源共地; 2 用兩個(gè)穩(wěn)壓芯片進(jìn)行供電,將電源分開來; 3 舵機(jī)信號(hào)端沒有直接連接單片機(jī)IO口,我串了一個(gè)10K的電阻,也就是這一步之后就可以控制舵機(jī)。
回復(fù)

使用道具 舉報(bào)

14#
ID:423287 發(fā)表于 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++;
回復(fù)

使用道具 舉報(bào)

15#
ID:423287 發(fā)表于 2018-11-8 21:47 | 只看該作者
操作步驟:
1 單片機(jī),舵機(jī),電源共地;
2 用兩個(gè)穩(wěn)壓芯片進(jìn)行供電,將電源分開來;
3 舵機(jī)信號(hào)端沒有直接連接單片機(jī)IO口,我串了一個(gè)10K的電阻,也就是這一步之后就可以控制舵機(jī)
回復(fù)

使用道具 舉報(bào)

16#
ID:422661 發(fā)表于 2018-11-17 12:34 | 只看該作者
回復(fù)

使用道具 舉報(bào)

17#
ID:428557 發(fā)表于 2018-11-18 20:35 | 只看該作者
[圖片][圖片] 一個(gè)就能做到
回復(fù)

使用道具 舉報(bào)

18#
ID:429166 發(fā)表于 2018-11-19 17:57 | 只看該作者
可以通過代買來實(shí)現(xiàn)的,可以通過一個(gè)舵機(jī)來實(shí)現(xiàn)的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表