初级会员

- 积分
- 116
- 金钱
- 116
- 注册时间
- 2019-10-16
- 在线时间
- 18 小时
|
一般来说,舵机接收的PWM信号频率为50HZ,即周期为20ms。当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。如下图
舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同。舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比(1. 占空比是指高电平在一个周期之内所占的时间比率。2. 正脉冲的持续时间与脉冲总周期的比值。例如:正脉冲宽度1μs,信号周期10μs的脉冲序列占空比为0.1。
标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms之间,但是,事实上脉宽可由0.5ms到2.5ms之间,脉宽和舵机的转角0°~180°相对应。
以下为代码,讲解可以看我上有关于PWM控制led亮度的一个帖子
pwm.h
- #ifndef __PWM_H
- #define __PWM_H
- #include "sys.h"
- void TIM3_PWM_Init(u16 arr,u16 psc);
- #endif
复制代码
pwm.c
- #include "pwm.h"
- void TIM3_PWM_Init(u16 arr,u16 psc)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
- TIM_OCInitTypeDef TIM_OCInitStructure;
-
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
-
-
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- GPIO_SetBits(GPIOB,GPIO_Pin_5);
-
- GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
-
- TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
- TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
- TIM_TimeBaseInitstruct.TIM_Period=arr;
- TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);
-
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
- TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC2
-
- TIM_Cmd(TIM3, ENABLE);
-
- TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
- }
复制代码
main.c
- #include "stm32f10x.h"
- #include "delay.h"
- #include "pwm.h"
- int main()
- {
- u16 delay_time = 500;
- u16 angle=195;
- u8 i;
- delay_init();
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- TIM3_PWM_Init(199,7199);
- while(1)
- {
- for(i=0;i<4;i++)
- {
- delay_ms(delay_time);
- TIM_SetCompare2(TIM3,angle);
- angle-=5;
- }
- for(i=0;i<4;++)
- {
- delay_ms(delay_time);
- TIM_SetCompare2(TIM3,angle);//舵机从0->45->90->135->180->135->90->45->0->45->...
- angle+=5;
- }
- }
-
- }
复制代码
|
|