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%      
相关推荐
qq_4480111641 分钟前
C语言中的柔性数组
c语言·开发语言·柔性数组
zlinear数据采集卡1 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
ACP广源盛139246256731 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
luj_17683 小时前
塔防牌:策略与卡牌的智慧碰撞
服务器·c语言·开发语言·经验分享·算法
Rocktech_ruixun3 小时前
机器人端侧大模型部署对主板有哪些要求?瑞迅主控板分级方案对比
人工智能·嵌入式硬件·机器人
wuyk5554 小时前
3.链表:用指针串联的动态数据结构
c语言·开发语言·数据结构·链表
Lzh编程小栈4 小时前
【嵌入式底层】SPI超透彻详解:通信原理、四线结构、四种模式、寄存器底层 + 面试全集
c语言·stm32·单片机·面试·职场和发展
Rocktech_ruixun4 小时前
机器人数据采集能力取决于什么?瑞迅科技RK3588/3576核心板方案深度解析
人工智能·嵌入式硬件·机器人
水果里面有苹果5 小时前
28-DRV8825PWPR步进电机驱动器
单片机
恒锐丰科技韩生5 小时前
率能 SS6625E|3.0~20V 单通道 H 桥直流电机驱动 SOP8 电子锁玩具机器人分享
嵌入式硬件·硬件工程