2011-09-06 78 views
0

如何生成用於在STM32F103控制伺服電機,定時器 C代碼 我想控制由PWM 伺服電機我從ADC值,則計算出PWM佔空比的PWM如何生成用於控制伺服電機PWM在STM32F103與定時器

。流程圖VR的 GET值 - > ADC模塊(轉換模擬到數字) - >計算PWM佔空比 - >使用定時器來生成用於控制伺服馬達的PWM - > while循環

對不起我的英語郎。

+0

它會更好地發佈到http://electronics.stackexchange.com/ – pmod

+4

這是你有哪些麻煩? –

回答

0

我假設你使用IDE並用C語言編寫,但我對此設備不熟悉。

基本上,您需要使用設備上有多個定時器,併爲「輸出比較」中斷編寫中斷處理程序。如果一個輸出比較中斷被使能,那麼每當定時器中的值與某個寄存器中的值匹配時,你的處理器就被調用。

一個常見的技巧是讓處理器將引腳切換到伺服器,然後在輸出比較寄存器中更改該值,以便在下次需要時再次觸發處理程序。

if(off) 
    turn pin on 
    ocreg += pwm_value 
else 
    turn pin off 
    ocreg += cycle-pwm_value 

引腳將保持正確的時間長度,並始終以相同的頻率開啓。您需要根據伺服規格爲這些變量找到合適的值。

您可以使用另一個定時器定期對ADC進行採樣,或者將其構建到與PWM相同的中斷處理程序中,或者甚至讓它在繁忙循環中運行,等待ADC完成。

main() 
    loop 
    start ADC 
    while (ADC busy) { do nothing } 
    calculate pwm and store in variable pwm_value 
    loop 

根據伺服規格,您可能需要稍微修改這些以防止週期漂移,但伺服系統一般都是相當寬容。

您需要爲您的編譯器找到中斷處理程序語法的示例,並且始終閱讀有關如何使用寄存器來控制定時器和啓用中斷的手冊。

祝你好運,併發佈一個新的問題與一些代碼,當你有更多的完成。

1

此代碼假定APB1時鐘= 72MHz的 Servo_Target作爲微秒的第八所以4000表示1毫秒(低伺服位置)和8000意味着2ms的(高伺服位置) 警告:PWM頻率是463Hz,所以你不能使用此設置模擬伺服。它爲無刷調節器工作。如果您想要使用模擬伺服你必須改變TIM_Prescaler,TIM_Period 並採取在帳戶上Servo_Target效果值

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
TIM_TimeBaseStructure.TIM_Period  = 8192;      

TIM_TimeBaseStructure.TIM_Prescaler = 18; TIM_TimeBaseInit(TIM2,& TIM_TimeBaseStructure); TIM_Cmd(TIM2,ENABLE); //啓動PWM定時器 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure。TIM_Pulse = Servo_Target; //這是1/8的寬度 /* PWM1模式配置:TIM2通道1 */ TIM_OC1Init(TIM2,& TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable); /* PWM1模式配置:TIM2通道2 */ TIM_OC2Init(TIM2,& TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable); //爲第3和第4通道添加OC3_和OC4_
TIM_ARRPreloadConfig(TIM2,ENABLE);