目的/效果
獨立按鍵K1,K2? 實現加舵機減角度增減,LCD1602顯示舵機轉角度數(上電默認90度)
一,STC單片機模塊
二,SG90舵機?
2.1 簡介
舵機只是我們通俗的叫法,它的本質是一個伺服電機,也可以叫做位置(角度)伺服驅動器。一般被應用在那些需要控制角度變化的系統中,可以方便的實現轉動任意的角度,實現控制角度的變化。
應用場景航模、智能小車的轉向
航模:在很多的航模中,sg90舵機都被用于兩翼的位置控制,從而實現航模的轉向,傾斜之類的。因為航模本身的要求,需要盡量的控制航模的自重,而sg90舵機的重量本身就很輕,扭矩也大,所以能很好的滿足要求。?
智能小車的轉向:因為sg90舵機的精準角度控制,所以在很多的智能小車類中被用作轉向控制。
2.2 舵機的工作原理
SG90舵機模塊內有控制電路,控制信號通過信號線輸入到內部的控制電路中,調制芯片將輸入的信號進行調制,獲得直流偏置電壓。然后再由內部的基準電路產生周期為20ms,寬度為1.5ms的基準信號,將直流偏置電壓和電位器電壓進行比較,從而獲得輸出的電壓差。由電壓差控制舵機的轉動,這個電壓差的正負控制舵機正反轉。?
舵機的控制需要MCU產生一個周期為20ms的脈沖信號,以0.5ms到2.5ms的高電平來控制舵機轉動的角度。
?以180度角度伺服為例,那么對應的控制關系是這樣的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
占空比: 一個脈沖周期內,高電平的時間與整個周期時間的比例
單位:?%?(0%-100%)
表示方式:20%?
?控制通斷時間比例,占空比。如下圖
我在這里用定時計數器來控制占空比
/*** 函 數:定時器0初始化,100微秒 @12.000MHz* 參 數:無* 返 回 值:無*/
void Timer0_Init(void)
{TMOD |= 0x01; //設置定時器模式TL0 = 0xB0; //設置定時初始值TH0 = 0xFF; //設置定時初始值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時ET0=1; //允許時鐘1中斷EA=1; //打開總中斷
}
?有關定時器和系統中斷請參考
《51單片機STC89C52RC——6.1 中斷系統_stc89c52rc的中斷系統-CSDN博客》
《51單片機STC89C52RC——6.2 定時器_stc89c52rc定時器-CSDN博客》
《51單片機STC89C52RC——6.3 定時器/計數器 實現計時功能》
注意:為了真實項目控制得更精準,我們可以將定時器的中斷設置為1us一次,極值寬度設置為500us-2500us,把每次按鍵加減值控制的更細。
2.3 接線方法
紅-------------------------VCC
棕色----------------------GND
橙色----------------------信號線 ,我這里選用P20針腳
2.4 轉角度數計算
舵機的角度控制是通過改變舵機脈沖寬度來實現的。舵機脈沖寬度與舵機角度之間的關系如下:
角度 = 180/(最大脈沖寬度 - 最小脈沖寬度)*(脈沖寬度 - 最小脈沖寬度) ?
?? ??? ?
脈沖寬度為 500 微秒時,舵機角度為 0 度。
脈沖寬度為 1500 微秒時,舵機角度為 90 度。
脈沖寬度為 2500 微秒時,舵機角度為 180 度。?
(180/(Max-Min))*(Compare-Min)
三,創建Keil項目
詳細參考:51單片機STC89C52RC——創建Keil項目-CSDN博客
四,代碼?
完整代碼參考《https://gitee.com/oopxiajun/STC89C52》
main.c
#include <REGX52.H>
#include "Timer0.h"
#include "key.h"
#include "LCD1602.h"
#include "Delay.h"
int Min=5,Max=25;//定義極值時長
unsigned char Counter,//計數器KeyNum,//按鍵值Compare=15;//占空比 7.5%
/*** 函 數:主函數* 參 數:無* 返 回 值:無*/
void main()
{ Timer0_Init(); //初始化定時器 LCD_Init(); while(1){LCD_ShowNum(1,1,(180/(Max-Min))*(Compare-Min),3);KeyNum=GetKey();if(KeyNum==1){Compare-=1;}else if(KeyNum==2){Compare+=1;}if(Compare<Min)Compare=Min;if(Compare>Max)Compare=Max; }
}
/*** 函 數:定時器0中斷函數* 參 數:無* 返 回 值:無*/
void Timer0_Routine() interrupt 1
{TL0 = 0xB0; //設置定時初始值 每0.1毫秒中斷一次TH0 = 0xFF; //設置定時初始值Counter++;Counter%=200; //20ms的脈沖周期if(Counter>=Compare){P2_0=0;//電機斷電}else {P2_0=1;//電機通電}
}
五,代碼編譯、下載到51單片機
代碼編譯請參考
《51單片機STC89C52RC——代碼編譯-CSDN博客》
代碼下載請參考
《51單片機STC89C52RC——STCAI-ISP代碼下載-CSDN博客》