赞
踩
目录
红色线 | 电源线(VCC) |
黑色 / 棕色 | 地线(GND) |
白色 / 黄色 | 信号线(pwm输出) |
注意:如果外接电源,那么舵机和开发板、电源之间需要共GND,即开发板上的GND与电源的GND和舵机的GND三者相连接。
如果三者没有共GND,这时舵机无法接收到正常的pwm驱动信号,如图所示,开发板输出周期为20ms,脉冲宽度(高电平宽度)为1.5ms的pwm完全变形,无法正常驱动舵机。
数字舵机只需发送1次PWM信号就能运动到预定的角度,模拟舵机需要给它不停的发送PWM信号,才能让它保持在预定的角度。
数字舵机与模拟舵机的驱动控制方法是一样的。
转动角度 | 脉冲周期 | 脉冲宽度(高电平宽度) |
-45度 | 20ms | 0.5ms |
0度 | 20ms | 1.5ms |
45度 | 20ms | 2.5ms |
转动角度 | 脉冲周期 | 脉冲宽度(高电平宽度) |
-90度 | 20ms | 0.5ms |
-45度 | 20ms | 1ms |
0度 | 20ms | 1.5ms |
45度 | 20ms | 2ms |
90度 | 20ms | 2.5ms |
转动角度 | 脉冲周期 | 脉冲宽度(高电平宽度) |
-135度 | 20ms | 0.5ms |
0度 | 20ms | 1.5ms |
135度 | 20ms | 2.5ms |
转动角度 | 脉冲周期 | 脉冲宽度(高电平宽度) |
-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度。
设置arr(自动重装载值)为10000-1=9999,psc(定时器分频系数)为168-1=167
时钟周期计算公式:T=(arr+1)*(psc+1)/ Tck
=(9999+1)*(167+1)/ 84Mhz
= 20 ms
设置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为时钟频率)*
*** 注意定时器通道的输出极性 ***
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 |
- #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
-
-
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。