欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > 十五、STM32的TIM(六)(PWM驱动舵机)

十五、STM32的TIM(六)(PWM驱动舵机)

2025/6/5 17:34:14 来源:https://blog.csdn.net/weixin_64632926/article/details/148290542  浏览:    关键词:十五、STM32的TIM(六)(PWM驱动舵机)

介绍:本章节主要讲解如何在 STM32C8T6 上使用 PWM 驱动舵机。通过按键输入控制,输出以 PWM 信号调整舵机转动角度,从而实现对舵机的精准控制。

目录

一、接线图

二、相关参数的计算

三、相关代码的编写

四、程序现象


一、接线图

二、相关参数的计算

PWM频率:Freq = CK_PSC / (PSC + 1) / (ARR + 1)

                     Freq =72M/(PSC + 1) / (ARR + 1)=1/20(ms)=50Hz

周期20ms ARR设为20K  那么PSC设置为72M。

PWM占空比:  Duty = CCR / (ARR + 1) 

那我们就可以通过设置CCR的值来改变舵机的角度。

 

三、相关代码的编写

void PWM_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_InternalClockConfig(TIM2);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;		//ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;		//CCRTIM_OC2Init(TIM2, &TIM_OCInitStructure);TIM_Cmd(TIM2, ENABLE);
}
void PWM_SetCompare2(uint16_t Compare)
{TIM_SetCompare2(TIM2, Compare);
}
void Servo_Init(void)
{PWM_Init();
}void Servo_SetAngle(float Angle)
{PWM_SetCompare2(Angle / 180 * 2000 + 500);
}
int main(void)
{OLED_Init();Servo_Init();Key_Init();OLED_ShowString(1, 1, "Angle:");while (1){KeyNum = Key_GetNum();if (KeyNum == 1){Angle += 30;if (Angle > 180){Angle = 0;}}Servo_SetAngle(Angle);OLED_ShowNum(1, 7, Angle, 3);}
}

 void PWM_Init(void),根据前面几章配置。

TIM_OCInitStructure.TIM_Pulse = 0;        //CCR,初始化为0,后面通过void PWM_SetCompare2(uint16_t Compare)来改变。

void Servo_SetAngle(float Angle)封装了一个函数,也可以不封装。

 

四、程序现象

 没按下一次按钮,舵机都会转动30°,要是超过最大限度180°,就归0.

 At the end of this article, applaud yourself again!!

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词