STM32之使用PWM控制多路舵机

 

 

前言

 

    最近在玩一个6自由度的机械臂,我手上这台机械臂的核心控制器件就是那六个能够180度旋转的舵机了。想想之前在学校还没有系统性的把舵机给玩明白,所以就索性拿手上的STM32来自己写驱动代码,将6个舵机给驱动起来。

 

舵机控制原理

 

 

    舵机的控制原理还是比较简单的,而且控制的角度和精度能够比较好的按照开发者的意愿来进行,因此经常被应用与一些控制类器械中,如机械手、云台、2自由度摄像头等产品中。

 

    舵机的外接线一般分为3根线,电源线、地线和信号线,而控制舵机转动,就是通过信号线给舵机发送一系列的周期信号(一般的舵机的能接收的信号周期为20ms),然后通过控制周期信号的高电平的持续时间来达到控制舵机转动的目的。我手上的舵机就是根据高电平持续时间(0.5ms~2.5ms)来实现0~180的转动的。下面附上一张舵机周期信号控制和转动角度的图片说明。

 

 

 

 

 

    当然了,周期信号的产生可以使用很多方式,但是使用PWM来控制高电平的占空比不失为一种最好的应用方式。在STM32中,STM32的定时器也都提供有PWM的功能。下面就说明一下STM32输出PWM的具体实现方式。

 

使用STM32控制单个舵机

 

 

    在STM32中控制舵机,实际上就是开发STM32上的PWM功能,这部分功能需要配置STM32的定时器和GPIO复用共功能,然后就是通过修改定时器计数器的比较寄存器的数值来达到控制PWM的高电平占空比的目的。

 

 

 

    这里以STM32F767为例,说明一下具体的实现。

 

 

 

 

   下面使用到了STM32F7中的定时器3作为主定时器,使用通道4来产生PWM。需要注意的定时器3的通道4是通过GPIOB1接口输出的,因此还需要将GPIOB1配置为复用输出功能。PWM的输出比较极性设置为高。

TIM_HandleTypeDef TIM3_Handler;
TIM_OC_InitTypeDef TIM3_CH4Handler;
//arr 为自动重装值
//psc 为时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{ 
    TIM3_Handler.Instance=TIM3;    
    TIM3_Handler.Init.Prescaler=psc;      
    TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;
    TIM3_Handler.Init.Period=arr;         
    TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    
  • 57
    点赞
  • 358
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论
#define POSA 0 #define POSB 500 #define POSC 1000 #define POSD 1500 #define POSE 2000 #define POSF 2500 #define POSG 0 /**********************************************************************************/ /*****************************Ö÷º¯Êý***********************************************/ int main(void) { Timer_Init(); //¶¨Ê±Æ÷³õʼ»¯ SysTick_Init(); //ϵͳµÎ´ð¶¨Ê±Æ÷³õʼ»¯ GPIO_Config(); //GPIO³õʼ»¯ USART1_Config(); //³õʼ»¯´®¿Ú1 USART3_Config(); //³õʼ»¯´®¿Ú3 Timer_ON(); //¿ªÆô¶¨Ê±Æ÷ while (1) { /*CPWM[0]=POSA;CPWM[1]=POSA;CPWM[2]=POSA;CPWM[3]=POSA;CPWM[4]=POSA;CPWM[5]=POSA; CPWM[6]=POSA;CPWM[7]=POSA;CPWM[8]=POSA;CPWM[9]=POSA;CPWM[10]=POSA;CPWM[11]=POSA; CPWM[12]=POSA;CPWM[13]=POSA;CPWM[14]=POSA;CPWM[15]=POSA;CPWM[16]=POSA;CPWM[17]=POSA; CPWM[18]=POSA;CPWM[19]=POSA;CPWM[20]=POSA;CPWM[21]=POSA;CPWM[22]=POSA;CPWM[23]=POSA; Delay_ms(1000);*/ CPWM[0] =POSB;CPWM[1] =POSB;CPWM[2] =POSB;CPWM[3] =POSB;CPWM[4] =POSB;CPWM[5] =POSB; CPWM[6] =POSB;CPWM[7] =POSB;CPWM[8] =POSB;CPWM[9] =POSB;CPWM[10]=POSB;CPWM[11]=POSB; CPWM[12]=POSB;CPWM[13]=POSB;CPWM[14]=POSB;CPWM[15]=POSB;CPWM[16]=POSB;CPWM[17]=POSB; CPWM[18]=POSB;CPWM[19]=POSB;CPWM[20]=POSB;CPWM[21]=POSB;CPWM[22]=POSB;CPWM[23]=POSB; Delay_ms(1000); CPWM[0]=1500;CPWM[1]=1500;CPWM[2]=1500;CPWM[3]=1500;CPWM[4]=1500;CPWM[5]=1500; CPWM[6]=1500;CPWM[7]=1500;CPWM[8]=1500;CPWM[9]=1500;CPWM[10]=1500;CPWM[11]=1500; CPWM[12]=1500;CPWM[13]=1500;CPWM[14]=1500;CPWM[15]=1500;CPWM[16]=1500;CPWM[17]=1500; CPWM[18]=1500;CPWM[19]=1500;CPWM[20]=1500;CPWM[21]=1500;CPWM[22]=1500;CPWM[23]=1500; Delay_ms(1000); CPWM[0]=2300;CPWM[1]=2300;CPWM[2]=2300;CPWM[3]=2300;CPWM[4]=2300;CPWM[5]=2300; CPWM[6]=2300;CPWM[7]=2300;CPWM[8]=2300;CPWM[9]=2300;CPWM[10]=2300;CPWM[11]=2300; CPWM[12]=2300;CPWM[13]=2300;CPWM[14]=2300;CPWM[15]=2300;CPWM[16]=2300;CPWM[17]=2300; CPWM[18]=2300;CP

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘雪冰峰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值