MG90S舵机
1. 简介
舵机即可以通过输入指定占空比的PWM实现输出固定角度偏转的电机,通过调节输入的PWM波的占空比可以实现舵机不同角度的偏转
不同型号的舵机可实现偏转的角度不同,比如此次使用到的MG90S舵机,即可实现0-180°的偏转(如果你用力去拧舵机的齿轮,会发现拧到0°和180°时便不能在拧动了)
2. 原理
舵机实际上是由一个直流电机,一个编码器和若干齿轮组合而成的
舵机的控制原理实际上是一个位置环控制(PID控制内容,详见:直流电机控制),与普通直流电不同的是,舵机可以直接使用STM32的IO口输出PWM波控制,而不需要额外的驱动芯片
3. 程序逻辑
控制舵机实际上只需要使用定时器输出一束PWM就可以了(详见:PWM波输出)
TIM_HandleTypeDef TIM3_Handler; //定时器句柄
TIM_OC_InitTypeDef TIM3_CH2Handler; //定时器3通道2句柄
/*
*********************************************************************************************************
* 函 数 名: TIM3_PWM_Init
* 功能说明: 初始化TIM3CH2为PWM输出
定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
Ft=定时器工作频率,单位:Mhz
* 形 参: 1.arr:自动重装载值
2.psc:时钟预分频数
* 返 回 值: 无
*********************************************************************************************************
*/
void TIM3_PWM_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //定时器3
TIM3_Handler.Init.Prescaler=psc; //定时器分频
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数模式
TIM3_Handler.Init.Period=arr; //自动重装载值
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM3_Handler); //初始化PWM
TIM3_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM3_CH2Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
TIM3_CH2Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低
HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH2Handler,TIM_CHANNEL_2);//配置TIM3通道2
HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_2);//开启PWM通道2
}
//定时器底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //使能定时器3
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
GPIO_Initure.Pin=GPIO_PIN_7; //PA7
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
}
/*
*********************************************************************************************************
* 函 数 名: TIM_SetTIM3Compare2
* 功能说明: 设置TIM3CH2输出的PWM的占空比
* 附:舵机各个角度PWM: 0-195 45-190 90-185 135-180 180-175
* 形 参: compare:占空比
* 返 回 值: 无
*********************************************************************************************************
*/
void TIM_SetTIM3Compare2(u32 compare)
{
TIM3->CCR2=compare;
}