久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

QQ登錄

只需一步,快速開始

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

單片機(jī)驅(qū)動(dòng)sg90舵機(jī)程序問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:370407 發(fā)表于 2020-3-2 09:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
t = 0.5ms——————-舵機(jī)會(huì)轉(zhuǎn)動(dòng) 0 °      
t = 1.0ms——————-舵機(jī)會(huì)轉(zhuǎn)動(dòng) 45°
t = 1.5ms——————-舵機(jī)會(huì)轉(zhuǎn)動(dòng) 90°
t = 2.0ms——————-舵機(jī)會(huì)轉(zhuǎn)動(dòng) 135°
t = 2.5ms——————-舵機(jī)會(huì)轉(zhuǎn)動(dòng)180

//        為什么只能轉(zhuǎn)一次后面有程序?yàn)槭裁床粓?zhí)行?
//        delayus2x(245);      這個(gè)245值是怎么算出來的?
#include<reg52.h>
sbit a=P1^0;
#define uchar unsigned char
#define uint unsigned int
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

void delayus2x(unsigned char t)
{   
while(--t);
}

void delay500us()
{
                delayus2x(245);   //   245

}
void delay2500us()
{
                delayus2x(245);     
                delayus2x(245);
                delayus2x(245);
                delayus2x(245);
                delayus2x(245);
                delayus2x(245);

}
void main()     
{
while(1)
{
            uint i=50;
                while(--i)                           
                {
                        a=1;
                        delay500us();    //      轉(zhuǎn)0度       為什么換成  delay2500us(); 也是轉(zhuǎn)一下   不執(zhí)行下面的程序   
                        a=0;
                        delay(1000);

                        
                        a=1;
                        delay2500us();  //      轉(zhuǎn)180度      這里明明還有動(dòng)作
                        a=0;
                        delay(1000);
                        a=1;
                        delay500us();   //      轉(zhuǎn)0度
                        a=0;
                        delay(1000);
                        a=1;
                        delay2500us();  //      轉(zhuǎn)180度
                        a=0;
                        delay(1000);
                }  
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:282850 發(fā)表于 2020-3-2 11:31 | 只看該作者
舵機(jī)驅(qū)動(dòng)原理是:20ms中高電平占多少,對(duì)應(yīng)多少角度,不是發(fā)一個(gè)脈沖就能到位的,原則上是發(fā)多個(gè)相同的脈沖,到了相應(yīng)角度,舵機(jī)停在此角度,如果有外力破壞了此角度,它能重新修正到此角度。
“多個(gè)相同的脈沖”是關(guān)鍵。或者說反復(fù)、重復(fù)一直發(fā)脈沖。
你  while(--i)                           
                {
中是只有一個(gè)脈沖的做法,思路需重理
回復(fù)

使用道具 舉報(bào)

板凳
ID:682002 發(fā)表于 2020-3-2 11:40 | 只看該作者
這個(gè)是模擬舵機(jī),需要總寬度為20ms的占空比連續(xù)信號(hào)。
回復(fù)

使用道具 舉報(bào)

地板
ID:342451 發(fā)表于 2020-3-2 11:45 | 只看該作者
這是我當(dāng)時(shí)寫的一個(gè)簡(jiǎn)單的51定時(shí)器輸出PWM方式控制三個(gè)舵機(jī)按順序依次旋轉(zhuǎn)。你可以借鑒下,不推薦用延遲函數(shù)的方式去控制舵機(jī)

#include "reg51.h"//此文件中定義了單片機(jī)的一些特殊功能寄存器

typedef unsigned int u16;//對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

sbit KEY=P3^1;//控制按鍵

sbit Servo_1=P2^0;//舵機(jī)輸出
sbit Servo_2=P2^1;//舵機(jī)輸出
sbit Servo_3=P2^2;//舵機(jī)輸出

u16 Servo_PWM1,Servo_PWM2,Servo_PWM3;//三個(gè)舵機(jī)的PWM值

//PWM:5-22  
//對(duì)應(yīng)0-180°
#define LOW 5
#define HIGH 22

u8  Flag_step;//舵機(jī)動(dòng)作步驟
bit start;//隨著按鍵按下開始動(dòng)作

void delay_ms(u16 j)  //j=1,1ms
{
        u8 i=250;
        for(;j>0;j--)
        {
                 while(--i);
                 i=249;
                 while(--i);
                 i=250;
        }
}

void step(void)//舵機(jī)動(dòng)作
{
        if(start==1)//按鍵按下,標(biāo)志位置1,滿足條件進(jìn)入if()
        {
                if(Flag_step==1)//第一步
                {
                        Servo_PWM1=HIGH;//一舵機(jī)轉(zhuǎn)到180
                        delay_ms(500);//延時(shí)一段時(shí)間,根據(jù)需求更改時(shí)間,靈活可調(diào)
                        Flag_step=2;        //下一步                               
                }
                if(Flag_step==2)//第二步
                {
                        Servo_PWM1=LOW;//一舵機(jī)轉(zhuǎn)到0
                        delay_ms(500);//延時(shí)一段時(shí)間
                        Flag_step=3;//下同,分別是二三舵機(jī)動(dòng)作
                }
                if(Flag_step==3)
                {
                        Servo_PWM2=HIGH;
                        delay_ms(500);
                        Flag_step=4;                       
                }
                if(Flag_step==4)
                {
                        Servo_PWM2=LOW;
                        delay_ms(500);
                        Flag_step=5;                       
                }
                if(Flag_step==5)
                {
                        Servo_PWM3=HIGH;
                        delay_ms(500);
                        Flag_step=6;                       
                }
                if(Flag_step==6)
                {
                        Servo_PWM3=LOW;
                        delay_ms(500);
                        Flag_step=1;//形成一個(gè)循環(huán),回到第一步
                        start=0;//將標(biāo)志位置0,等待下一次按鍵按下,將標(biāo)志位置1,重新開始一周期
                }
        }
}
/*******************************************************************************
* 函 數(shù) 名         : Timer1Init
* 函數(shù)功能                   : 定時(shí)器1初始化
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer1Init()
{
        TMOD|=0X10;//選擇為定時(shí)器1模式,工作方式1,僅用TR1打開啟動(dòng)。
        TH1=0XFF;        //給定時(shí)器賦初值,定時(shí)0.1ms
        TL1=0X9C;       
        ET1=1;//打開定時(shí)器1中斷允許
        EA=1;//打開總中斷
        TR1=1;//打開定時(shí)器                       
}
/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                   : 主函數(shù)
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{       
        Timer1Init();//定時(shí)器1初始化
        start=0;//初始狀態(tài)舵機(jī)不動(dòng)作
        Flag_step=1;//初始第一步
        Servo_PWM1=5;//將三個(gè)舵機(jī)初始化成0°位置
        Servo_PWM2=5;
        Servo_PWM3=5;
        while(1)
        {
                if(KEY==0)//按鍵按下
                {
                        start=~start;//重新開始一個(gè)周期
                        while(!KEY);//等待按鍵松開
                }
                step();//舵機(jī)動(dòng)作
        }               
}
/*******************************************************************************
* 函 數(shù) 名         : void Timer1() interrupt 3
* 函數(shù)功能                     : 定時(shí)器0中斷函數(shù)
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Timer1() interrupt 3
{
        static u16 t;
        TH1=0XFF;        //給定時(shí)器賦初值,定時(shí)0.1ms
        TL1=0X9C;
        t++;
        //根據(jù)改變Servo_PWM1內(nèi)容,改變占空比,從而達(dá)到控制舵機(jī)達(dá)到不同的角度
        //————      ————
        //    ——————    ————————.......
        if(t<Servo_PWM1)Servo_1=1;//高電平輸出
        if(t>=Servo_PWM1)Servo_1=0;//低電平輸出
       
        if(t<Servo_PWM2)Servo_2=1;
        if(t>=Servo_PWM2)Servo_2=0;
       
        if(t<Servo_PWM3)Servo_3=1;
        if(t>=Servo_PWM3)Servo_3=0;       
       
        if(t>200)t=0;//舵機(jī)控制頻率50HZ,200*0.1=20ms
}

回復(fù)

使用道具 舉報(bào)

5#
ID:697917 發(fā)表于 2020-3-2 15:49 | 只看該作者
舵機(jī)不是直流電機(jī),給電即走,他是通過脈沖占空比來驅(qū)動(dòng)的。
回復(fù)

使用道具 舉報(bào)

6#
ID:687694 發(fā)表于 2020-3-2 22:33 | 只看該作者
先仔細(xì)了解一下舵機(jī)驅(qū)動(dòng)原理吧,你這個(gè)代碼驅(qū)動(dòng)不了的。另外延遲函數(shù)1個(gè)就夠了,搞那么多延遲干嘛呢。
回復(fù)

使用道具 舉報(bào)

7#
ID:679425 發(fā)表于 2020-3-4 15:33 | 只看該作者
先仔細(xì)了解一下舵機(jī)驅(qū)動(dòng)原理吧,你這個(gè)代碼驅(qū)動(dòng)不了的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品国产a久久久久久 午夜影院网站 | 欧美一区不卡 | 91黄色免费看 | 无码日韩精品一区二区免费 | 在线成人精品视频 | 最新中文字幕第一页视频 | 99视频在线免费观看 | 成人在线中文 | 久久亚洲一区 | 国产在线网站 | 国产做爰 | 欧美三级在线 | 亚洲乱码一区二区三区在线观看 | 日韩a| 精品一区二区观看 | 日韩一级在线 | 亚洲欧美一区二区三区国产精品 | 午夜精品视频在线观看 | 国产精品亚洲第一 | 一区二区三区视频在线 | 欧美一区二区免费 | 欧美第一区 | 国产精品1区2区 | 91av在线免费播放 | 国产成人jvid在线播放 | 黄色免费在线观看网址 | 亚洲国产小视频 | 亚洲欧美中文日韩在线v日本 | 中文在线一区 | 人人做人人澡人人爽欧美 | 涩爱av一区二区三区 | 久久一区二区精品 | 中文字幕在线观看一区二区 | 男人的天堂久久 | 性一交一乱一透一a级 | 国产精品免费一区二区三区四区 | 在线看av的网址 | 天天干狠狠干 | 亚洲欧美日本在线 | 午夜视频一区 | 成人精品一区二区三区 |