正點原子stm32f407開發板函數
對於通常的舵機來講,所對應的PWM波的週期爲20ms,即舵機接收的PWM信號頻率爲50HZ。
其空佔比與轉動角度的關係。普通舵機的舵量是0~180°。脈衝寬度範圍 0.5ms ~ 2.5ms
spa
0.5ms/20ms = 0 度 1.0ms/20ms = 45 度 1.5ms/20ms = 90 度 2.0ms/20ms = 135 度 2.5ms/20ms = 180 度
本文代碼參考正點原子stm32f4 pwm輸出教程代碼而修改得來。
code
修改的地方:
使用了PA0複用定時器TIM2
blog
主函數教程
int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2 delay_init(168); //初始化延時函數 TIM2_PWM_Init(200-1,8400-1); //84M/8400/200=50hz. 此處的200就是計數器的比較值 e.g.175/200*20ms=17.5ms 得脈衝寬度:20ms-17.5ms=2.5ms while(1) { delay_ms(1000); TIM_SetCompare1(TIM2,175); //修改比較值,修改佔空比對應180度 delay_ms(1000); TIM_SetCompare1(TIM2,180); //修改比較值,修改佔空比對應180度 delay_ms(1000); TIM_SetCompare1(TIM2,185); //修改比較值,修改佔空比對應180度 delay_ms(1000); TIM_SetCompare1(TIM2,190); //修改比較值,修改佔空比對應180度 delay_ms(1000); TIM_SetCompare1(TIM2,195); //修改比較值,修改佔空比對應180度 } }
pwm.c文件圖片
//TIM2 PWM部分初始化 //PWM輸出初始化 //arr:自動重裝值 //psc:時鐘預分頻數 void TIM2_PWM_Init(u32 arr,u32 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //TIM2時鐘使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA時鐘 GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM2); //GPIOA0複用爲定時器2 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //複用 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推輓複用輸出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0 TIM_TimeBaseStructure.TIM_Prescaler=psc; //定時器分頻 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上計數模式 TIM_TimeBaseStructure.TIM_Period=arr; //自動重裝載值 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化定時器2 //初始化TIM2 Channel PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈衝寬度調製模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較使能輸出 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性:TIM輸出比較極性低 TIM_OCInitStructure.TIM_Pulse = 0;//比較初始值 TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM2 OC1 TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR1是的預裝載寄存器 TIM_ARRPreloadConfig(TIM2,ENABLE);//ARPE使能 TIM_Cmd(TIM2, ENABLE); //使能TIM2 }
頭文件本身寫ip
完成!!!開發