欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

YoungTalk STM32——舵机与PWM

程序员文章站 2024-02-24 09:32:49
...

舵机简介

YoungTalk STM32——舵机与PWM
YoungTalk STM32——舵机与PWM
YoungTalk STM32——舵机与PWM

YoungTalk STM32——舵机与PWM

使用PWM控制舵机

YoungTalk STM32——舵机与PWM
YoungTalk STM32——舵机与PWM
YoungTalk STM32——舵机与PWM
YoungTalk STM32——舵机与PWM
YoungTalk STM32——舵机与PWM
YoungTalk STM32——舵机与PWM
YoungTalk STM32——舵机与PWM
定时期复用功能重映射需查阅STM32F10XXX参考手册119页8.3.7 定时器复用功能重映射 相关内容,给出了每个定时器IO端口的复用关系。下表为定时器TIM3的IO端口的复用功能。
YoungTalk STM32——舵机与PWM
注意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

主函数中的调用

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
YoungTalk STM32——舵机与PWM
TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效电平为:高电平
YoungTalk STM32——舵机与PWM
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