zws164393 2024-10-15 23:29
浏览 60
已结题

sg90舵机不转,程序有问题吗?

硬件是新买的应该没问题
用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);
    }
}
  • 写回答

1条回答 默认 最新

  • zws164393 2024-10-16 15:36
    关注

    已经解决了,是供电电压的问题,程序是对的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月24日
  • 已采纳回答 10月16日
  • 创建了问题 10月15日