51小四軸製作之飛行姿態與PWM

四軸飛行器飛行的原理就是通過改變四個電機轉速改變飛行器當前的飛行狀態,而飛行器在空間中具有六個狀態:垂直運動、俯仰運動、橫滾運動、偏航運動。要實現這些飛行狀態就需要對四軸飛行器每個電機的轉速進行調整,這裏的調整就用到了PWM(脈衝寬度調製)。

  • 飛行姿態

這裏參考了這篇博客,講的很詳細
https://blog.csdn.net/qq_25005909/article/details/76512369

由於在飛行時如果螺旋槳同向轉動,四軸飛行器會受到轉動力矩的作用不利於我們控制飛行器,所以採用了兩對相反的螺旋槳並且電機反向轉動,這樣可以平衡力矩,達到穩定飛行。
也就是圖中1和3是正向螺旋槳逆時針運動,2和4是反向螺旋槳順時針運動。
在這裏插入圖片描述
1.垂直運動:所有電機同時提高相同的轉速將飛行器上升。
2.俯仰運動:控制其中兩個電機轉速,也就是1的轉速提高而3的轉速減少,這樣飛行器會向x軸方向仰起並且向x軸運動,如果要想後仰起移動只需要1的轉速減少3的轉速升高即可。
3.橫滾運動:和俯仰運動類似,只是改變的是2和4電機,向側方向翻轉並且移動。
4.偏航運動:通過反扭力實現四軸飛行器的旋轉,之前通過旋翼的轉向的配置抵消了力矩,而現在要實現四軸飛行器方向的偏轉需要通過力矩產生一個扭力,也就是需要其中兩個同向電機轉速減少,另外兩個電機轉速提高,比如1和3轉速增加、2和4轉速減少即可發生偏航運動。
5.前後運動
要想實現飛行器在水平面內前後、左右的運動,必須在水平面內對飛行器施加一定的力。在圖e中,增加電機3轉速,使拉力增大,相應減小電機1轉速,使拉力減小,同時保持其它兩個電機轉速不變,反扭矩仍然要保持平衡。按圖b的理論,飛行器首先發生一定程度的傾斜,從而使旋翼拉力產生水平分量,因此可以實現飛行器的前飛運動。向後飛行與向前飛行正好相反。當然在圖b圖c中,飛行器在產生俯仰、翻滾運動的同時也會產生沿x、y軸的水平運動。
6.側向運動
在圖f中,由於結構對稱,所以側向飛行的工作原理與前後運動完全一樣。 總得來說就是控制四個電機的速度了。然後相應的提高速度和減慢速度就可以讓四軸動起來了。

  • PWM

PWM波輸出模塊,首先下手PWM模塊是因爲這個模塊直接控制電機的運轉,再配合無線傳輸就可以簡單地控制四軸飛行器,這樣就可以在完成硬件後第一時間檢測硬件功能是否正常,在最開始將可能故障排查就能使後續地工作更加順暢。
PWM波是通過控制佔空比,即高電平在一個週期內所佔的比例,來控制電機的轉速的。那我就要做一個函數,輸入4個值控制4個電機的轉速,而這4個值就是分別控制四個PWM輸出口輸出佔空比的。而要控制佔空比也就是要求在一個週期內高電平所佔的比例,那就需要計算佔空比。雖然理解了佔空比,但是計算以及在程序中體現稍顯麻煩。

  • PWM的概念及如何控制轉速
    PWM即是寬度脈衝調製,是一種微處理器形成數字信號控制模擬電路的技術,具體就是產生一個方波,爲什麼要用這個PWM來控制轉速呢。首先控制轉速可以調節電流的大小,但這樣不容易由單片機控制,但是可以用另一種方法來達到調速的作用,給電機工作一會停一會,就像我們騎自行車可以用比較小的力氣一直地蹬,也可以每隔一會猛踩一會然後讓自行車自己滑動,兩種方法實際的平均速度都是一樣的。所以這個PWM控制電機轉速也就是後者,PWM信號傳給電子調速器,而這個信號就是一種方波,就是一段高位低位交替的波形,當這個信號傳給電調用於控制時,高位被稱爲高電平,低位被稱爲低電平,當處在高電平時電機會轉動而低電平時電機不工作,由於間隙很短,這樣就控制了電機的轉速。所以這裏引入了一個概念叫做“佔空比”,就是指在一個脈衝循環內,通電時間相對於總時間所佔的比例,通過調節這個佔空比就能調節轉速,這就是單片機控制電機轉速的方式。
    在這裏插入圖片描述

  • PWM佔空比計算
    8位的PWM的話,每個週期裏要分爲256個小脈衝,佔空比就是這256個脈衝裏的高電平佔這個整個256個電平的比例
    8位PWM的週期 = 計數脈衝週期×256
    8位PWM的頻率 = 計數脈衝頻率/256
    8位PWM的脈寬時間(高電平時間)= 計數脈衝週期×(256-CCAPnL)
    8位PWM的佔空比 = 脈寬時間/PWM週期 = (1- CCAPnL/256) ×100%
    單片機中計數器和定時器採用的是脈衝計數,脈衝就是低電平轉變爲高電平的這個過程,也就是上升沿,而計時器是記錄機器內部的脈衝個數再換算成時間,對於51單片機來說一個計數脈衝週期就是1us,也就是一個機器週期。8位PWM的週期就是計時器記錄256次脈衝的時間,佔空比就是在這個週期內記錄的脈衝個數除以總的脈衝數256。

  • PWM在單片機程序中的體現
    在STC15W4K32S4中PWM輸出模塊自帶兩個內部15位計時器,T1、T2,這兩個個計時器也就是定時器,可以通過編程設定時間實現定時。

    而在程序中PWM佔空比的控制即是通過調整波形翻轉的間隔達到的,這個時間間隔就由這兩個定時器來控制,T1控制低電平翻轉成高電平的時間節點,T2控制高電平翻轉成低電平的時間節點。

    總的流程:系統內部時鐘計時,然後兩個定時器定時,當內部時鐘的值與T1設定的值相等時,由低電平翻轉成高電平,接下來持續輸出高電平波形;當內部時鐘的值達到T2設定的值時,由高電平翻轉成低電平。當內部時鐘計完一個週期後再將內部時鐘重置繼續輸出這個波形。

    作用:通過設定翻轉的時間節點調整波形處於高電平的時間,也就是控制了一個週期內的脈衝寬度,也就是控制了佔空比。所以叫做脈衝寬度調製PWM。

  • 相應代碼分析
    PWM模塊主要分爲兩個函數,一個是PWM模塊的初始化,基本上是搬過來的,所有的寄存器設置方式在數據手冊上都有,這裏比較關鍵的操作是設置每個PWM輸出口內部時鐘T1和T2的定時時間。在初始化時定義好T2的數值,這個T2定時的長度就相當於一個週期的長短。像是這裏定義的是1001,一個週期就相當於1ms。
    另一個則是改變4個PWM輸出口輸出的PWM波形,改變T1的定時時間,就相應地改變了高電平的時間也就是脈衝的寬度。
    聯繫公式,不難看出,T2-T1的時間即是高電平的時間,而一個週期即爲1ms,佔空比就是(T2-T1)/T2。

void PWM_INIT()
{
	int i=1;
	//所有I/O口全設爲準雙向,弱上拉模式
	P0M0=0x00;
	P0M1=0x00;
	P1M0=0x00;
	P1M1=0x00;
	P2M0=0x00;
	P2M1=0x00;
	P3M0=0x00;
	P3M1=0x00;
	P4M0=0x00;
	P4M1=0x00;
	P5M0=0x00;
	P5M1=0x00;
	P6M0=0x00;
	P6M1=0x00;
	P7M0=0x00;
	P7M1=0x00;
	/*設置需要使用的PWM輸出口爲強推輓模式
	用到的PWM包含的端口都在爲P2和P3所以
	只需要將這兩個端口設置即可
	*/
	P2M0=0x0e;
	P2M1=0x00;
	P3M0=0x80;
	P3M1=0x00;
	
    //PWM控制寄存器
	P_SW2=0x80;    //最高位置1才能訪問和PWM相關的特殊寄存器

	//PWM配置寄存器
  PWMCFG=0xb0;    //7位    6位                5位    4位    3位    2位    1位    0位
	                //置0  1-計數器歸零觸發ADC C7INI  C6INI  C5INI  C4INI  C3INI  C2INI
	                //     0-歸零時不觸發ADC       (值爲1時上電高電平,爲0低電平)
    //PWM時鐘選擇寄存器
	PWMCKS=0x10;    //7位6位5位    4位             3位    2位    1位    0位
	                //   置0    0-系統時鐘分頻          分頻參數設定
	                //          1-定時器2溢出       時鐘=系統時鐘/([3:0]+1)
    //PWM中斷標誌寄存器
	PWMIF=0x00;     //7位    6位                5位    4位    3位    2位    1位    0位
                  //置0  計數器歸零中斷標誌            相應PWM端口中斷標誌
    //PWM外部異常控制寄存器
	PWMFDCR=0x00;   //7位    6位       5位                4位
	                //置0    置0 外部異常檢測開關  外部異常時0-無反應 1-高阻狀態
	                //3位             2位                 1位                0位
                  //PWM異常中斷  比較器與異常的關係   P2.4與異常的關係  PWM異常標誌
    //PWM計數器
    PWMCH=0x03;     //15位寄存器,決定PWM週期,數值爲1-32767,單位:脈衝時鐘
    PWMCL=0xe9;

// 以下爲每個PWM輸出口單獨設置
	PWM2CR=0x00;    //7位6位5位4位   3位      2位       1位        0位
	                //    置0      輸出切換 中斷開關 T2中斷開關 T1中斷開關
	PWM3CR=0x00;
	PWM4CR=0x00;
	PWM5CR=0x00;

	PWM2T1H=0x03;          //15位寄存器第一次翻轉計數  第一次翻轉是指從低電平翻轉到高電平的計時
	PWM2T1L=0xe8;
	PWM2T2H=0x03;          //15位寄存器第二次翻轉計數  第二次翻轉是指從高電平翻轉到低電平的計時
	PWM2T2L=0xe9;          //第二次翻轉應比精度等級要高,否則會工作不正常,比如精度1000,第二次翻轉就必須小於1000
/*
	PWM佔空比的控制即是通過調整波形翻轉的間隔達到的,這個時間間隔由兩個定時器來控制,T1控制低電平翻轉成高電平的時間
	節點,T2控制高電平翻轉成低電平的時間節點。
	總的流程:系統內部時鐘計時,然後兩個定時器定時,當內部時鐘的值與T1設定的值相等時,由低電平翻轉成高電平,接下來持續
	輸出高電平波形;當內部時鐘的值達到T2設定的值時,由高電平翻轉成低電平。當內部時鐘計完一個週期後再將內部時鐘重置繼續
	輸出這個波形。
	作用:通過設定翻轉的時間節點調整波形處於高電平的時間,也就是控制了一個週期內的脈衝寬度,也就是控制了佔空比。所以叫做
	脈衝寬度調製PWM。
*/
	PWM3T1H=0x03;
	PWM3T1L=0xe8;
	PWM3T2H=0x03;
	PWM3T2L=0xe9;

	PWM4T1H=0x03;
  PWM4T1L=0xe8;
	PWM4T2H=0x03;
	PWM4T2L=0xe9;

	PWM5T1H=0x03;
	PWM5T1L=0xe8;
	PWM5T2H=0x03;
	PWM5T2L=0xe9;
//以上爲每個PWM輸出口單獨設置

  PWMCR=0x8f;     //7位          6位                5位 4位 3位 2位 1位 0位     10001111
	                //PWM開關 計數歸零中斷開關   相應I/O爲GPIO模式(0)或PWM模式(1)

}


/*
這個函數是用來給T1定時器設定數值的,由每個定時器具有15位,
因爲上面設定的T2值爲1001(相當於在T2設定的時間結束),所
以我們的一個週期就是計時器計到1000。
設定了T1的數值,就是設定了開始轉變爲高電平的時間,T2-T1的
時間即是高電平的寬度。
本函數輸入的4個值取值範圍爲0-1000 1000電機停,0轉速最高,
*/
void PWM(int p1,int p2,int p3,int p4)
{
    PWM2T1H = p1 >> 8;
    PWM2T1L = p1;

    PWM3T1H = p2 >> 8;
    PWM3T1L = p2;

    PWM4T1H = p3 >> 8;
    PWM4T1L = p3;

    PWM5T1H = p4 >> 8;
    PWM5T1L = p4;
}```

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章