舵機有紅黃褐三根線,紅線接VCC,褐線接GND,黃線接PWM輸入信號,用PWM信號控制舵機的轉動
pwm信號的周期為20ms,0,5ms-0°,1ms-45°,1.5ms-90°,2.0ms-135°,2.5ms-180°,通過控制單片機使其在pwm引腳輸出對應的pwm波形來控制舵機轉動到指定的角度
下面我寫的是用K1開關控制的舵機自動轉動的程序,按下K1,舵機轉動,再次按下K1,舵機停止轉動
注意:因為舵機平均0.13MS轉動60°,所以當產生指定的信號后需要維持一端時間,使舵機能轉動到指定的角度,然后載改變PWM信號,信號維持時間的長短控制轉動的快慢
單片機.jpg (2.92 MB, 下載次數: 33)
下載附件
2019-8-4 13:21 上傳
舵機.jpg (2.66 MB, 下載次數: 33)
下載附件
2019-8-4 13:21 上傳
//使用15系列51單片機的定時器2進行中斷計時產生PWM波形信號
#include<STC15F2K60S2.h>
int flag=0;
sbit pwm1=P1^1;
sbit key1=P3^2;//開關1引腳
unsigned int value[]={6,11,16,21,16,11};//誤差原因,6-0°,11-45°,16-90°,21-135°,26-180°
unsigned int percent = 0;//0.1ms次數標識
int k=0,count=0;
void Timer0Initial()
{
T2L = 0xAE;
T2H = 0xFB;
} //定時0.1ms,11.0592MHz,0.01%的誤差
void initial_Timer()
{
AUXR |= 0x04; //設置1T模式
Timer0Initial();
AUXR |= 0x10;//定時器2開始計時
IE2 |=0x04; //允許定時器2中斷
EA = 1; //打開總中斷
}
void delay(unsigned int x)
{
unsigned int i,j;
for(i = 0;i< x; ++i)
for(j = 120; j >0 ; --j)
;
}//延時函數,1ms
void keyscan()//按鍵掃描函數
{
if(key1 == 0)
{
delay(3);//按鍵消抖,延時消抖
if(key1 == 0)
{
while(!key1);//按鍵放開
flag=!flag;
}
}
}
void initial()
{
key1 = 1;
initial_Timer();
}//初始化
void Timer0() interrupt 12 //定時器2
{
if(flag==1){//若打開開關
percent += 1;//設置周期
if(percent == 200)
{
count++;
percent = 0;
pwm1 = 1;
}//產生低電平,當達到20ms時,進入下個周期,重新產生蹈叩縉?
if(percent == value[k])
{
pwm1 = 0;
}//產生高電平,當時間達到時,變為低電平
if(count==20){
count=0;
k++;
if(k==6)k=0;
}//,13ms/60°,延時,給舵機時間轉動到指定的角度
}
Timer0Initial();
}
剩下的程序在文件中
定時器2舵機.zip
(29.63 KB, 下載次數: 86)
2019-8-4 13:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|