TIM通道控制3路舵机
使用TIM2:PA0-TIM2_CH1;PA1-TIM2_CH2;PA2-TIM2_CH3;PA0-2接三個舵機。三個舵機分別3個指示燈,PB5-PB7。不動時三個燈全亮,動哪一個其余兩個燈熄滅。
主程序:
#include "stm32f10x.h" //STM32頭文件
#include "sys.h"
#include "delay.h"
#include "pwm.h"
#include "MG996.h"
#include "led.h"
int main (void)//主程序
{
?? ?delay_ms(500); ? ? ? ? ? ?//上電時等待其他器件就緒
?? ?RCC_Configuration(); ? ? ?//系統時鐘初始化?
?? ?TIM2_PWM_Init(59999,23); ?//設置頻率為50Hz,公式為:溢出時間Tout(單位秒)=(arr+1)(psc+1)/Tclk?? ? 20MS = (59999+1)*(23+1)/72000000
? ? ? ? ? ? ? ? ? ? ? ? ? ? //Tclk為通用定時器的時鐘,如果APB1沒有分頻,則就為系統時鐘,72MHZ
? ? ? ? ? ? ? ? ? ? ? ? ? ? //PWM時鐘頻率=72000000/(59999+1)*(23+1) = 50HZ (20ms),設置自動裝載值60000,預分頻系數24
? LED_Init(); ? ? ? ? ? ? ? //LED驅動初始化
? LEDstate_Init(); ? ? ? ? ?//led三個燈初始化先閃爍5次
?? ?MG996_Init(); ? ? ? ? ?//三個舵機角度初始化
?? ?delay_s(2);
?? ?while(1)
?? ??? ?{
?? ??? ? MG996_angle1(2000);
?? ??? ? delay_s(2);
?? ??? ? MG996_angle2(3000);
?? ??? ? delay_s(2);
?? ??? ? MG996_angle3(4000);
?? ??? ? delay_s(1);
?? ??? ? MG996_angle1(7500);
?? ??? ? MG996_angle2(7500);
?? ??? ? MG996_angle3(7500);
?? ??? ? delay_s(3);
?? ? ?}
}
PWM驅動程序:
#include "pwm.h"
void TIM2_PWM_Init(u16 arr,u16 psc)//TIM2 PWM初始化 arr重裝載值 psc預分頻系數
?? ?{ ?
? ? GPIO_InitTypeDef ? ? ? ? ? ?GPIO_InitStrue;
? ? TIM_OCInitTypeDef ? ? ? ? ? TIM_OCInitStrue;
? ? TIM_TimeBaseInitTypeDef ? ? TIM_TimeBaseInitStrue;
? ? ?
? ? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能TIM2和相關GPIO時鐘?
?? ? ?RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); ?//使能GPIOA時鐘(TIM2_CH1,CH2,CH3在PA引腳上)?
? ? GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; // TIM2_CH1,TIM2_CH2,TIM2_CH3
? ? GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; ? ? ? ?// 復用推挽
? ? GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz; ? ? ?//設置最大輸出速度
? ? GPIO_Init(GPIOA,&GPIO_InitStrue); ? ? ? ? ? ? ? ?//GPIO端口初始化設置
?? ? ? ? ?
? ? TIM_TimeBaseInitStrue.TIM_Period=arr; ? ?//設置自動重裝載值,TIM_TimeBaseInitStrue用來設置基本頻率
? ? TIM_TimeBaseInitStrue.TIM_Prescaler=psc; ? ? ? ?//預分頻系數
? ? TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; ? ?//計數器向上溢出
? ? TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1; ? ? ? ?//時鐘的分頻因子,起到了一點點的延時作用,一般設為TIM_CKD_DIV1
? ? TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStrue); ? ? ? ?//TIM2初始化設置(設置PWM的周期)
? ??
? ? TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1; ? ? ? ?// PWM模式1:CNT < CCR時輸出有效電平,TIM_OCInit是配置輸出通道
? ? TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 設置極性-有效電平為:高電平
?? ??? ?TIM_OCInitStrue.TIM_Pulse =0;
? ? TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 輸出使能
? ? TIM_OC3Init(TIM2,&TIM_OCInitStrue); ? ? ? ?//TIM2的通道3 PWM 模式設置
? ? TIM_OC2Init(TIM2,&TIM_OCInitStrue); ? ? ? ?//TIM2的通道2 PWM 模式設置
?? ??? ?TIM_OC1Init(TIM2,&TIM_OCInitStrue); ? ? ? ?//TIM2的通道2 PWM 模式設置
?? ??? ?
? ? TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable); ? ? ? ?//使能預裝載寄存器
? ? TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable); ? ? ? ?//使能預裝載寄存器
?? ??? ?TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable); ? ? ? ?//使能預裝載寄存器
?? ??? ?
? ? TIM_Cmd(TIM2,ENABLE); ? ? ? ?//使能TIM2
? ??
}
?
總結
以上是生活随笔為你收集整理的TIM通道控制3路舵机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试经验(互联网,研究所,国企)
- 下一篇: 斗破苍穹小游戏