173934tzpgxzk39xxnxzmp.gif (184.18 KB)
下載附件
2020-6-4 01:13 上傳
173935iww82i2h88klizzf.jpg (47.21 KB)
下載附件
2020-6-4 01:13 上傳
對于一般的舵機來說,所對應的PWM波的周期為**200ms**,即舵機接收的PWM信號頻率為**50HZ**。
其空占比與轉動角度的關系。普通舵機的舵量是0~180°。**脈沖寬度范圍 0.5ms ~ 2.5ms**
0.5ms/200ms = 0 度
1.0ms/200ms = 45 度
1.5ms/200ms = 90 度
2.0ms/200ms = 135 度
2.5ms/200ms = 180 度本文代碼參考正點原子stm32f4 pwm輸出教程代碼而修改得來。
**修改的地方:**
使用了PA0復用定時器TIM2
**主函數**
- 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
- }
復制代碼
**頭文件自己寫**
**完成!!!**
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|