.風機選用 讀題可知, 題目要求使用風機將受控部分自身吹起
我們組事先備有一些風機, 但是由于過于笨重, 只能將自身吹起10°度左右, 只好放棄.
之后尋找替代方案, 想到嘗試用空心杯電機, 測試發現3.5V/1.5A可將自身吹起25°左右, 還是略勉強.
只好狠心把手上現有的四軸飛行器拆了, 利用上面帶齒輪組的空心杯電機做 2.傳感器這是需要控制一個風擺
要做到精確控制, 得做一個閉環系統, 控制的同時觀測控制效果作為反饋改變控制量(常用算法是PID).
控制的是風擺上的風機, 需要測的是當前風擺的姿態, 自然能聯想到陀螺儀, 使用它可以得知擺的當前姿態.
手上有現成的MPU6050 3.結構
p1.jpg (784.28 KB, 下載次數: 128)
下載附件
2017-8-1 17:02 上傳
設計結構時, 材料都盡量選了輕的, 將主控板/驅動板/電源都外置了,
擺子上, 只放置風機+MPU6050.
擺的竿子, 用了鋁棒, 很輕, 容易加工, 運動中不會像塑料棒一樣左搖右晃更不會自旋, 省了不少事.
支架嘛…東拼西湊來的, 找了一截粗鋁棒, 拆了個抽屜取了軌道做支架, 借了個鉆臺的底座…
線材, 信號線統一用細的, 電機的線用了比較粗的2A的線, 用自緊塑料扎帶整理好. 這個結構在后面的評測環節證明, 容易拆解, 還不容易出問題… 4.電機驅動電路
motor_driver.jpg (30.33 KB, 下載次數: 121)
下載附件
2017-8-1 17:02 上傳
由于沒有正反轉的需求, 這里直接就用了mos管驅動. 5.電源一開始用著實驗室的穩壓電源, 沒考慮電源的問題.
后來換了自制的4A電源發現, 3個以上空心杯一起工作, 電源電壓就明顯下降了.
才意識到一個空心杯在3.5V時, PWM滿調制電流會在2A以上.. 電源完全不達要求.
馬上使用萬能的TB找到了本市的某個角落有賣開關電源, 馬上打飛的購回5V 10A(10%電壓可調)的開關電源, 丙把電壓調到3.8V. 6.主控這種比賽當然是直接上平時用得多的..STM32F1. P.S.完全確定這些架構的時候 已經是第三天的中午了…于是第三天的晚上只睡了3個小時… 程序部分題目要求那么多, 總之就是: 擺直線/制動/畫圓 風機調速使用MCU的TIMER提供的PWM功能 PID算法做這一題必須用到PID算法, 網上資料已經很多了.
我們發現, 做這題只用P參數就夠. 角度傳感器這里選用的MPU6050, 網上資料很多.
我們使用別人從MSP430移植到STM32上的DMP庫, 能直接讀出四元數, 轉換成歐拉角就能知道當前姿態.
詳見interface_mpu6050.c 程序框架這里使用一個平面狀態機做框架.
每輸入一個傳感器數據, 都根據當前系統狀態, 進行不同的處理.
制作了一個串口調試命令系統, 可以使用串口, 輸入命令更改一些參數, 幫助調試. P.S. 以上是比賽前就做好的準備工作 風機控制程序
motor.jpg (15.27 KB, 下載次數: 105)
下載附件
2017-8-1 17:02 上傳
風機控制程序控制PWM輸出量,
以同在一個方向的1,3的電機為例,
當風機控制量為正, 1號轉,3號停; 為負反之. 這里還有一個很必要的工作, 就是為每個電機設定一個運行時可調的系數, 每次運行時, 手動把四個電機的風速盡可能調平衡. 一般來說, 為了達到更好的控制效果, 會在這個程序中做一個PWM與風速的擬合, 使控制量與風速盡可能的呈線性關系.
我們沒做是因為風速很難測. 擺直線要求一.
畫不定長直線段(超過50cm)
方案
開始時, 先給風擺動起來, 具體做法是讓單邊電機工作, 然后停止, 之后進入測控流程.
m1.jpg (40.83 KB, 下載次數: 126)
下載附件
2017-8-1 17:02 上傳
測控流程:
若當風擺角度為正時, PID目標角度值也設為正;
若當風擺角度為負時, PID目標角度值也設為負. 這樣做的目的是:
速度方向朝向目標角位置時, 遠離目標值時(就是底部)風機速度最快, 在目標值附近風機不起作用;
速度方向背向目標角位置時, 風擺由于重力會有向下的力, 風機使風擺下降速度變緩; 設定一個合適的目標角, 讓畫出的直線段超過50cm即可. 要求二.
畫長度可控的直線段
方案
同要求一方案, 但是需要標定, 即確定目標角與實際畫出的直線段間的關系.
根據用戶輸入長度, 查表即可. 要求三.
在底圖上標注的任意角度上畫直線
方案
依舊是方案一的擴展.
只不過現在需要用兩個PID, 分別控制兩個方向的兩組螺旋槳.
然后依舊用標定的方式, 調整
以下是我們做的標定, 從0°測到40°(其余角度都可以根據這個推出來),
2
4
6
const uint32_t DATA_J3_pwm_table[][3] = {
{ 16000 , 5000 , 11}, /* 10 */
{ 16000 , 9200 , 11}, /* 30 */
};
|
第一個值為x方向PID的P參量,
第一個值為y方向PID的P參量,
第三個值為目標角. 成功的關鍵, 是前面提到的電機必須調平衡….否則擺若干次后, 風擺會開始畫明顯的橢圓. 制動題目要求5s內達到靜止狀態
方案
使用兩路PID用來控制兩個方向的兩組風機, 將目標角設為0, p參數為負數(就是讓風擺在下落時減速以趨向靜止)即可. 單以這樣的原理, 實際效果并不好, 在p參數不會引起自激的前提下, 只能做到在15s內靜止.
于是我們讓PID的p參數在不斷接近靜止的過程中下降, 最后基本能做到5s內靜止.
我們的具體做法是: 角度低于某數值一段時間后, 確定下降到一定高度, 調低一次p值. 畫圓原理: 讓風機產生的合力為定值, 且力的方向與當前風擺抬起的方向相同.
方案
我們用了一個投機取巧的方法, 我們叫它”PWM值傳遞畫圓”
以初始PWM=3為例, 四個風機的PWM值這樣變化: [td]風機1 | 風機2 | 風機3 | 風機4 | 3 | 0 | 0 | 0 | 2 | 1 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 2 | 1 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 2 | 1 | 0 | 0 | 1 | 2 | 0 | 0 | 0 | 3 | 1 | 0 | 0 | 2 | 2 | 0 | 0 | 1 |
不斷循環執行. 用這個偷懶的方法, 需要確定三個變量: 初始PWM, 每隔多少時間傳遞一次PWM值, 每次傳遞多少PWM值
慢慢調整這三個參數, 就能調出不同直徑的圓…
這是一個省事又有效的方法..
如果畫的不夠圓, 先把風機調平衡吧.
|