单片机PWM舵机控制
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
?
文章目錄
- 一、PWM是什么?
- 二、如何控制舵機?
?
?
一、PWM是什么?
PWM,英文名Pulse Width Modulation,是脈沖寬度調制縮寫,它是通過對一系列脈沖的寬度進
行調制,等效出所需要的波形(包含形狀以及幅值),對模擬信號電平進行數字編碼,也就是說通
過調節占空比的變化來調節信號、能量等的變化,占空比就是指在一個周期內,信號處于高電平的
時間占據整個信號周期的百分比,例如方波的占空比就是50%.
脈沖寬度調制
通過占空比編碼模擬信號
占空比 一個周期內,高電平占據時長的百分比
?
二、如何控制舵機?
1. 什么是舵機
如下圖所示,最便宜的舵機sg90,常用三根或者四根接線,黃色為PWM信號控制
用處:垃圾桶項目開蓋用、智能小車的全比例轉向、攝像頭云臺、機械臂等
常見的有0-90°、0-180°、0-360°
?
?2. 怎么控制舵機
向黃色信號線“灌入”PWM信號,通過控制高電平的時間,來控制舵機的角度
PWM波的頻率不能太高,大約50HZ,即周期=1/頻率=1/50=0.02s,20ms左右
數據:
0.5ms-------------0度; 2.5% 對應函數中占空比為250
1.0ms------------45度; 5.0% 對應函數中占空比為500
1.5ms------------90度; 7.5% 對應函數中占空比為750
2.0ms-----------135度; 10.0% 對應函數中占空比為1000
2.5ms-----------180度; 12.5% 對應函數中占空比為1250
3、定時器定時
定時器需要定時20ms, 關心的單位0.5ms, 40個的0.5ms,初值0.5ms,定時器看晶振頻率。
加1經過了多少時間
當晶振頻率(時鐘頻率)是11.0592MHz的時候,等于11059.2KHz = 11059200Hz
機器周期 = 12 x 時鐘周期 =12 x (1/時鐘頻率) 秒 = 12 / 時鐘頻率 秒 = 12 / 11059200 秒 = 12 000 000/ 11059200 微秒 = 1.085 微秒
?
代碼如下(示例):
#include <reg52.h> int jd; sbit sg90_c = P1^1; int cnt =0; void Delay300ms() //@11.0592MHz {unsigned char i, j, k;i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i); }void Time0init() //定時器0初始化 {//1.配置定時器0工作模式位16位計時TMOD=0x01; //TL0,TH0全用 0 1//2.給初值,定一個10ms出來TL0= 0x33;TH0= 0xFE; //TL0存放低八位00,TH0存放高8位DC//3.開始計時TR0=1;//4.打開定時器0中斷ET0=1;//5.打開總中斷EAEA=1; }void main() {Delay300ms();Time0init();jd =1; //角度為1,即只有一個0.5ms的高電平,為0°cnt = 0;sg90_c = 1; //先讓舵機一開始處于高電平//4.爆表了while(1){jd=4; //舵機轉135°時,高電平時間是2ms,需要4個0.5mscnt =0;Delay300ms();jd = 1;cnt=0;Delay300ms();} }//TF0爆表時,硬件自動調用中斷函數 void Time0Handler() interrupt 1 //定時器0的中斷號 {cnt++;//重新賦初值TL0=0x33;TH0=0xFE;if(cnt<jd) //舵機轉135°時,高電平時間是2ms,需要4個0.5ms{sg90_c=1; }else{sg90_c = 0; //一直保持低電平到結束}if(cnt==40) //爆表40次,經過20ms,結束第一次PWM周期,PWM為50HZ{cnt=0; //重新讓cnt從0開始,計算下一次的20mssg90_c=1; //每次cnt為0時(即初始狀態)處于高電平,等待PWM}}?
?
?
?
總結
以上是生活随笔為你收集整理的单片机PWM舵机控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机毕业设计Java教师教学质量评估系
- 下一篇: Assignment | 05-week