硬件是新买的应该没问题
用PWM驱动sg90 180°舵机,舵机只是吱吱响,一点也不转
下面是源代码
servo.h头文件
#ifndef _SERVO_
#define _SERVO_
void PWM_Init(int ARR, int PSC, int CCR);
void Servo_Init();
void Servo_WriteAngle(int Angle);
void Servo_AddAngle(int Angle);
#endif
servo.c源文件
int angle = 0;
void PWM_Init(int ARR, int PSC, int CCR)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //用TIM2时钟
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
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_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCStructInit(&TIM_OCInitStruct);
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse = CCR;
TIM_OC1Init(TIM2, &TIM_OCInitStruct);
TIM_OC2Init(TIM2, &TIM_OCInitStruct);
TIM_OC3Init(TIM2, &TIM_OCInitStruct);
TIM_OC4Init(TIM2, &TIM_OCInitStruct);
TIM_Cmd(TIM2, ENABLE);
}
void Servo_Init()
{
PWM_Init(20000 - 1, 72 - 1, 0);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_Initstructre = {GPIO_Pin_1, GPIO_Speed_50MHz, GPIO_Mode_AF_PP}; //舵机接在PA1口
GPIO_Init(GPIOA, &GPIO_Initstructre);
}
void Servo_WriteAngle(int Angle)
{
angle = Angle;
TIM_SetCompare2(TIM2, angle * 200 / 18 + 500); //PA1口对应TIM2_CH2
}
void Servo_AddAngle(int Angle)
{
angle = (Angle + angle) % 180;
TIM_SetCompare2(TIM2, angle * 200 / 18 + 500);
}
main.c
#include "stm32f10x.h"
#include "Delay.h"
#include "servo.h"
int main()
{
Servo_Init();
Servo_WriteAngle(0);
while(1)
{
Servo_AddAngle(30);
Delay_ms(1000);
}
}