我正在處理基於arduino mega的quadcopter,並試圖爲4個電機設置PWM頻率 - 每個400hz。
我發現了一個有趣的解決方案,其中4個ATmega2560 16位定時器用於控制4個帶PWM的ESC,因此可以達到400Hz的頻率。 700到2000μs是ESC正在處理的正常脈衝寬度。
1sec/REFRESH_INTERVAL = 1/0.0025 = 400hz。使用4個16位定時器400hz PWM
this is servo.h lib:
#define MIN_PULSE_WIDTH 700 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2000 // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH 1000 // default pulse width when servo is attached
#define REFRESH_INTERVAL 2500 // minimum time to refresh servos in microseconds
#define SERVOS_PER_TIMER 1 // the maximum number of servos controlled by one timer
#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER)
問題是要使它工作,每個PWM應該用1個16位定時器控制。另外,例如,1個定時器上的2個esc將會給200hz。所以所有的16位定時器都忙於控制4個ESC,但我仍然需要從接收器讀取輸入PPM。要做到這一點,我需要至少一個更多的16位計時器,我不再擁有這個計時器。
它仍然是一個8位定時器免費位它只能讀取0..255數字,而正常的數字操作是1000..2000和東西。
那麼如果我將使用相同的16位定時器同時讀取pwm和ppm,會發生什麼?它會起作用嗎?它會大幅降低速度嗎?
我有arduino與Raspberry Pi配對,它可以控制數據過濾,調試和其他東西,將ppm讀數轉移到Raspberry更好嗎?
你如何做到「ppm讀數」?你使用定時器的輸入捕捉模式嗎?或引腳更改中斷? - 一個8位計數器可以通過軟件擴展到任意寬度;如果仔細完成(ISR延遲!),這也適用於輸入捕獲。 – JimmyB
我正在使用引腳更改中斷。謝謝,軟件8位計數器擴展可能是一個解決方案,感謝新的空間谷歌。 – user3081123
你需要什麼樣的PWM信號分辨率?也就是說,在停止和全速之間你需要多少步驟?這個數字乘以那些400Hz,就可以指出PWM的速度有多快,並且可以判斷軟件PWM是否是一種選擇。 – JimmyB