51單片機控制舵機旋轉的設計

2020-11-25 電子發燒友

這裡用到PCF8591 ADDA晶片 和51單片機機,和一個電位器。通過 控制 電位器,產生PWM波,控制舵機 旋轉。並在數碼管上顯示角度。

電路圖

這是程序,、

/*-----------------------------------------------

名稱:IIC協議 PCF8591ADDA轉換

內容:此程序通過IIC協議對DAAD晶片操作,讀取電位器的電壓,並輸出模擬量,用LED亮度漸變指示,晶體選用12MHz

------------------------------------------------*/

#include「reg52.h」

#include //包含NOP空指令函數_nop_();

#define AddWr 0x90 //寫數據地址

#define AddRd 0x91 //讀數據地址

sbit Sda=P1^2; //定義總線連接埠

sbit Scl=P1^1;

sbit control_signal=P1^5;

data unsigned int Display[8];//定義臨時存放數碼管數值

unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段數共陰碼管段碼錶

unsigned int ADtemp; //定義全局變量

unsigned int high,low;

static unsigned int count1;

/*------------------------------------------------

延時程序

------------------------------------------------*/

void mDelay(unsigned char j)

{

unsigned int i;

for(;j》0;j--)

{

for(i=0;i《125;i++)

{;}

}

}

/*------------------------------------------------

初始化定時器0

------------------------------------------------*/

void Init_Timer0(void)

{

TMOD 「=0x01; //定時器設置 0.1ms in 11.0592M crystal

TH0=(65536-78)/256;

TL0=(65536-78)%256; //定時0.1mS

ET0=1;//定時器中斷打開

EA=1;//總中斷

TR0=1; //啟動定時器0

}

/*------------------------------------------------

啟動IIC總線

------------------------------------------------*/

void Start(void)

{

Sda=1;

_nop_();

Scl=1;

_nop_();

Sda=0;

_nop_();

Scl=0;

}

/*------------------------------------------------

停止IIC總線

------------------------------------------------*/

void Stop(void)

{

Sda=0;

_nop_();

Scl=1;

_nop_();

Sda=1;

_nop_();

Scl=0;

}

/*------------------------------------------------

應答IIC總線

------------------------------------------------*/

void Ack(void)

{

Sda=0;

_nop_();

Scl=1;

_nop_();

Scl=0;

_nop_();

}

/*------------------------------------------------

非應答IIC總線

------------------------------------------------*/

void NoAck(void)

{

Sda=1;

_nop_();

Scl=1;

_nop_();

Scl=0;

_nop_();

}

/*------------------------------------------------

發送一個字節

------------------------------------------------*/

void Send(unsigned char Data)

{

unsigned char BitCounter=8;

unsigned char temp;

do

{

temp=Data;

Scl=0;

_nop_();

if((temp&0x80)==0x80)

Sda=1;

else

Sda=0;

Scl=1;

temp=Data《《1;

Data=temp;

BitCounter--;

}

while(BitCounter);

Scl=0;

}

/*------------------------------------------------

讀入一個字節並返回

------------------------------------------------*/

unsigned char Read(void)

{

unsigned char temp=0;

unsigned char temp1=0;

unsigned char BitCounter=8;

Sda=1;

do

{

Scl=0;

_nop_();

Scl=1;

_nop_();

if(Sda)

temp=temp|0x01;

else

temp=temp&0xfe;

if(BitCounter-1)

{

temp1=temp《《1;

temp=temp1;

}

BitCounter--;

}

while(BitCounter);

return(temp);

}

/*------------------------------------------------

讀取AD模數轉換的值,有返回值

------------------------------------------------*/

unsigned int ReadADC(unsigned char Chl)

{

unsigned int Data;

Start(); //啟始信號

Send(AddWr);//0x90

Ack();

Send(0x40|Chl);//寫入選擇的通道,本程序只用單端輸入,差分部分需要自行添加

//Chl的值分別為0、1、2、3,分別代表1-4通道

Ack();

Start();

Send(AddRd); //讀入地址

Ack();

Data=Read(); //讀數據

Scl=0;

NoAck();

Stop();

return Data; //返回值

}

/******************************************************************/

/* 主程序 */

/******************************************************************/

void main()

{

Init_Timer0();

while(1)

{

unsigned int angle;

ADtemp=ReadADC(0); //ADtemp的取值範圍是0-255,定時的時間範圍是0.5-2.5ms

high=65075-7.2*ADtemp; // ( high=65035-7.8*ADtemp;12MHz)(65535-(460+7.2*ADtemp 11.0592MHz)

low=47563+7.2*ADtemp; // ( low=46035+7.8*ADtemp; ) ( 65535-(17972-7.2*ADtemp 11.0592MHz )

angle=ADtemp*0.7;

Display[0]=Datatab[angle/100];//處理0通道電壓顯示

Display[1]=Datatab[(angle%100)/10];

Display[2]=Datatab[angle%10];

while(1)

{

P0=Display[count1];//用於動態掃描數碼管

P2=count1;

mDelay(1);

count1++;

if(count1==3) //表示掃描3個數碼管

{

count1=0;

break;

}

}

}

}

/******************************************************************/

/* 定時器中斷函數

/******************************************************************/

void tim(void) interrupt 1 using 1

{

static unsigned char count;

if (!count)

{

control_signal = 1; //給高電平

TH0=high/256;

TL0=high%256; }

else

{

control_signal=0 ;

TH0=low/256;

TL0=low%256;

}

count=~count;

}

打開APP閱讀更多精彩內容

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴

相關焦點

  • 多路舵機控制PWM發生器的設計與Proteus仿真
    以Proteus和Keil軟體為基礎,介紹了在Proteus環境下利用51單片機產生多路PWM脈衝的實現方法。最後以一個典型的應用實例驗證了設計的可行性與可靠性。實驗證明,本系統可在單片機定時器資源有限的情況下同時對多個舵機的輸出轉角進行控制。
  • 利用單片機PWM信號進行舵機控制[圖]
    脈衝計數可以利用51單片機的內部計數器來實現,但是從軟體系統的穩定性和程序結構的合理性看,宜使用外部的計數器,還可以提高CPU的工作效率。實驗後從精度上考慮,對於FUTABA系列的接收機,當採用1MHz的外部晶振時,其控制電壓幅值的變化為0.6mV,而且不會出現誤差積累,可以滿足控制舵機的要求。
  • 51單片機分時控制8路舵機程序
    本程序中用到的頭文件 12c5a.H下載:http://www.51hei.com/f/12c5a.rar//分時控制舵機,採用的單片機是STC12c5a 51增強型單片機,晶振11.0592MHZ
  • AT89C2051多路舵機控制電路詳解
    ,旋轉,直到電壓差為O,電機停止轉動。舵機的控制信號是PWM信號,利用佔空比的變化改變舵機的位置。     舵機的控制方法  電源線和地線用於提供舵機內部的直流電機和控制線路所需的能源.電壓通常介於4~6V,
  • 對180度360度sg90舵機的使用經驗+單片機程序
    如果若有不到之處,希望大家積極指出,模擬舵機:需要不斷的發送目的地PWM信號,才能旋轉到指定位置。例如:我現在讓它旋轉90度,我就需要不斷的發送90度的PWM信號直到到達指定位置才能停止。我們使用的SG90就是一個模擬舵機數字舵機:只需給一個目的地PWM信號,即可旋轉到指定位置。
  • 以STC12C5A60S2單片機為系統控制單元的系留飛艇地面監測系統設計
    以STC12C5A60S2單片機為系統控制單元的系留飛艇地面監測系統設計 工程師黃明星 發表於 2018-08-07 15:37:42 系留飛艇地面監測系統具有全天候
  • 基於IPM模塊的舵機控制電路設計
    摘要:為了實現水下自主式機器人的控制,設計了一種基於IPM模塊的舵機控制電路。本文將日本三菱公司的IPM模塊PM25RLA120和美國TI公司的電機控制晶片UC1637用於電動舵機控制。1 設計原理 舵機控制原理框圖如圖1所示。
  • 51單片機復位電路的設計
    以MCS-51單片機為例,復位脈衝的高電平寬度必須大於2個機器周期,若系統選用6MHz晶振,則一個機器周期為2us,那麼復位脈衝寬度最小應為4us。在實際應用系統中,考慮到電源的穩定時間,參數漂移,晶振穩定時間以及復位的可靠性等因素,必須有足夠的餘量。圖1是利用RC充電原理實現上電復位的電路設計。實踐證明,上電瞬間RC電路充電,RESET引腳出現正脈衝。
  • 《電子發燒友網51單片機設計方案TOP10》
    為了實現小車識別路線,判斷並自動躲避障礙,選擇正確的行進路線,障礙判斷採用單光束反射取樣紅外傳感器,驅動電機採用直流電機,控制核心採用MCS-51單片機。控制上採用分時復用技術,僅用一塊單片機實現了信號採集、線路判斷、電機控制等功能。迷宮由16×16個區組成。起點設在拐角處,終點設在中央,佔4個區。
  • 基於單片機與旋轉編碼器的閉環線速度控制系統
    ,旋轉一周輸出1 000個脈衝。實際應用中,將其與一加工精度極高、周長為500 mm的旋轉編碼器測量主動輪與旋轉編碼器同軸安裝,主動輪與電纜接觸。在電纜生產運動過程中,依靠摩擦力拉動測量輪旋轉,這樣就把電纜的直線位移(長度)轉化為旋轉編碼器的脈衝數位訊號輸出。
  • 基於51單片機的TFT液晶顯示設計
    0 引言本文引用地址:http://www.eepw.com.cn/article/173037.htm  51單片機作為一種常見的通用單片機, 雖然其內部資源
  • STM32F103VET6驅動舵機SG90
    SG90舵機1.sg902.PWM3.資原始碼4. 成果演示5. 工程獲取1.sg90舵機 在機器人機電控制系統中,舵機控制效果是性能的重要影響因素。舵機可以在微機電系統和航模中作為基本的輸出執行機構,其簡單的控制和輸出使得單片機系統非常容易與之接口。
  • 51單片機的無線供電模塊設計
    打開APP 51單片機的無線供電模塊設計 發表於 2019-04-22 15:01:04 本文主要闡述近距離無線供電,具有低功耗、安全等特點,通過單片機檢測[1]更好的增加了它的可靠性。 2系統方案設計 無線供電演示裝置的設計製作。該電路由電源發射電路、接收電路、檢測顯示電路三部分組成[2]。
  • 單片機控制步進電機的原理
    本資料詳細介紹鄧步進電機的工作原理以及單片機控制步進電機的特點。步進電機是數字控制電機,它將脈衝信號轉變成角位移,即給一個脈衝信號,步進電機就轉動一個角度,因此非常適合於單片機控制。    步進電機可分為反應式步進電機、永磁式步進電機和混合式步進電機。
  • 51單片機精確控制步進電機(有TB6600驅動)
    設備:51單片機開發板、TB6600驅動器、57BYG250B步進電機(二相)、直流開關電源。直流電源給驅動器供電,單片機給驅動器輸入脈衝,驅動器驅動步進電機。程序使用定時器中斷精確控制電機轉動(不考慮失步)。比如我採用16倍細分,則需給驅動輸入3200個脈衝,驅動才會使電機轉一圈,下面程序中1秒發送200個脈衝,則相應的電機16秒轉一圈。
  • 通過51單片機來控制直流電機
    >看不清楚圖的請點保存 或者點開連接地址看大圖 下面是針對上面電路圖的程序(直接複製粘貼進去運行 還是那句話 程序別光是複製粘貼 要一句句看懂 看出核心的那一段代碼是怎麼利用單片機加上一個晶片來控制電機的為以後自己寫其他驅動程序打基礎
  • 51單片機設計方案TOP10(九)
    基於51單片機的光功率計的設計  摘要:通過光電傳感器將待測光信號變化轉變為模擬信號,對模擬信號進行AD處理分析得到光信號的參數特性並在
  • 基於MCS-51單片機和步進電機實現鍋爐筒壁孔加工控制系統的設計
    基於MCS-51單片機和步進電機實現鍋爐筒壁孔加工控制系統的設計 佚名 發表於 2020-04-15 09:28:34 1、前 言 為實現鍋爐筒壁孔加工自動化而設計的數控系統
  • 《Arduino》基礎:舵機控制
    舵機是什麼?舵機是電機的一種,又加伺服電機,它和步進電機有異曲同工之妙,步進電機是可以設定轉過多少角度,而舵機是可以設定轉到的位置,可以說是指哪打哪,Arduino智能小車的前輪轉彎系統便是用的這種原理,在工業上機器人上,舵機的應用更是不勝枚舉。
  • 基於51單片機的智能調光防近視檯燈的設計開題報告
    論文(設計)題目 基於51單片機的智能調光防近視檯燈的設計與實現選題目的和意義:檯燈已是千家萬戶的必需生活用品,經常由於忘記關燈而造成巨大的能源浪費。當夜晚來臨時,人們又摸黑去開燈,非常不方便。長時間的學習工作會用眼過度,導致近視。