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
    
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值