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);//初始化TIM3TIM_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);//初始化PWMTIM_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%