• STM32使用PWM控制舵机


    STM32使用PWM控制舵机

    1、舵机的控制原理

    舵机是一种位置伺服驱动器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只要控制信号持续不变,伺服机构就会保持相对的角度位置不变。如果控制信号发生变化,输出轴的位置也会相应发生变化。舵机的控制大部分都是通过PWM信号控制的。这里以stm32f103为例介绍。

    2、舵机运动图

    占空比 = t / T 相关参数如下:
    12.5% —————— 舵机会转到 -90°
    10.0% —————— 舵机会转到 -45°
    7.50% —————— 舵机会转到 0°
    5.00% —————— 舵机会转到 45°
    2.50% —————— 舵机会转到 90°
    通过程序设置定时器的TIM_Period = 1999,TIM_Prescaler = 719。
    计数器每加1的时间为=720/72000000s = 1/100000s = 10us 
    重装载值为1999,则定时器的周期为10us * 2000 = 20ms
    PB0 -- TIM3_CH3的PWM功能初始化:
    void TIM3_CH3_PWM_Init(u16 arr,u16 psc)
    {
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitTypeStructure;
        
        //打开端口时钟、复用功能时钟以及定时器外设时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE); 
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        
        GPIO_PinRemapConfig(GPIO_Remap_TIM3,ENABLE);    //使用部分映射或者不使用映射
        
        //设置该引脚为复用输出功能
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
        
        //初始化TIM3
        TIM_TimeBaseStruct.TIM_Period = arr;//重装载值 
        TIM_TimeBaseStruct.TIM_Prescaler = psc;//预分频值 
        TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;    
        TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
        
        //初始化PWM
        TIM_OCInitTypeStruct.TIM_OCMode = TIM_OCMode_PWM2; 
        TIM_OCInitTypeStruct.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitTypeStruct.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC3Init(TIM3,&TIM_OCInitTypeStructure); //选择定时器输出通道 TIM3_CH3
        
        //使能预装载寄存器
        TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
        
        //使能定时器
        TIM_Cmd(TIM3,ENABLE);
    }    
    主函数中TIM3_CH3的PWM功能初始化:
    TIM3_CH3_PWM_Init(1999,719);
    //PWM频率=72000000/(719+1)/(1999+1)= 50hz 周期为20ms 
    ​
    控制舵机:   
    //-90度
    TIM_SetCompare3(TIM3,1750);     //占空比(2000-1750)/ 2000 = 12.5%
    ​
    //45度
    //TIM_SetCompare3(TIM3,1800);   //占空比(2000-1800)/ 2000 = 10.0%
    ​
    //0度
    //TIM_SetCompare3(TIM3,1850);   //占空比(2000-1850)/ 2000 = 7.50%
    ​
    //-45度
    //TIM_SetCompare3(TIM3,1900);   //占空比(2000-1900)/ 2000 = 5.00%
    ​
    //-90度
    //TIM_SetCompare3(TIM3,1950);   //占空比(2000-1950)/ 2000 = 2.50%      
  • 相关阅读:
    【MySQL】MySQL的安装
    飞讯软件受邀参加天翼云中国行·惠州站活动,并签约生态合作共推工业数字化转型
    LeetCode链表集锦
    RabbitMQ消息队列学习笔记
    Spring Cloud Alibaba 分布式微服务高并发数据平台化(中台)思想+多租户saas企业开发架构技术选型和设计方案
    如何在 Elasticsearch 中选择精确 kNN 搜索和近似 kNN 搜索
    上下文管理器与with关键字为业务增加辅助功能
    (前端面试题)详解 JS 的 setTimeout 和 setInterval 两大定时器
    坠了,ACM怎么读取一串不知具体长度的int数组?
    2021年06月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 原文地址:https://blog.csdn.net/qq_45143522/article/details/138166485