目录
项目场景:
问题描述
原因分析:
解决方案:
项目场景:
编译环境:keil uverison5
初次学习stm32(stm32f103xx)控制舵机(mg90s)时,舵机不转动(代码逻辑没有问题)。
注:博客是记录我解决问题以及思考过程的,所以不会直接给出答案。
问题描述
这是我的舵机
这是我的代码,执行这个代码舵机不会动(可以确定代码是没有问题的):
void dj_init(){
GPIO_InitTypeDef GPIO_Initstructure;
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig (GPIO_Remap_SWJ_JTAGDisable,ENABLE);
GPIO_Initstructure.GPIO_Pin = GPIO_Pin_11;
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init (GPIOA,&GPIO_Initstructure);
// APB2 TIM1_CH4
// 2. 选择外部时钟源
TIM_InternalClockConfig(TIM1);
// 3.定时器参数配置
TIM_TimeBaseInitTypeDef timeBaseInitTypeDef;
timeBaseInitTypeDef.TIM_ClockDivision = TIM_CKD_DIV1;
timeBaseInitTypeDef.TIM_Period = 10000 - 1;
timeBaseInitTypeDef.TIM_Prescaler = 144 - 1;
timeBaseInitTypeDef.TIM_CounterMode = TIM_CounterMode_Up;
timeBaseInitTypeDef.TIM_RepetitionCounter = 0; // 高级tim(1,8)才有
// 4.定时器初始化
TIM_TimeBaseInit (TIM1,&timeBaseInitTypeDef) ;
// 5. tim 通道
TIM_OCInitTypeDef 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 = 5000;
// 6. tim 通道初始化
TIM_OC4Init(TIM1, &TIM_ocInitstructure);
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
// 7.开启定时器
TIM_Cmd(TIM1, ENABLE);
}
原因分析:
PA11是否对应TIM1?
在查阅资料之后确定PA11对应TIM1的第四通道。
舵机是否损坏?
在更换舵机之后仍然不运动。
代码哪里有问题?
代码量不多,PWM控制也没有问题,psc等频率计算也没有问题(apb1总线频率为36mhz)
解决方案:
对于高级定时器(TIM1、TIM8),需要额外加入一句话来使能PWM功能。
TIM_CtrlPWMOutputs(TIM1, ENABLE);
加入这句话之后舵机成功转动!