STM32控制SG90舵機原理及代碼
- 一.SG90舵機原理
- 二.控制SG90舵機
- 三.代碼實例
- 3.1 配置定時器
- 3.2 main 函數
- 四.實驗現象
一.SG90舵機原理
舵機的運用還是比較廣泛的,那么舵機工作原理是什么呢,一般來說我們給舵機一個信號他就能工作了,那么這個信號是什么,以及如何產生的呢。這里我們需要給舵機一個PWM信號,頻率是50HZ,即周期是20ms(產品手冊上這樣說的。)。在這個條件下不同的占空比就是不同的信號。不同的信號就能控制舵機轉動角度。注意:舵機只有在改變信號時才會轉動,一直維持一種信號的情況舵機是不會轉動。
二.控制SG90舵機
那么我們如何控制舵機呢,我們需要單片機產生一個20ms的信號PWM(產品手冊上這樣說的。)然后我們可以設置占空比來控制舵機如何轉動。這里怎么產生PWM波和設置占空比可以參考博主的一篇文章,寫的很詳細。pwm詳解
三.代碼實例
我這里使用的是stm32f103ZET6的定時器8的通道一 PC8引腳
3.1 配置定時器
void TIM8_PWM_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE); // 開啟定時器時鐘,即內部時鐘CK_INT=72MRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//設置輸出速度GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC_Pin_9//周期為72M/(200*7200)us=20msTIM_TimeBaseStructure.TIM_Period= (200-1); //自動重裝載寄存器的值,累計TIM_Period+1個頻率后產生一個更新或者中斷TIM_TimeBaseStructure.TIM_Prescaler= (7200-1); //驅動CNT計數器的時鐘 = Fck_int/(psc+1)TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //時鐘分頻因子 ,用于配置死區時間,沒用到,隨意TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//計數器計數模式,設置為向上計數TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //重復計數器的值,沒用到,可以隨意設置TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //初始化定時器TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置為PWM模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//輸出使能TIM_OCInitStructure.TIM_Pulse = 0; //設置占空比大小,在主函數compare中又設置一遍TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出通道電平極性配置TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //輸出通道空閑電平極性配置TIM_OC1Init(TIM8, &TIM_OCInitStructure); //初始化通道1TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); //使能通道1輸出TIM_Cmd(TIM8, ENABLE); //使能計數器TIM_CtrlPWMOutputs(TIM8, ENABLE); // 主輸出使能,當使用的是通用定時器時,這句不需要
}
3.2 main 函數
/* 主函數 */
int main(void)
{ delay_init(); //延時初始化TIM8_PWM_Init(); //舵機初始化 while(1){ //解釋一下,這里只要產生一個周期的信號即(20ms)舵機就能轉動//如果一直保持這個信號,舵機也不會再轉動。//這里延時只是為了觀察現象。轉動后,過1s再轉動。TIM_SetCompare1(TIM8,5);//轉到0度位置delay_ms(1000);TIM_SetCompare1(TIM8,15);//轉到90度位置delay_ms(1000); TIM_SetCompare1(TIM8,25);//轉到180度位置delay_ms(1000); }
}
四.實驗現象
舵機實驗