YoungTalk STM32——舵机与PWM

舵机简介

YoungTalk STM32——舵机与PWM_第1张图片
YoungTalk STM32——舵机与PWM_第2张图片
YoungTalk STM32——舵机与PWM_第3张图片

YoungTalk STM32——舵机与PWM_第4张图片

使用PWM控制舵机

YoungTalk STM32——舵机与PWM_第5张图片
YoungTalk STM32——舵机与PWM_第6张图片
YoungTalk STM32——舵机与PWM_第7张图片
YoungTalk STM32——舵机与PWM_第8张图片
YoungTalk STM32——舵机与PWM_第9张图片
YoungTalk STM32——舵机与PWM_第10张图片
YoungTalk STM32——舵机与PWM_第11张图片
定时期复用功能重映射需查阅STM32F10XXX参考手册119页8.3.7 定时器复用功能重映射 相关内容,给出了每个定时器IO端口的复用关系。下表为定时器TIM3的IO端口的复用功能。
YoungTalk STM32——舵机与PWM_第12张图片
注意48脚不能使用完全重映像。

定时器初始化程序分析

void TIM3_PWM_Init(u16 arr,u16 psc){  //TIM3 PWM初始化 arr重装载值 psc预分频系数
    GPIO_InitTypeDef     GPIO_InitStrue;
    TIM_OCInitTypeDef     TIM_OCInitStrue;
    TIM_TimeBaseInitTypeDef     TIM_TimeBaseInitStrue;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3和相关GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟(LED在PB0引脚)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟(定时器3通道3需要重映射到BP5引脚)
    
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0;     // TIM_CH3
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    // 复用推挽
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //设置最大输出速度
    GPIO_Init(GPIOB,&GPIO_InitStrue);                //GPIO端口初始化设置
    
//    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //映射,重映射只用于64、100、144脚单片机
   //当没有重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PA6,PA7,PB0,PB1
   //当部分重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PB4,PB5,PB0,PB1 (GPIO_PartialRemap_TIM3)
   //当完全重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PC6,PC7,PC8,PC9 (GPIO_FullRemap_TIM3) 
	      
    TIM_TimeBaseInitStrue.TIM_Period=arr;    //设置自动重装载值
    TIM_TimeBaseInitStrue.TIM_Prescaler=psc;        //预分频系数
    TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;    //计数器向上溢出
    TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;        //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1,只对电路的稳定性有影响
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);        //TIM3初始化设置(设置PWM的周期)
    
    TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1;        // PWM模式1:CNT < CCR时输出有效电平
    TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效电平为:高电平
    TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能
    TIM_OC3Init(TIM3,&TIM_OCInitStrue);        //TIM3的通道3 PWM 模式设置

    TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);        //使能预装载寄存器
    
    TIM_Cmd(TIM3,ENABLE);        //使能TIM3
    
}

对结构体定义

GPIO_InitTypeDef GPIO_InitStrue;
TIM_OCInitTypeDef TIM_OCInitStrue;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;

设置时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3和相关GPIO时钟
具体使用哪一个时钟需要参考对应输出的IO端口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟(LED在PB0引脚)
对时钟输出端口进行设置,TIM输出端口组为PB组,在此开启PB组IO端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟(定时器3通道3需要重映射到BP5引脚)
使能AFIO时钟

设置IO端口

GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0; // TIM_CH3
设置端口号
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; // 复用推挽
设置为复用推挽输出
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz; //设置最大输出速度
设置输出速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStrue); //GPIO端口初始化设置
将以上设置写入PB组IO端口
这是为了使用PB0作为输出,即使用TIM3的第三号通道。

定时器设置

TIM_TimeBaseInitStrue.TIM_Period=arr; //设置自动重装载值
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数器向上溢出

TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
计数方式设置为向上计数
YoungTalk STM32——舵机与PWM_第13张图片

主函数中的调用

TIM3_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

公式为:周期(溢出时间Tout)(单位秒)=(arr+1)(psc+1)/Tclk

PWM输出方式设置

TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1; // PWM模式1:CNT < CCR时输出有效电平
YoungTalk STM32——舵机与PWM_第14张图片
YoungTalk STM32——舵机与PWM_第15张图片
TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效电平为:高电平
YoungTalk STM32——舵机与PWM_第16张图片
TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能
开启定时器的外部输出,使定时器的状态通过IO端口进行外部输出

TIM_OC3Init(TIM3,&TIM_OCInitStrue); //TIM3的通道3 PWM 模式设置
将以上的三条设置写入TIM3的通道3
TIM_OC3Init意为通道3,不同的通道号会从不同的IO口输出。由于选择PB0进行输出,且用了定时器3,所以这里选择通道3。
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能预装载寄存器
TIM_Cmd(TIM3,ENABLE); //使能TIM3
最后开启定时器3

主函数中的调用

TIM_SetCompare3(TIM3,1500);
TIM_SetCompare33代表通道号。
其中参数为(定时器编号,CCR)
其中CCR决定占空比,其值的大小计算参照AAR
YoungTalk STM32——舵机与PWM_第17张图片

你可能感兴趣的:(YoungTalk STM32——舵机与PWM)