STM32--舵机驱动
目录
舵机接线:
红色线 | 电源线(VCC) |
黑色 / 棕色 | 地线(GND) |
白色 / 黄色 | 信号线(pwm输出) |
注意:如果外接电源,那么舵机和开发板、电源之间需要共GND,即开发板上的GND与电源的GND和舵机的GND三者相连接。
如果三者没有共GND,这时舵机无法接收到正常的pwm驱动信号,如图所示,开发板输出周期为20ms,脉冲宽度(高电平宽度)为1.5ms的pwm完全变形,无法正常驱动舵机。
数字舵机与模拟舵机的区别:
数字舵机只需发送1次PWM信号就能运动到预定的角度,模拟舵机需要给它不停的发送PWM信号,才能让它保持在预定的角度。
数字舵机与模拟舵机的驱动控制方法是一样的。
舵机驱动(90度、180度、270度、360度):
90度舵机驱动:
转动角度 | 脉冲周期 | 脉冲宽度(高电平宽度) |
-45度 | 20ms | 0.5ms |
0度 | 20ms | 1.5ms |
45度 | 20ms | 2.5ms |
180度舵机驱动:
转动角度 | 脉冲周期 | 脉冲宽度(高电平宽度) |
-90度 | 20ms | 0.5ms |
-45度 | 20ms | 1ms |
0度 | 20ms | 1.5ms |
45度 | 20ms | 2ms |
90度 | 20ms | 2.5ms |
270度舵机驱动:
转动角度 | 脉冲周期 | 脉冲宽度(高电平宽度) |
-135度 | 20ms | 0.5ms |
0度 | 20ms | 1.5ms |
135度 | 20ms | 2.5ms |
360度舵机驱动:
转动角度 | 脉冲周期 | 脉冲宽度(高电平宽度) |
-180度 | 20ms | 0.5ms |
-90度 | 20ms | 1ms |
0度 | 20ms | 1.5ms |
90度 | 20ms | 2ms |
180度 | 20ms | 2.5ms |
所以90度、180度、270度、360度的舵机驱动方法是一样的。
1.驱动脉冲周期都是20ms
2.所有舵机在脉冲宽度为1.5ms驱动下,都位于0度。
STM32定时器配置:
stm32f4为例(时钟频率为84Mhz):
设置arr(自动重装载值)为10000-1=9999,psc(定时器分频系数)为168-1=167
时钟周期计算公式:T=(arr+1)*(psc+1)/ Tck
=(9999+1)*(167+1)/ 84Mhz
= 20 ms
stm32f1为例(时钟频率为72Mhz):
设置arr(自动重装载值为10000-1=9999),psc(定时器分频系数144-1=143)
时钟周期计算公式:T=(arr+1)*(psc+1)/ Tck
=(9999+1)*(143+1)/ 84Mhz
= 20 ms
*(stmf4的时钟频率为84Mhz,stm32f1时钟频率为72Mhz,Tck为时钟频率)*
STM32定时器PWM输出配置要点:
*** 注意定时器通道的输出极性 ***
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高。
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低。
1. TIM_OCPolarity_High:当定时器计数小于比较数值是输出高电平,大于比较数值是输出低电平。
输出极性:TIM_OCPolarity_High 比较极性高
设置 arr=9999,psc=167,TIM_SetCompare1(TIM14,500);
如图所示:周期20ms,频率50Hz,脉冲宽度(高电平宽度)= 1ms
2.TIM_OCPolarity_Low:当定时器计数小于比较数值是输出低电平,大于比较数值是输出高电平。
输出极性:TIM_OCPolarity_Low比较极性低
设置 arr=9999,psc=167,TIM_SetCompare1(TIM14,500);
如图所示:周期20ms,频率50Hz,脉冲宽度(高电平宽度)= 19 ms
输出极性:TIM_OCPolarity_High 比较极性高 TIM_SetCompare1(TIM14,number);
设置 arr=9999,psc=167
脉冲宽度(高电平宽度) | 比较数值, |
0.5ms | number = 250 |
1ms | number = 500 |
1.5ms | number = 750 |
2ms | number = 1000 |
2.5ms | number = 1250 |
输出极性:TIM_OCPolarity_Low比较极性低 TIM_SetCompare1(TIM14,number);
设置 arr=9999,psc=167
脉冲宽度(高电平宽度) | 比较数值,TIM_SetCompare1(TIM14,number); |
0.5ms | number = 9750 |
1ms | number = 9500 |
1.5ms | number = 9250 |
2ms | number = 9000 |
2.5ms | number = 8750 |
STM32定时器配置:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "pwm.h"
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
TIM14_PWM_Init(10000-1,168-1);
while(1)
{
TIM_SetCompare1(TIM14,500);
}
}
void TIM14_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
//初始化TIM14 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
TIM_Cmd(TIM14, ENABLE); //使能TIM14
}
更多推荐
所有评论(0)